diff --git a/CMakeLists.txt b/CMakeLists.txt index 2e7bbdc..a2cc985 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ include(GNUInstallDirs) set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug;Release;RelWithDebInfo;MinSizeRel;Coverage") -set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD 14) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) @@ -164,7 +164,7 @@ include_directories( libs/libevents libs/mavlink/include/mavlink/v2.0 - libs/mavlink/include/mavlink/v2.0/all + libs/mavlink/include/mavlink/v2.0/ardupilotmega libs/mavlink/include/mavlink/v2.0/common libs/shapelib @@ -178,6 +178,8 @@ set(QGC_RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/qgcresources.qrc ${CMAKE_CURRENT_SOURCE_DIR}/qgroundcontrol.qrc ${CMAKE_CURRENT_SOURCE_DIR}/resources/InstrumentValueIcons/InstrumentValueIcons.qrc + ${CMAKE_CURRENT_SOURCE_DIR}/src/Airmap/airmap.qrc + ${CMAKE_CURRENT_SOURCE_DIR}/src/Airmap/dummy/airmap_dummy.qrc ${CMAKE_CURRENT_SOURCE_DIR}/src/FirmwarePlugin/APM/APMResources.qrc ${CMAKE_CURRENT_SOURCE_DIR}/src/FirmwarePlugin/PX4/PX4Resources.qrc ${CMAKE_CURRENT_SOURCE_DIR}/VideoReceiverApp/qml.qrc diff --git a/QGCCommon.pri b/QGCCommon.pri index f39686c..d45af61 100644 --- a/QGCCommon.pri +++ b/QGCCommon.pri @@ -20,7 +20,9 @@ CONFIG -= debug_and_release CONFIG += warn_on CONFIG += resources_big CONFIG += c++17 - + +DEFINES += DISABLE_AIRMAP # AIRMAP SDK does not exist anymore + linux { linux-g++ | linux-g++-64 | linux-g++-32 | linux-clang { message("Linux build") @@ -107,21 +109,19 @@ linux { QMAKE_CXXFLAGS += -fvisibility=hidden QMAKE_CXXFLAGS_WARN_ON += -Werror \ -Wno-unused-parameter \ # gst-plugins-good - -Wno-unused-but-set-variable \ # eigen & QGCTileCacheWorker.cpp -Wno-deprecated-declarations # eigen } else { error("Unsupported Mac toolchain, only 64-bit LLVM+clang is supported") } } else : ios { message("iOS build") - CONFIG += iOSBuild MobileBuild app_bundle + CONFIG += iOSBuild MobileBuild app_bundle NoSerialBuild CONFIG -= bitcode DEFINES += __ios__ DEFINES += QGC_NO_GOOGLE_MAPS DEFINES += NO_SERIAL_LINK DEFINES += QGC_DISABLE_UVC DEFINES += QGC_GST_TAISYNC_ENABLED - DEFINES += NO_SERIAL_LINK QMAKE_IOS_DEPLOYMENT_TARGET = 11.0 QMAKE_APPLE_TARGETED_DEVICE_FAMILY = 1,2 # Universal QMAKE_LFLAGS += -Wl,-no_pie @@ -143,10 +143,6 @@ linux|macx|ios { } } -contains(DEFINES, NO_SERIAL_LINK) { - message("Serial port support disabled") -} - !MacBuild:!AndroidBuild { # See QGCPostLinkCommon.pri for details on why MacBuild doesn't use DESTDIR DESTDIR = staging @@ -199,8 +195,6 @@ exists ($$PWD/.git) { DEFINES += APP_VERSION_STR=\"\\\"$$APP_VERSION_STR\\\"\" AndroidBuild { - QGC_ANDROID_PACKAGE = org.mavlink.qgroundcontrol - message(VERSION $${VERSION}) MAJOR_VERSION = $$section(VERSION, ".", 0, 0) MINOR_VERSION = $$section(VERSION, ".", 1, 1) diff --git a/QGCExternalLibs.pri b/QGCExternalLibs.pri index ace9afc..e2a2307 100644 --- a/QGCExternalLibs.pri +++ b/QGCExternalLibs.pri @@ -54,8 +54,7 @@ isEmpty(MAVLINK_CONF) { MAVLINK_CONF = $$fromfile(user_config.pri, MAVLINK_CONF) message($$sprintf("Using user-supplied mavlink dialect '%1' specified in user_config.pri", $$MAVLINK_CONF)) } else { - MAVLINK_CONF = all - message($$sprintf("Using MAVLink dialect '%1'.", $$MAVLINK_CONF)) + MAVLINK_CONF = ardupilotmega } } @@ -68,18 +67,32 @@ contains (CONFIG, QGC_DISABLE_APM_MAVLINK) { CONFIG += ArdupilotEnabled } +# First we select the dialect, checking for valid user selection +# Users can override all other settings by specifying MAVLINK_CONF as an argument to qmake +!isEmpty(MAVLINK_CONF) { + message($$sprintf("Using MAVLink dialect '%1'.", $$MAVLINK_CONF)) +} + # Then we add the proper include paths dependent on the dialect. INCLUDEPATH += $$MAVLINKPATH -count(MAVLINK_CONF, 1) { - exists($$MAVLINKPATH/$$MAVLINK_CONF) { - INCLUDEPATH += $$MAVLINKPATH/$$MAVLINK_CONF - DEFINES += $$sprintf('QGC_USE_%1_MESSAGES', $$upper($$MAVLINK_CONF)) +exists($$MAVLINKPATH/common) { + !isEmpty(MAVLINK_CONF) { + count(MAVLINK_CONF, 1) { + exists($$MAVLINKPATH/$$MAVLINK_CONF) { + INCLUDEPATH += $$MAVLINKPATH/$$MAVLINK_CONF + DEFINES += $$sprintf('QGC_USE_%1_MESSAGES', $$upper($$MAVLINK_CONF)) + } else { + error($$sprintf("MAVLink dialect '%1' does not exist at '%2'!", $$MAVLINK_CONF, $$MAVLINKPATH_REL)) + } + } else { + error(Only a single mavlink dialect can be specified in MAVLINK_CONF) + } } else { - error($$sprintf("MAVLink dialect '%1' does not exist at '%2'!", $$MAVLINK_CONF, $$MAVLINKPATH_REL)) + INCLUDEPATH += $$MAVLINKPATH/common } } else { - error(Only a single mavlink dialect can be specified in MAVLINK_CONF) + error($$sprintf("MAVLink folder does not exist at '%1'! Run 'git submodule init && git submodule update' on the command line.",$$MAVLINKPATH_REL)) } # @@ -92,13 +105,11 @@ DEFINES += NOMINMAX # [REQUIRED] Events submodule HEADERS+= \ libs/libevents/libevents/libs/cpp/protocol/receive.h \ - libs/libevents/libevents/libs/cpp/parse/health_and_arming_checks.h \ libs/libevents/libevents/libs/cpp/parse/parser.h \ libs/libevents/libevents/libs/cpp/generated/events_generated.h \ libs/libevents/libevents_definitions.h SOURCES += \ libs/libevents/libevents/libs/cpp/protocol/receive.cpp \ - libs/libevents/libevents/libs/cpp/parse/health_and_arming_checks.cpp \ libs/libevents/libevents/libs/cpp/parse/parser.cpp \ libs/libevents/definitions.cpp INCLUDEPATH += \ @@ -213,9 +224,9 @@ MacBuild { # Include Android OpenSSL libs AndroidBuild { include($$SOURCE_DIR/libs/OpenSSL/android_openssl/openssl.pri) - #message("ANDROID_EXTRA_LIBS") - #message($$ANDROID_TARGET_ARCH) - #message($$ANDROID_EXTRA_LIBS) + message("ANDROID_EXTRA_LIBS") + message($$ANDROID_TARGET_ARCH) + message($$ANDROID_EXTRA_LIBS) } # Pairing @@ -264,3 +275,54 @@ contains (DEFINES, DISABLE_ZEROCONF) { } else { message("Skipping support for Zeroconf (unsupported platform)") } + +# +# [OPTIONAL] AirMap Support +# +contains (DEFINES, DISABLE_AIRMAP) { + message("Skipping support for AirMap (manual override from command line)") +# Otherwise the user can still disable this feature in the user_config.pri file. +} else:exists(user_config.pri):infile(user_config.pri, DEFINES, DISABLE_AIRMAP) { + message("Skipping support for AirMap (manual override from user_config.pri)") +} else { + AIRMAP_PLATFORM_SDK_PATH = $${OUT_PWD}/libs/airmap-platform-sdk + AIRMAP_QT_PATH = Qt.$${QT_MAJOR_VERSION}.$${QT_MINOR_VERSION} + message("Including support for AirMap") + MacBuild { + exists("$${AIRMAPD_PATH}/macOS/$$AIRMAP_QT_PATH") { + message("Including support for AirMap for macOS") + LIBS += -L$${AIRMAPD_PATH}/macOS/$$AIRMAP_QT_PATH -lairmap-qt + DEFINES += QGC_AIRMAP_ENABLED + } + } else:LinuxBuild { + #-- Download and install platform-sdk libs and headers iff they're not already in the build directory + AIRMAP_PLATFORM_SDK_URL = "https://github.com/airmap/platform-sdk/releases/download/2.0/airmap-platform-sdk-2.0.0-Linux.deb" + AIRMAP_PLATFORM_SDK_FILEPATH = "$${OUT_PWD}/airmap-platform-sdk.deb" + AIRMAP_PLATFORM_SDK_INSTALL_DIR = "tmp" + + airmap_platform_sdk_install.target = $${AIRMAP_PLATFORM_SDK_PATH}/include/airmap + airmap_platform_sdk_install.commands = \ + rm -rf $${AIRMAP_PLATFORM_SDK_PATH} && \ + mkdir -p "$${AIRMAP_PLATFORM_SDK_PATH}/linux/$${AIRMAP_QT_PATH}" && \ + mkdir -p "$${AIRMAP_PLATFORM_SDK_PATH}/include/airmap" && \ + mkdir -p "$${AIRMAP_PLATFORM_SDK_PATH}/$${AIRMAP_PLATFORM_SDK_INSTALL_DIR}" && \ + curl --location --output "$${AIRMAP_PLATFORM_SDK_FILEPATH}" "$${AIRMAP_PLATFORM_SDK_URL}" && \ + ar p "$${AIRMAP_PLATFORM_SDK_FILEPATH}" data.tar.gz | tar xvz -C "$${AIRMAP_PLATFORM_SDK_PATH}/$${AIRMAP_PLATFORM_SDK_INSTALL_DIR}/" --strip-components=1 && \ + mv -u "$${AIRMAP_PLATFORM_SDK_PATH}/$${AIRMAP_PLATFORM_SDK_INSTALL_DIR}/usr/lib/x86_64-linux-gnu/*" "$${AIRMAP_PLATFORM_SDK_PATH}/linux/$${AIRMAP_QT_PATH}/" && \ + mv -u "$${AIRMAP_PLATFORM_SDK_PATH}/$${AIRMAP_PLATFORM_SDK_INSTALL_DIR}/usr/include/airmap/*" "$${AIRMAP_PLATFORM_SDK_PATH}/include/airmap/" && \ + rm -rf "$${AIRMAP_PLATFORM_SDK_PATH}/$${AIRMAP_PLATFORM_SDK_INSTALL_DIR}" && \ + rm "$${AIRMAP_PLATFORM_SDK_FILEPATH}" + airmap_platform_sdk_install.depends = + QMAKE_EXTRA_TARGETS += airmap_platform_sdk_install + PRE_TARGETDEPS += $$airmap_platform_sdk_install.target + + LIBS += -L$${AIRMAP_PLATFORM_SDK_PATH}/linux/$${AIRMAP_QT_PATH} -lairmap-cpp + DEFINES += QGC_AIRMAP_ENABLED + } else { + message("Skipping support for Airmap (unsupported platform)") + } + contains (DEFINES, QGC_AIRMAP_ENABLED) { + INCLUDEPATH += \ + $${AIRMAP_PLATFORM_SDK_PATH}/include + } +} diff --git a/QGCPostLinkCommon.pri b/QGCPostLinkCommon.pri index 4ad6b57..4816d61 100644 --- a/QGCPostLinkCommon.pri +++ b/QGCPostLinkCommon.pri @@ -25,12 +25,22 @@ MacBuild { # with the differences between post list command running in a shell script (XCode) versus a makefile (Qt Creator) macx-xcode { # SDL2 Framework - QMAKE_POST_LINK += && rsync -a --delete $$SOURCE_DIR/libs/Frameworks/SDL2.framework $BUILT_PRODUCTS_DIR/$${TARGET}.app/Contents/Frameworks + QMAKE_POST_LINK += && rsync -a --delete $$SOURCE_DIR/libs/Frameworks/SDL2.Framework $BUILT_PRODUCTS_DIR/$${TARGET}.app/Contents/Frameworks QMAKE_POST_LINK += && install_name_tool -change "@rpath/SDL2.framework/Versions/A/SDL2" "@executable_path/../Frameworks/SDL2.framework/Versions/A/SDL2" $BUILT_PRODUCTS_DIR/$${TARGET}.app/Contents/MacOS/$${TARGET} + # AirMap + contains (DEFINES, QGC_AIRMAP_ENABLED) { + QMAKE_POST_LINK += && rsync -a $$SOURCE_DIR/libs/airmapd/macOS/$$AIRMAP_QT_PATH/* $BUILT_PRODUCTS_DIR/$${TARGET}.app/Contents/Frameworks/ + QMAKE_POST_LINK += && install_name_tool -change "@rpath/libairmap-qt.0.0.1.dylib" "@executable_path/../Frameworks/libairmap-qt.0.0.1.dylib" $BUILT_PRODUCTS_DIR/$${TARGET}.app/Contents/MacOS/$${TARGET} + } } else { # SDL2 Framework - QMAKE_POST_LINK += && rsync -a --delete $$SOURCE_DIR/libs/Frameworks/SDL2.framework $${TARGET}.app/Contents/Frameworks + QMAKE_POST_LINK += && rsync -a --delete $$SOURCE_DIR/libs/Frameworks/SDL2.Framework $${TARGET}.app/Contents/Frameworks QMAKE_POST_LINK += && install_name_tool -change "@rpath/SDL2.framework/Versions/A/SDL2" "@executable_path/../Frameworks/SDL2.framework/Versions/A/SDL2" $${TARGET}.app/Contents/MacOS/$${TARGET} + # AirMap + contains (DEFINES, QGC_AIRMAP_ENABLED) { + QMAKE_POST_LINK += && rsync -a $$SOURCE_DIR/libs/airmap-platform-sdk/macOS/$$AIRMAP_QT_PATH/* $${TARGET}.app/Contents/Frameworks/ + QMAKE_POST_LINK += && install_name_tool -change "@rpath/libairmap-qt.0.0.1.dylib" "@executable_path/../Frameworks/libairmap-qt.0.0.1.dylib" $${TARGET}.app/Contents/MacOS/$${TARGET} + } } } @@ -54,9 +64,7 @@ WindowsBuild { # Copy Visual Studio DLLs # Note that this is only done for release because the debugging versions of these DLLs cannot be redistributed. QMAKE_POST_LINK += $$escape_expand(\\n) $$QMAKE_COPY \"$$SOURCE_DIR\\libs\\Microsoft\\windows\\msvcp140.dll\" \"$$DESTDIR\" - QMAKE_POST_LINK += $$escape_expand(\\n) $$QMAKE_COPY \"$$SOURCE_DIR\\libs\\Microsoft\\windows\\msvcp140_1.dll\" \"$$DESTDIR\" QMAKE_POST_LINK += $$escape_expand(\\n) $$QMAKE_COPY \"$$SOURCE_DIR\\libs\\Microsoft\\windows\\vcruntime140.dll\" \"$$DESTDIR\" - QMAKE_POST_LINK += $$escape_expand(\\n) $$QMAKE_COPY \"$$SOURCE_DIR\\libs\\Microsoft\\windows\\vcruntime140_1.dll\" \"$$DESTDIR\" } DEPLOY_TARGET = $$shell_quote($$shell_path($$DESTDIR\\$${TARGET}.exe)) @@ -122,9 +130,9 @@ LinuxBuild { libicui18n.so \ libicuuc.so } - # Copy only if non-existing to avoid file timestamp updates + for(QT_LIB, QT_LIB_LIST) { - QMAKE_POST_LINK += && $$QMAKE_COPY -n --dereference $$[QT_INSTALL_LIBS]/$$QT_LIB $$DESTDIR/Qt/libs/ + QMAKE_POST_LINK += && $$QMAKE_COPY --dereference $$[QT_INSTALL_LIBS]/$$QT_LIB $$DESTDIR/Qt/libs/ } # QT_INSTALL_PLUGINS @@ -144,11 +152,16 @@ LinuxBuild { } for(QT_PLUGIN, QT_PLUGIN_LIST) { - QMAKE_POST_LINK += && $$QMAKE_COPY -n --dereference --recursive $$[QT_INSTALL_PLUGINS]/$$QT_PLUGIN $$DESTDIR/Qt/plugins/ + QMAKE_POST_LINK += && $$QMAKE_COPY --dereference --recursive $$[QT_INSTALL_PLUGINS]/$$QT_PLUGIN $$DESTDIR/Qt/plugins/ } # QT_INSTALL_QML - QMAKE_POST_LINK += && $$QMAKE_COPY -n --dereference --recursive $$[QT_INSTALL_QML] $$DESTDIR/Qt/ + QMAKE_POST_LINK += && $$QMAKE_COPY --dereference --recursive $$[QT_INSTALL_QML] $$DESTDIR/Qt/ + + # Airmap + contains (DEFINES, QGC_AIRMAP_ENABLED) { + QMAKE_POST_LINK += && $$QMAKE_COPY $$OUT_PWD/libs/airmap-platform-sdk/linux/$$AIRMAP_QT_PATH/libairmap-cpp.so.2.0.0 $$DESTDIR/Qt/libs/ + } # QGroundControl start script contains (CONFIG, QGC_DISABLE_CUSTOM_BUILD) | !exists($$PWD/custom/custom.pri) { diff --git a/QGCPostLinkInstaller.pri b/QGCPostLinkInstaller.pri index 162f0a3..7c2a0b2 100644 --- a/QGCPostLinkInstaller.pri +++ b/QGCPostLinkInstaller.pri @@ -16,10 +16,10 @@ installer { QMAKE_POST_LINK += && $$dirname(QMAKE_QMAKE)/macdeployqt $${TARGET}.app -appstore-compliant -verbose=1 -qmldir=$${SOURCE_DIR}/src # macdeployqt is missing some relocations once in a while. "Fix" it: - QMAKE_POST_LINK += && rsync -a --delete /Library/Frameworks/GStreamer.framework $${TARGET}.app/Contents/Frameworks + QMAKE_POST_LINK += && cp -R /Library/Frameworks/GStreamer.framework $${TARGET}.app/Contents/Frameworks QMAKE_POST_LINK += && echo libexec QMAKE_POST_LINK += && ln -sf $${TARGET}.app/Contents/Frameworks $${TARGET}.app/Contents/Frameworks/GStreamer.framework/Versions/1.0/libexec/Frameworks - QMAKE_POST_LINK += && install_name_tool -change /Library/Frameworks/GStreamer.framework/Versions/1.0/lib/GStreamer @executable_path/../Frameworks/GStreamer.framework/Versions/1.0/lib/GStreamer $${TARGET}.app/Contents/MacOS/$${TARGET} + QMAKE_POST_LINK += && install_name_tool -change /Library/Frameworks/GStreamer.framework/Versions/1.0/lib/GStreamer @executable_path/../Frameworks/GStreamer.framework/Versions/1.0/lib/GStreamer $${TARGET}.app/Contents/MacOS/QGroundControl QMAKE_POST_LINK += && rm -rf $${TARGET}.app/Contents/Frameworks/GStreamer.framework/Versions/1.0/{bin,etc,share,Headers,include,Commands} QMAKE_POST_LINK += && rm -rf $${TARGET}.app/Contents/Frameworks/GStreamer.framework/Versions/1.0/lib/{*.a,*.la,glib-2.0,gst-validate-launcher,pkgconfig} @@ -34,8 +34,6 @@ installer { QMAKE_POST_LINK += && mkdir -p package QMAKE_POST_LINK += && mkdir -p staging QMAKE_POST_LINK += && rsync -a --delete $${TARGET}.app staging - QMAKE_POST_LINK += && rm -rf /tmp/tmp.dmg - QMAKE_POST_LINK += && rm -rf package/$${TARGET}.dmg QMAKE_POST_LINK += && hdiutil create /tmp/tmp.dmg -ov -volname "$${TARGET}-$${MAC_VERSION}" -fs HFS+ -srcfolder "staging" QMAKE_POST_LINK += && hdiutil convert /tmp/tmp.dmg -format UDBZ -o package/$${TARGET}.dmg QMAKE_POST_LINK += && rm /tmp/tmp.dmg @@ -51,13 +49,10 @@ installer { } AndroidBuild { _ANDROID_KEYSTORE_PASSWORD = $$(ANDROID_KEYSTORE_PASSWORD) - QMAKE_POST_LINK += && mkdir -p package isEmpty(_ANDROID_KEYSTORE_PASSWORD) { - message(Keystore password not available - not signing package) - # This is for builds in forks and PR where the Android keystore password is not available - QMAKE_POST_LINK += && make apk - QMAKE_POST_LINK += && cp android-build/build/outputs/apk/debug/android-build-debug.apk package/QGroundControl$${ANDROID_TRUE_BITNESS}.apk + message(Skipping androiddeployqt since keystore password is not available) } else { + QMAKE_POST_LINK += && mkdir -p package QMAKE_POST_LINK += && make apk_install_target INSTALL_ROOT=android-build QMAKE_POST_LINK += && androiddeployqt --verbose --input android-QGroundControl-deployment-settings.json --output android-build --release --sign $${SOURCE_DIR}/android/android_release.keystore QGCAndroidKeyStore --storepass $$(ANDROID_KEYSTORE_PASSWORD) QMAKE_POST_LINK += && cp android-build/build/outputs/apk/release/android-build-release-signed.apk package/QGroundControl$${ANDROID_TRUE_BITNESS}.apk diff --git a/README.md b/README.md index a914739..3112f0f 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,15 @@ -# QGroundControl Ground Control Station +# Spiri Ground Control Station -[![Releases](https://img.shields.io/github/release/mavlink/QGroundControl.svg)](https://github.com/mavlink/QGroundControl/releases) +[![Releases](https://git.spirirobotics.com/hetongapp/Spiri-App/raw/branch/master/Spiri/resources/images/Spiri-release.svg)](https://git.spirirobotics.com/hetongapp/Spiri-App/releases) +[![Travis Build Status](https://travis-ci.org/mavlink/qgroundcontrol.svg?branch=master)](https://travis-ci.org/mavlink/qgroundcontrol) +[![Appveyor Build Status](https://ci.appveyor.com/api/projects/status/crxcm4qayejuvh6c/branch/master?svg=true)](https://ci.appveyor.com/project/mavlink/qgroundcontrol) -*QGroundControl* (QGC) is an intuitive and powerful ground control station (GCS) for UAVs. -The primary goal of QGC is ease of use for both first time and professional users. -It provides full flight control and mission planning for any MAVLink enabled drone, and vehicle setup for both PX4 and ArduPilot powered UAVs. Instructions for *using QGroundControl* are provided in the [User Manual](https://docs.qgroundcontrol.com/en/) (you may not need them because the UI is very intuitive!) + +*Spiri GroundControl* (SGC) is an intuitive and powerful ground control station (GCS) for UAVs. + +The primary goal of SGC is ease of use for both first time and professional users. +It provides full flight control and mission planning for any MAVLink enabled drone, and vehicle setup for both PX4 and ArduPilot powered UAVs. Instructions for *using Spiri GroundControl* are provided in the [User Manual](https://docs.qgroundcontrol.com/en/) (you may not need them because the UI is very intuitive!) All the code is open-source, so you can contribute and evolve it as you want. The [Developer Guide](https://dev.qgroundcontrol.com/en/) explains how to [build](https://dev.qgroundcontrol.com/en/getting_started/) and extend QGC. @@ -18,3 +22,63 @@ Key Links: * [Discussion/Support](https://docs.qgroundcontrol.com/en/Support/Support.html) * [Contributing](https://dev.qgroundcontrol.com/en/contribute/) * [License](https://github.com/mavlink/qgroundcontrol/blob/master/COPYING.md) + + +# Setup Installation (Windows) + +*Install QT 5.15.2 +* Here is the link and Download: [Website](https://download.qt.io/official_releases/online_installers/) (Windows) +* Setup the environment for QT! + * 1. right click the desktop and click the attribution. + * 2. select the "Advanced System Settings" + * 3. select the "Environment Variables" + * 4. create a new qt system variable(using your own QT install Path) (eg. D:\QT5.15.2\5.15.2\msvc2019_64) + +*Install Spiri QGC +* create a folder in your workspace and name it such as "Spiri" +* git clone https://git.spirirobotics.com/hetongapp/SpiriGroundControl.git +* Then cd to the "Spiri/SpiriGroundControl" and update the repo: "git submodule update --init --recursive". +* Open the "qgroundcontrol.pro" in "Spiri/SpiriGroundControl" folder by using the QT creator +* click "build" and "run" + + +# Setup Installation (MacOS) + +* Install the Xcode in Apple Store +* Install Qt Creator for macOS: [Website](https://info.qt.io/zh-cn/download-qt-for-application-development) +* Create or open a Qt project and check the "iphonesimulator-clang-..." environment in the project configuration page +* create a folder in your workspace and name it such as "Spiri" +* git clone https://git.spirirobotics.com/hetongapp/SpiriGroundControl.git +* Then cd to the "Spiri/SpiriGroundControl" and update the repo: "git submodule update --init --recursive". +* Click the hammer compile button in the lower left corner, after the compilation is successful, you can close Qt Creator. +* After the compilation is complete, there will be an "Info.plist" file in the output folder, open it with Xcode. + + +# Setup Installation (Ubuntu20.04) + +*Install QT 5.15.2 +* Setup the environment for QT! + ```bash + sudo chmod u+x ./Ubuntu_QT_install.sh && source ./Ubuntu_QT_install.sh + ``` +*Install Spiri QGC +* create a folder in your workspace and name it such as "Spiri" +* git clone https://git.spirirobotics.com/Spiri/SpiriGroundControlTest.git +* Then cd to the "Spiri/SpiriGroundControlTest" and update the repo: "git submodule update --init --recursive". +* Open the "qgroundcontrol.pro" in "Spiri/SpiriGroundControlTest" folder by using the QT creator +* click "build" and "run" + + +# Branch naming rules + + * Dev-AndroidAPP-Tong + * Bug-AndroidAPP-Tong + * Rev-AndroidAPP-Tong + + Note: + + * Dev:This branch is for develop + * Bug: This branch is for bug fix + * Rev: This branch is for revision + * Tong:Contributer's name + * AndroidAPP:The general description of this task \ No newline at end of file diff --git a/Spiri/README.md b/Spiri/README.md new file mode 100644 index 0000000..ddb5b54 --- /dev/null +++ b/Spiri/README.md @@ -0,0 +1,69 @@ +# Spiri Ground Control Station + +[![Releases](https://img.shields.io/github/release/mavlink/QGroundControl.svg)](https://git.spirirobotics.com/hetongapp/SpiriGroundControl/releases) +[![Travis Build Status](https://travis-ci.org/mavlink/qgroundcontrol.svg?branch=master)](https://travis-ci.org/mavlink/qgroundcontrol) +[![Appveyor Build Status](https://ci.appveyor.com/api/projects/status/crxcm4qayejuvh6c/branch/master?svg=true)](https://ci.appveyor.com/project/mavlink/qgroundcontrol) + + + +*Spiri GroundControl* (SGC) is an intuitive and powerful ground control station (GCS) for UAVs. + +The primary goal of SGC is ease of use for both first time and professional users. +It provides full flight control and mission planning for any MAVLink enabled drone, and vehicle setup for both PX4 and ArduPilot powered UAVs. Instructions for *using Spiri GroundControl* are provided in the [User Manual](https://docs.qgroundcontrol.com/en/) (you may not need them because the UI is very intuitive!) + +All the code is open-source, so you can contribute and evolve it as you want. +The [Developer Guide](https://dev.qgroundcontrol.com/en/) explains how to [build](https://dev.qgroundcontrol.com/en/getting_started/) and extend QGC. + + +Key Links: +* [Website](http://qgroundcontrol.com) (qgroundcontrol.com) +* [User Manual](https://docs.qgroundcontrol.com/en/) +* [Developer Guide](https://dev.qgroundcontrol.com/en/) +* [Discussion/Support](https://docs.qgroundcontrol.com/en/Support/Support.html) +* [Contributing](https://dev.qgroundcontrol.com/en/contribute/) +* [License](https://github.com/mavlink/qgroundcontrol/blob/master/COPYING.md) + + +# Setup Installation (Windows) + +*Install QT 5.15.2 +* Here is the link and Download: [Website](https://download.qt.io/official_releases/online_installers/) (Windows) +* Setup the environment for QT! + * 1. right click the desktop and click the attribution. + * 2. select the "Advanced System Settings" + * 3. select the "Environment Variables" + * 4. create a new qt system variable(using your own QT install Path) (eg. D:\QT5.15.2\5.15.2\msvc2019_64) + +*Install Spiri QGC +* create a folder in your workspace and name it such as "Spiri" +* git clone https://git.spirirobotics.com/hetongapp/SpiriGroundControl.git +* Then cd to the "Spiri/SpiriGroundControl" and update the repo: "git submodule update --init --recursive". +* Open the "qgroundcontrol.pro" in "Spiri/SpiriGroundControl" folder by using the QT creator +* click "build" and "run" + + +# Setup Installation (MacOS) + +* Install the Xcode in Apple Store +* Install Qt Creator for macOS: [Website](https://info.qt.io/zh-cn/download-qt-for-application-development) +* Create or open a Qt project and check the "iphonesimulator-clang-..." environment in the project configuration page +* create a folder in your workspace and name it such as "Spiri" +* git clone https://git.spirirobotics.com/hetongapp/SpiriGroundControl.git +* Then cd to the "Spiri/SpiriGroundControl" and update the repo: "git submodule update --init --recursive". +* Click the hammer compile button in the lower left corner, after the compilation is successful, you can close Qt Creator. +* After the compilation is complete, there will be an "Info.plist" file in the output folder, open it with Xcode. + + +# Setup Installation (Ubuntu20.04) + +*Install QT 5.15.2 +* Setup the environment for QT! + ```bash + sudo chmod u+x ./Ubuntu_QT_install.sh && source ./Ubuntu_QT_install.sh + ``` +*Install Spiri QGC +* create a folder in your workspace and name it such as "Spiri" +* git clone https://git.spirirobotics.com/Spiri/SpiriGroundControlTest.git +* Then cd to the "Spiri/SpiriGroundControlTest" and update the repo: "git submodule update --init --recursive". +* Open the "qgroundcontrol.pro" in "Spiri/SpiriGroundControlTest" folder by using the QT creator +* click "build" and "run" \ No newline at end of file diff --git a/Spiri/config/.gitkeep b/Spiri/config/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Spiri/data/.gitkeep b/Spiri/data/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Spiri/model/spiri.mesh b/Spiri/model/spiri.mesh new file mode 100644 index 0000000..0137c2e Binary files /dev/null and b/Spiri/model/spiri.mesh differ diff --git a/Spiri/qml/.gitkeep b/Spiri/qml/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Spiri/resources/icon/spiri.ico b/Spiri/resources/icon/spiri.ico new file mode 100644 index 0000000..a6081f6 Binary files /dev/null and b/Spiri/resources/icon/spiri.ico differ diff --git a/Spiri/resources/icon/spiri1.ico b/Spiri/resources/icon/spiri1.ico new file mode 100644 index 0000000..fe7d8b3 Binary files /dev/null and b/Spiri/resources/icon/spiri1.ico differ diff --git a/Spiri/resources/images/Spiri-release.svg b/Spiri/resources/images/Spiri-release.svg new file mode 100644 index 0000000..637f515 --- /dev/null +++ b/Spiri/resources/images/Spiri-release.svg @@ -0,0 +1 @@ +release: v4.2.9releasev1.0.0 \ No newline at end of file diff --git a/Spiri/resources/images/Spiri_black_120.ico b/Spiri/resources/images/Spiri_black_120.ico new file mode 100644 index 0000000..7ab5514 Binary files /dev/null and b/Spiri/resources/images/Spiri_black_120.ico differ diff --git a/Spiri/resources/images/Spiri_black_160.jpg b/Spiri/resources/images/Spiri_black_160.jpg new file mode 100644 index 0000000..2fdf40d Binary files /dev/null and b/Spiri/resources/images/Spiri_black_160.jpg differ diff --git a/Spiri/resources/images/Spiri_black_240.jpg b/Spiri/resources/images/Spiri_black_240.jpg new file mode 100644 index 0000000..0fa449e Binary files /dev/null and b/Spiri/resources/images/Spiri_black_240.jpg differ diff --git a/Spiri/resources/images/Spiri_black_320.jpg b/Spiri/resources/images/Spiri_black_320.jpg new file mode 100644 index 0000000..634568a Binary files /dev/null and b/Spiri/resources/images/Spiri_black_320.jpg differ diff --git a/Spiri/resources/images/Spiri_black_480.jpg b/Spiri/resources/images/Spiri_black_480.jpg new file mode 100644 index 0000000..37c61ac Binary files /dev/null and b/Spiri/resources/images/Spiri_black_480.jpg differ diff --git a/Spiri/resources/images/Spiri_black_640.jpg b/Spiri/resources/images/Spiri_black_640.jpg new file mode 100644 index 0000000..7022b11 Binary files /dev/null and b/Spiri/resources/images/Spiri_black_640.jpg differ diff --git a/Spiri/resources/images/Spiri_black_bl.ico b/Spiri/resources/images/Spiri_black_bl.ico new file mode 100644 index 0000000..cb0f00b Binary files /dev/null and b/Spiri/resources/images/Spiri_black_bl.ico differ diff --git a/Spiri/resources/images/Spiri_black_bl.jpg b/Spiri/resources/images/Spiri_black_bl.jpg new file mode 100644 index 0000000..3d2e37e Binary files /dev/null and b/Spiri/resources/images/Spiri_black_bl.jpg differ diff --git a/Spiri/resources/images/spiri.png b/Spiri/resources/images/spiri.png new file mode 100644 index 0000000..25adf6f Binary files /dev/null and b/Spiri/resources/images/spiri.png differ diff --git a/Spiri/src/.gitkeep b/Spiri/src/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/UnitTest.qrc b/UnitTest.qrc index 0423748..f08de29 100644 --- a/UnitTest.qrc +++ b/UnitTest.qrc @@ -15,10 +15,5 @@ src/MissionManager/UnitTest/PolygonBadXml.kml src/MissionManager/UnitTest/PolygonBadCoordinatesNode.kml src/comm/MockLinkOptionsDlg.qml - src/qgcunittest/TranslationTest.json - src/qgcunittest/TranslationTest_de_DE.ts - - - src/comm/MockLinkOptionsDlg.qml diff --git a/Vagrantfile b/Vagrantfile index a57ab79..4b41ae5 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -1,38 +1,21 @@ # -*- mode: ruby -*- # vi: set ft=ruby : +# if you update this file, please consider updating .travis.yml too + require 'yaml' current_dir = File.dirname(File.expand_path(__FILE__)) configfile = YAML.load_file("#{current_dir}/.vagrantconfig.yml") +travisfile = YAML.load_file("#{current_dir}/.travis.yml") yaml_config = configfile['configs']['dev'] -env_global = [ - 'JOBS=4', - 'SHADOW_BUILD_DIR=/tmp/shadow_build_dir', - 'CODESIGN=nocodesign', -] - -packages = [ - 'build-essential', - 'fuse', - 'git', - 'libgstreamer-plugins-base1.0-dev', - 'libgstreamer1.0-0:amd64', - 'libgstreamer1.0-dev', - 'libsdl2-dev', - 'libudev-dev', - 'speech-dispatcher', - 'wget' -] - - Vagrant.configure(2) do |config| # This trick is used to prefer a VM box over docker config.vm.provider "virtualbox" config.vm.provider "vmware_fusion" - config.vm.box = "ubuntu/jammy64" + config.vm.box = "ubuntu/bionic64" config.vm.provider :docker do |docker, override| override.vm.box = "tknerr/baseimage-ubuntu-16.04" end @@ -81,8 +64,6 @@ Vagrant.configure(2) do |config| apt-get install -y python3-pip su - vagrant -c "pip3 install --user aqtinstall" - apt-get install -y patchelf - dir="%{qt_deps_unpack_dir}" version="5.15.2" host="linux" @@ -92,8 +73,6 @@ Vagrant.configure(2) do |config| su - vagrant -c "mkdir -p ${dir}" su - vagrant -c "python3 -m aqt install-qt -O ${dir} ${host} ${target} ${version} -m ${modules}" - mkdir -p /vagrant/shadow-build - # write out a pair of scripts to make rebuilding on the VM easy: su - vagrant -c "cat <do-qmake.sh #!/bin/bash @@ -122,10 +101,6 @@ MAKE " su - vagrant -c "chmod +x do-qmake.sh do-make.sh" - # increase the allowed number of open files (the link step takes a - # lot of open filehandles!): -echo '* soft nofile 2048' >/etc/security/limits.d/fileno.conf - # now run the scripts: su - vagrant -c ./do-qmake.sh su - vagrant -c ./do-make.sh @@ -137,8 +112,8 @@ echo '* soft nofile 2048' >/etc/security/limits.d/file :qt_deps_tarball => yaml_config['qt_deps_tarball'], :pro => yaml_config['pro'], :spec => yaml_config['spec'], - :apt_pkgs => (packages).join(' '), - :build_env => env_global.select { |item| item.is_a?(String) }.join(' '), + :apt_pkgs => (travisfile['addons']['apt']['packages']+['git', 'build-essential', 'fuse', 'libsdl2-dev']).join(' '), + :build_env => travisfile['env']['global'].select { |item| item.is_a?(String) }.join(' '), :project_root_dir => yaml_config['project_root_dir'], :qt_deps_unpack_parent_dir => yaml_config['qt_deps_unpack_parent_dir'], diff --git a/android.pri b/android.pri index 43dbbf9..3965065 100644 --- a/android.pri +++ b/android.pri @@ -1,71 +1,24 @@ +include($$PWD/libs/qtandroidserialport/src/qtandroidserialport.pri) +message("Adding Serial Java Classes") QT += androidextras -include($$PWD/libs/qtandroidserialport/src/qtandroidserialport.pri) +ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android -ANDROID_PACKAGE_SOURCE_DIR = $$OUT_PWD/ANDROID_PACKAGE_SOURCE_DIR # Tells Qt location of package files for build -ANDROID_PACKAGE_QGC_SOURCE_DIR = $$PWD/android # Original location of QGC package files -ANDROID_PACKAGE_CUSTOM_SOURCE_DIR = $$PWD/custom/android # Original location for custom build override package files +exists($$PWD/custom/android) { + message("Merging $$PWD/custom/android/ -> $$PWD/android/") -# We always move the package files to the ANDROID_PACKAGE_SOURCE_DIR build dir so we can modify the manifest as needed + ANDROID_PACKAGE_SOURCE_DIR = $$OUT_PWD/ANDROID_PACKAGE_SOURCE_DIR + android_source_dir_target.target = android_source_dir + PRE_TARGETDEPS += $$android_source_dir_target.target + QMAKE_EXTRA_TARGETS += android_source_dir_target -android_source_dir_target.target = $$ANDROID_PACKAGE_SOURCE_DIR/AndroidManifest.xml -android_source_dir_target.commands = \ - $$QMAKE_MKDIR $$ANDROID_PACKAGE_SOURCE_DIR && \ - $$QMAKE_COPY_DIR $$ANDROID_PACKAGE_QGC_SOURCE_DIR/* $$ANDROID_PACKAGE_SOURCE_DIR -PRE_TARGETDEPS += $$android_source_dir_target.target -QMAKE_EXTRA_TARGETS += android_source_dir_target -exists($$ANDROID_PACKAGE_CUSTOM_SOURCE_DIR/AndroidManifest.xml) { - android_source_dir_target.depends = $$ANDROID_PACKAGE_CUSTOM_SOURCE_DIR/AndroidManifest.xml -} else { - android_source_dir_target.depends = $$ANDROID_PACKAGE_QGC_SOURCE_DIR/AndroidManifest.xml + android_source_dir_target.commands = $$QMAKE_MKDIR $$ANDROID_PACKAGE_SOURCE_DIR && \ + $$QMAKE_COPY_DIR $$PWD/android/* $$OUT_PWD/ANDROID_PACKAGE_SOURCE_DIR && \ + $$QMAKE_COPY_DIR $$PWD/custom/android/* $$OUT_PWD/ANDROID_PACKAGE_SOURCE_DIR && \ + $$QMAKE_STREAM_EDITOR -i \"s/package=\\\"org.mavlink.spiri\\\"/package=\\\"$$QGC_ANDROID_PACKAGE\\\"/\" $$ANDROID_PACKAGE_SOURCE_DIR/AndroidManifest.xml + android_source_dir_target.depends = FORCE } -# Custom builds can override android package file - -exists($$ANDROID_PACKAGE_CUSTOM_SOURCE_DIR) { - message("Merging$$ $$ANDROID_PACKAGE_QGC_SOURCE_DIR and $$ANDROID_PACKAGE_CUSTOM_SOURCE_DIR to $$ANDROID_PACKAGE_SOURCE_DIR") - - android_source_dir_target.commands = $$android_source_dir_target.commands && \ - $$QMAKE_COPY_DIR $$ANDROID_PACKAGE_CUSTOM_SOURCE_DIR/* $$ANDROID_PACKAGE_SOURCE_DIR && \ - $$QMAKE_STREAM_EDITOR -i \"s/package=\\\"org.mavlink.qgroundcontrol\\\"/package=\\\"$$QGC_ANDROID_PACKAGE\\\"/\" $$ANDROID_PACKAGE_SOURCE_DIR/AndroidManifest.xml -} - -# Insert package name into manifest file - -android_source_dir_target.commands = $$android_source_dir_target.commands && \ - $$QMAKE_STREAM_EDITOR -i \"s/%%QGC_INSERT_PACKAGE_NAME%%/$$QGC_ANDROID_PACKAGE/\" $$ANDROID_PACKAGE_SOURCE_DIR/AndroidManifest.xml - -# Update manifest activity intent filter as needed - -QGC_INSERT_ACTIVITY_INTENT_FILTER = "" -AndroidHomeApp { - # QGC is the android home application - QGC_INSERT_ACTIVITY_INTENT_FILTER = $$QGC_INSERT_ACTIVITY_INTENT_FILTER "\r\n\r\n" -} -!contains(DEFINES, NO_SERIAL_LINK) { - # Add usb device support - QGC_INSERT_ACTIVITY_INTENT_FILTER = $$QGC_INSERT_ACTIVITY_INTENT_FILTER "\r\n\r\n\r\n" -} -contains(DEFINES, QGC_ENABLE_BLUETOOTH) { - QGC_INSERT_ACTIVITY_INTENT_FILTER = $$QGC_INSERT_ACTIVITY_INTENT_FILTER "\r\n\r\n" -} -android_source_dir_target.commands = $$android_source_dir_target.commands && \ - $$QMAKE_STREAM_EDITOR -i \"s//$$QGC_INSERT_ACTIVITY_INTENT_FILTER/\" $$ANDROID_PACKAGE_SOURCE_DIR/AndroidManifest.xml - -# Update manifest activity meta data as needed - -contains(DEFINES, NO_SERIAL_LINK) { - # No need to add anything to manifest - android_source_dir_target.commands = $$android_source_dir_target.commands && \ - $$QMAKE_STREAM_EDITOR -i \"s///\" $$ANDROID_PACKAGE_SOURCE_DIR/AndroidManifest.xml -} else { - # Updates the manifest for usb device support - android_source_dir_target.commands = $$android_source_dir_target.commands && \ - $$QMAKE_STREAM_EDITOR -i \"s//\r\n\r\n/\" $$ANDROID_PACKAGE_SOURCE_DIR/AndroidManifest.xml -} - -# OTHER_FILES makes the specified files be visible in Qt Creator for editing - exists($$PWD/custom/android/AndroidManifest.xml) { OTHER_FILES += \ $$PWD/custom/android/AndroidManifest.xml @@ -92,6 +45,7 @@ OTHER_FILES += \ $$PWD/android/src/org/freedesktop/gstreamer/androidmedia/GstAhsCallback.java \ $$PWD/android/src/org/freedesktop/gstreamer/androidmedia/GstAmcOnFrameAvailableListener.java + DISTFILES += \ $$PWD/android/gradle/wrapper/gradle-wrapper.jar \ $$PWD/android/gradlew \ @@ -99,12 +53,3 @@ DISTFILES += \ $$PWD/android/build.gradle \ $$PWD/android/gradle/wrapper/gradle-wrapper.properties \ $$PWD/android/gradlew.bat - -SOURCES += \ - $$PWD/android/src/AndroidInterface.cc - -HEADERS += \ - $$PWD/android/src/AndroidInterface.h - -INCLUDEPATH += \ - $$PWD/android/src diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 15c35bc..7fc431b 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -1,5 +1,5 @@ - - + + @@ -14,12 +14,15 @@ - - + + + + + - - - + + + @@ -95,10 +98,9 @@ - + - diff --git a/android/res/drawable-hdpi/icon.png b/android/res/drawable-hdpi/icon.png index f6323cd..490d9ac 100644 Binary files a/android/res/drawable-hdpi/icon.png and b/android/res/drawable-hdpi/icon.png differ diff --git a/android/res/drawable-ldpi/icon.png b/android/res/drawable-ldpi/icon.png index 8676e65..b6dc758 100644 Binary files a/android/res/drawable-ldpi/icon.png and b/android/res/drawable-ldpi/icon.png differ diff --git a/android/res/drawable-mdpi/icon.png b/android/res/drawable-mdpi/icon.png index c1c7603..df8efcb 100644 Binary files a/android/res/drawable-mdpi/icon.png and b/android/res/drawable-mdpi/icon.png differ diff --git a/android/res/drawable-xhdpi/icon.png b/android/res/drawable-xhdpi/icon.png index 58a1454..34c3d76 100644 Binary files a/android/res/drawable-xhdpi/icon.png and b/android/res/drawable-xhdpi/icon.png differ diff --git a/android/res/drawable-xxhdpi/icon.png b/android/res/drawable-xxhdpi/icon.png index f74d76f..39e7e39 100644 Binary files a/android/res/drawable-xxhdpi/icon.png and b/android/res/drawable-xxhdpi/icon.png differ diff --git a/android/res/drawable-xxxhdpi/icon.png b/android/res/drawable-xxxhdpi/icon.png index f74d76f..c251bc9 100644 Binary files a/android/res/drawable-xxxhdpi/icon.png and b/android/res/drawable-xxxhdpi/icon.png differ diff --git a/android/src/AndroidInterface.cc b/android/src/AndroidInterface.cc deleted file mode 100644 index cd8afdc..0000000 --- a/android/src/AndroidInterface.cc +++ /dev/null @@ -1,36 +0,0 @@ -/**************************************************************************** - * - * Copyright (C) 2018 Pinecone Inc. All rights reserved. - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -#include -#include -#include "QGCApplication.h" -#include "AndroidInterface.h" -#include -#include - -QString AndroidInterface::getSDCardPath() -{ - QAndroidJniObject value = QAndroidJniObject::callStaticObjectMethod("org/mavlink/qgroundcontrol/QGCActivity", "getSDCardPath", - "()Ljava/lang/String;"); - QString sdCardPath = value.toString(); - - QString readPermission("android.permission.READ_EXTERNAL_STORAGE"); - QString writePermission("android.permission.WRITE_EXTERNAL_STORAGE"); - - if (QtAndroid::checkPermission(readPermission) == QtAndroid::PermissionResult::Denied || - QtAndroid::checkPermission(writePermission) == QtAndroid::PermissionResult::Denied) { - QtAndroid::PermissionResultMap resultHash = QtAndroid::requestPermissionsSync(QStringList({ readPermission, writePermission })); - if (resultHash[readPermission] == QtAndroid::PermissionResult::Denied || - resultHash[writePermission] == QtAndroid::PermissionResult::Denied) { - return QString(); - } - } - - return sdCardPath; -} diff --git a/android/src/org/mavlink/qgroundcontrol/QGCActivity.java b/android/src/org/mavlink/qgroundcontrol/QGCActivity.java index c46192b..14fb760 100644 --- a/android/src/org/mavlink/qgroundcontrol/QGCActivity.java +++ b/android/src/org/mavlink/qgroundcontrol/QGCActivity.java @@ -38,7 +38,6 @@ import java.util.concurrent.Executors; import java.util.Timer; import java.util.TimerTask; import java.io.IOException; -import java.lang.reflect.Method; import android.app.Activity; import android.app.PendingIntent; @@ -59,8 +58,6 @@ import android.app.PendingIntent; import android.view.WindowManager; import android.os.Bundle; import android.bluetooth.BluetoothDevice; -import android.os.storage.StorageManager; -import android.os.storage.StorageVolume; import com.hoho.android.usbserial.driver.*; import org.qtproject.qt5.android.bindings.QtActivity; @@ -765,34 +762,5 @@ public class QGCActivity extends QtActivity } }).start(); } - - public static String getSDCardPath() { - StorageManager storageManager = (StorageManager)_instance.getSystemService(Activity.STORAGE_SERVICE); - List volumes = storageManager.getStorageVolumes(); - Method mMethodGetPath; - String path = ""; - for (StorageVolume vol : volumes) { - try { - mMethodGetPath = vol.getClass().getMethod("getPath"); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - continue; - } - try { - path = (String) mMethodGetPath.invoke(vol); - } catch (Exception e) { - e.printStackTrace(); - continue; - } - - if (vol.isRemovable() == true) { - Log.i(TAG, "removable sd card mounted " + path); - return path; - } else { - Log.i(TAG, "storage mounted " + path); - } - } - return ""; - } } diff --git a/backup-Jenkinsfile b/backup-Jenkinsfile new file mode 100644 index 0000000..54d9f38 --- /dev/null +++ b/backup-Jenkinsfile @@ -0,0 +1,345 @@ +pipeline { + agent none + stages { + + stage('build') { + parallel { + + stage('Android 32 bit Release') { + environment { + CCACHE_BASEDIR = "${env.WORKSPACE}" + CCACHE_CPP2 = '1' + QGC_CONFIG = 'release' + QMAKE_VER = "5.12.5/android_armv7/bin/qmake" + QT_MKSPEC = "android-clang" + BITNESS=32 + } + agent { + docker { + image 'mavlink/qgc-build-android:2019-11-12' + args '-v ${CCACHE_DIR}:${CCACHE_DIR}:rw' + } + } + steps { + sh 'export' + sh 'ccache -z' + sh 'git submodule deinit -f .' + sh 'git clean -ff -x -d .' + sh 'git submodule update --init --recursive --force' + sh 'mkdir build; cd build; ${QT_PATH}/${QMAKE_VER} -r ${WORKSPACE}/qgroundcontrol.pro CONFIG+=${QGC_CONFIG} CONFIG+=WarningsAsErrorsOn' + sh 'cd build; make -j`nproc --all`' + sh 'ccache -s' + } + post { + cleanup { + sh 'git clean -ff -x -d .' + } + } + } + + stage('Android 64 bit Release') { + environment { + CCACHE_BASEDIR = "${env.WORKSPACE}" + CCACHE_CPP2 = '1' + QGC_CONFIG = 'release' + QMAKE_VER = "5.12.5/android_arm64_v8a/bin/qmake" + QT_MKSPEC = "android-clang" + BITNESS=64 + } + agent { + docker { + image 'mavlink/qgc-build-android_arm64_v8a:2019-11-12' + args '-v ${CCACHE_DIR}:${CCACHE_DIR}:rw' + } + } + steps { + sh 'export' + sh 'ccache -z' + sh 'git submodule deinit -f .' + sh 'git clean -ff -x -d .' + sh 'git submodule update --init --recursive --force' + sh 'mkdir build; cd build; ${QT_PATH}/${QMAKE_VER} -r ${WORKSPACE}/qgroundcontrol.pro CONFIG+=${QGC_CONFIG} CONFIG+=WarningsAsErrorsOn' + //sh 'cd build; make -j`nproc --all`' // FIXME + sh 'ccache -s' + } + post { + cleanup { + sh 'git clean -ff -x -d .' + } + } + } + + stage('Linux Debug') { + environment { + CCACHE_BASEDIR = "${env.WORKSPACE}" + QGC_CONFIG = 'debug' + QMAKE_VER = "5.12.5/gcc_64/bin/qmake" + } + agent { + docker { + image 'mavlink/qgc-build-linux:2019-11-12' + args '-v ${CCACHE_DIR}:${CCACHE_DIR}:rw' + } + } + steps { + sh 'export' + sh 'ccache -z' + sh 'git submodule deinit -f .' + sh 'git clean -ff -x -d .' + sh 'git submodule update --init --recursive --force' + sh 'mkdir build; cd build; ${QT_PATH}/${QMAKE_VER} -r ${WORKSPACE}/qgroundcontrol.pro CONFIG+=${QGC_CONFIG} CONFIG+=WarningsAsErrorsOn' + sh 'cd build; make -j`nproc --all`' + sh 'ccache -s' + } + post { + cleanup { + sh 'git clean -ff -x -d .' + } + } + } + + stage('Linux Debug (cmake)') { + environment { + CCACHE_BASEDIR = "${env.WORKSPACE}" + CMAKE_BUILD_TYPE = 'Debug' + QT_VERSION = "5.12.5" + QT_MKSPEC = "gcc_64" + } + agent { + docker { + image 'mavlink/qgc-build-linux:2019-11-12' + args '-v ${CCACHE_DIR}:${CCACHE_DIR}:rw' + } + } + steps { + sh 'export' + sh 'ccache -z' + sh 'make distclean' + sh 'make submodulesclean' + sh 'make linux' + //sh 'make linux check' // TODO: needs Xvfb or similar + sh 'ccache -s' + sh 'make distclean' + } + post { + cleanup { + sh 'git clean -ff -x -d .' + } + } + } + + stage('Linux Release') { + environment { + CCACHE_BASEDIR = "${env.WORKSPACE}" + QGC_CONFIG = 'release' + QMAKE_VER = "5.12.5/gcc_64/bin/qmake" + } + agent { + docker { + image 'mavlink/qgc-build-linux:2019-11-12' + args '-v ${CCACHE_DIR}:${CCACHE_DIR}:rw' + } + } + steps { + sh 'export' + sh 'ccache -z' + sh 'git submodule deinit -f .' + sh 'git clean -ff -x -d .' + sh 'git submodule update --init --recursive --force' + withCredentials([file(credentialsId: 'QGC_Airmap_api_key', variable: 'AIRMAP_API_HEADER')]) { + sh 'cp $AIRMAP_API_HEADER ${WORKSPACE}/src/Airmap/Airmap_api_key.h' + } + sh 'mkdir build; cd build; ${QT_PATH}/${QMAKE_VER} -r ${WORKSPACE}/qgroundcontrol.pro CONFIG+=${QGC_CONFIG} CONFIG+=WarningsAsErrorsOn' + //sh 'cd build; make -j`nproc --all`' // TODO: increase slave memory + sh 'cd build; make' + sh 'ccache -s' + } + post { + cleanup { + sh 'git clean -ff -x -d .' + } + } + } + + stage('Linux Release (cmake)') { + environment { + CCACHE_BASEDIR = "${env.WORKSPACE}" + CMAKE_BUILD_TYPE = 'Release' + QT_VERSION = "5.12.5" + QT_MKSPEC = "gcc_64" + } + agent { + docker { + image 'mavlink/qgc-build-linux:2019-11-12' + args '-v ${CCACHE_DIR}:${CCACHE_DIR}:rw' + } + } + steps { + sh 'export' + sh 'ccache -z' + sh 'make distclean' + sh 'make submodulesclean' + sh 'make linux' + sh 'ccache -s' + sh 'make distclean' + } + post { + cleanup { + sh 'git clean -ff -x -d .' + } + } + } + + stage('OSX Debug') { + agent { + node { + label 'mac' + } + } + environment { + CCACHE_BASEDIR = "${env.WORKSPACE}" + QGC_CONFIG = 'debug' + QMAKE_VER = "5.11.0/clang_64/bin/qmake" + } + steps { + sh 'export' + sh 'ccache -z' + sh 'git submodule deinit -f .' + sh 'git clean -ff -x -d .' + sh 'git submodule update --init --recursive --force' + sh 'mkdir build; cd build; ${QT_PATH}/${QMAKE_VER} -r ${WORKSPACE}/qgroundcontrol.pro CONFIG+=${QGC_CONFIG} CONFIG+=WarningsAsErrorsOn' + sh 'cd build; make -j`sysctl -n hw.ncpu`' + sh 'ccache -s' + } + post { + cleanup { + sh 'git clean -ff -x -d .' + } + } + } + + stage('OSX Debug (cmake)') { + agent { + node { + label 'mac' + } + } + environment { + CCACHE_BASEDIR = "${env.WORKSPACE}" + CCACHE_CPP2 = '1' + CMAKE_BUILD_TYPE = 'Debug' + QT_VERSION = "5.11.0" + QT_MKSPEC = "clang_64" + } + steps { + sh 'export' + sh 'ccache -z' + sh 'make distclean' + sh 'make submodulesclean' + sh 'make mac' + sh 'ccache -s' + sh 'make distclean' + } + post { + cleanup { + sh 'git clean -ff -x -d .' + } + } + } + + stage('OSX Release') { + agent { + node { + label 'mac' + } + } + environment { + CCACHE_BASEDIR = "${env.WORKSPACE}" + CCACHE_CPP2 = '1' + QGC_CONFIG = 'installer' + QMAKE_VER = "5.11.0/clang_64/bin/qmake" + } + stages { + stage('Clean Checkout') { + steps { + sh 'export' + sh 'ccache -z' + sh 'git submodule deinit -f .' + sh 'git clean -ff -x -d .' + sh 'git submodule update --init --recursive --force' + } + } + + stage('Add Airmap API key') { + steps { + withCredentials([file(credentialsId: 'QGC_Airmap_api_key', variable: 'AIRMAP_API_HEADER')]) { + sh 'cp $AIRMAP_API_HEADER ${WORKSPACE}/src/Airmap/Airmap_api_key.h' + } + } + when { + anyOf { + branch 'master'; + branch 'Stable_*' + } + } + } + + stage('Build OSX Release') { + steps { + sh 'mkdir build; cd build; ${QT_PATH}/${QMAKE_VER} -r ${WORKSPACE}/qgroundcontrol.pro CONFIG+=${QGC_CONFIG} CONFIG+=WarningsAsErrorsOn' + sh 'cd build; make -j`sysctl -n hw.ncpu`' + archiveArtifacts(artifacts: 'build/**/*.dmg', fingerprint: true) + sh 'ccache -s' + } + } + } + post { + cleanup { + sh 'git clean -ff -x -d .' + } + } + } + + stage('OSX Release (cmake)') { + agent { + node { + label 'mac' + } + } + environment { + CCACHE_BASEDIR = "${env.WORKSPACE}" + CCACHE_CPP2 = '1' + CMAKE_BUILD_TYPE = 'Release' + QT_VERSION = "5.11.0" + QT_MKSPEC = "clang_64" + } + steps { + sh 'export' + sh 'ccache -z' + sh 'make distclean' + sh 'make submodulesclean' + sh 'make mac' + sh 'ccache -s' + sh 'make distclean' + } + post { + cleanup { + sh 'git clean -ff -x -d .' + } + } + } + + } // parallel + } // stage('build') + } // stages + + environment { + CCACHE_DIR = '/tmp/ccache' + QT_FATAL_WARNINGS = '1' + } + + options { + buildDiscarder(logRotator(numToKeepStr: '10', artifactDaysToKeepStr: '30')) + timeout(time: 60, unit: 'MINUTES') + } +} diff --git a/build_ios.sh b/build_ios.sh new file mode 100755 index 0000000..ed58565 --- /dev/null +++ b/build_ios.sh @@ -0,0 +1,20 @@ +#!/bin/bash +if [ ! -d /Volumes/RAMDisk ] ; then + echo 'RAM Disk not found' + echo 'Only used for App Store builds. It will not work on your computer.' + exit 1 +fi +#-- Set to my local installation +QMAKE=/Users/gus/Applications/Qt/5.12.2/ios/bin/qmake +#-- Using Travis variables as this will eventually live there +SHADOW_BUILD_DIR=/Volumes/RAMDisk/build-qgroundcontrol-iOS-Release +TRAVIS_BUILD_DIR=/Users/gus/github/work/UpstreamQGC +#-- Build it +mkdir -p ${SHADOW_BUILD_DIR} && +cd ${SHADOW_BUILD_DIR} && +#-- Create project only (build using Xcode) +${QMAKE} -r ${TRAVIS_BUILD_DIR}/qgroundcontrol.pro CONFIG+=WarningsAsErrorsOn CONFIG-=debug_and_release CONFIG+=release CONFIG+=ForAppStore +sed -i .bak 's/com.yourcompany.${PRODUCT_NAME:rfc1034identifier}/org.QGroundControl.qgc/' ${SHADOW_BUILD_DIR}/QGroundControl.xcodeproj/project.pbxproj +#-- Create and build +#${QMAKE} -r ${TRAVIS_BUILD_DIR}/qgroundcontrol.pro CONFIG+=WarningsAsErrorsOn CONFIG-=debug_and_release CONFIG+=release CONFIG+=ForAppStore && +#xcodebuild -configuration Release -xcconfig ${TRAVIS_BUILD_DIR}/ios/qgroundcontrol_appstore.xcconfig diff --git a/custom-example/InstrumentValueIcons.qrc b/custom/InstrumentValueIcons.qrc similarity index 100% rename from custom-example/InstrumentValueIcons.qrc rename to custom/InstrumentValueIcons.qrc index 282ed41..7d5a381 100644 --- a/custom-example/InstrumentValueIcons.qrc +++ b/custom/InstrumentValueIcons.qrc @@ -1,301 +1,301 @@ - ../resources/InstrumentValueIcons/stethoscope.svg - ../resources/InstrumentValueIcons/inbox-check.svg - ../resources/InstrumentValueIcons/cheveron-up.svg - ../resources/InstrumentValueIcons/location-shopping.svg - ../resources/InstrumentValueIcons/cheveron-right.svg - ../resources/InstrumentValueIcons/bookmark.svg - ../resources/InstrumentValueIcons/travel-case.svg - ../resources/InstrumentValueIcons/user-solid-square.svg - ../resources/InstrumentValueIcons/arrow-simple-up.svg - ../resources/InstrumentValueIcons/list.svg - ../resources/InstrumentValueIcons/shuffle.svg - ../resources/InstrumentValueIcons/travel-walk.svg - ../resources/InstrumentValueIcons/checkmark.svg - ../resources/InstrumentValueIcons/trophy.svg - ../resources/InstrumentValueIcons/mood-happy-solid.svg - ../resources/InstrumentValueIcons/cog.svg - ../resources/InstrumentValueIcons/text-box.svg - ../resources/InstrumentValueIcons/video-camera.svg - ../resources/InstrumentValueIcons/backward-step.svg - ../resources/InstrumentValueIcons/view-column.svg - ../resources/InstrumentValueIcons/add-outline.svg - ../resources/InstrumentValueIcons/battery-low.svg - ../resources/InstrumentValueIcons/bookmark copy 2.svg - ../resources/InstrumentValueIcons/volume-down.svg - ../resources/InstrumentValueIcons/travel-taxi-cab.svg - ../resources/InstrumentValueIcons/camera.svg - ../resources/InstrumentValueIcons/apparel.svg - ../resources/InstrumentValueIcons/checkmark-outline.svg - ../resources/InstrumentValueIcons/envelope.svg - ../resources/InstrumentValueIcons/flag.svg - ../resources/InstrumentValueIcons/window-new.svg - ../resources/InstrumentValueIcons/arrow-simple-right.svg - ../resources/InstrumentValueIcons/filter.svg - ../resources/InstrumentValueIcons/minus-outline.svg - ../resources/InstrumentValueIcons/edit-cut.svg - ../resources/InstrumentValueIcons/volume-off.svg - ../resources/InstrumentValueIcons/zoom-in.svg - ../resources/InstrumentValueIcons/pin.svg - ../resources/InstrumentValueIcons/layers.svg - ../resources/InstrumentValueIcons/airplane.svg - ../resources/InstrumentValueIcons/view-tile.svg - ../resources/InstrumentValueIcons/location-marina.svg - ../resources/InstrumentValueIcons/border-top.svg - ../resources/InstrumentValueIcons/refresh.svg - ../resources/InstrumentValueIcons/travel-bus.svg - ../resources/InstrumentValueIcons/add-solid.svg - ../resources/InstrumentValueIcons/notifications.svg - ../resources/InstrumentValueIcons/indent-decrease.svg - ../resources/InstrumentValueIcons/badge.svg - ../resources/InstrumentValueIcons/align-center.svg - ../resources/InstrumentValueIcons/queue.svg - ../resources/InstrumentValueIcons/conversation.svg - ../resources/InstrumentValueIcons/inbox-download.svg - ../resources/InstrumentValueIcons/cloud.svg - ../resources/InstrumentValueIcons/text-decoration.svg - ../resources/InstrumentValueIcons/date-add.svg - ../resources/InstrumentValueIcons/network.svg - ../resources/InstrumentValueIcons/list-add.svg - ../resources/InstrumentValueIcons/film.svg - ../resources/InstrumentValueIcons/book-reference.svg - ../resources/InstrumentValueIcons/star-full.svg - ../resources/InstrumentValueIcons/information-outline.svg - ../resources/InstrumentValueIcons/user-group.svg - ../resources/InstrumentValueIcons/hard-drive.svg - ../resources/InstrumentValueIcons/chart-bar.svg - ../resources/InstrumentValueIcons/box.svg - ../resources/InstrumentValueIcons/music-notes.svg - ../resources/InstrumentValueIcons/bookmark copy 3.svg - ../resources/InstrumentValueIcons/anchor.svg - ../resources/InstrumentValueIcons/mood-sad-solid.svg - ../resources/InstrumentValueIcons/coffee.svg - ../resources/InstrumentValueIcons/mood-neutral-outline.svg - ../resources/InstrumentValueIcons/menu.svg - ../resources/InstrumentValueIcons/fast-rewind.svg - ../resources/InstrumentValueIcons/user-add.svg - ../resources/InstrumentValueIcons/mobile-devices.svg - ../resources/InstrumentValueIcons/time.svg - ../resources/InstrumentValueIcons/subdirectory-left.svg - ../resources/InstrumentValueIcons/window.svg - ../resources/InstrumentValueIcons/hand-stop.svg - ../resources/InstrumentValueIcons/beverage.svg - ../resources/InstrumentValueIcons/volume-mute.svg - ../resources/InstrumentValueIcons/reply-all.svg - ../resources/InstrumentValueIcons/location-food.svg - ../resources/InstrumentValueIcons/arrow-thin-left.svg - ../resources/InstrumentValueIcons/folder-outline.svg - ../resources/InstrumentValueIcons/dial-pad.svg - ../resources/InstrumentValueIcons/battery-half.svg - ../resources/InstrumentValueIcons/trash.svg - ../resources/InstrumentValueIcons/notification.svg - ../resources/InstrumentValueIcons/send.svg - ../resources/InstrumentValueIcons/station.svg - ../resources/InstrumentValueIcons/pen-tool.svg - ../resources/InstrumentValueIcons/gift.svg - ../resources/InstrumentValueIcons/arrow-outline-down.svg - ../resources/InstrumentValueIcons/ticket.svg - ../resources/InstrumentValueIcons/border-none.svg - ../resources/InstrumentValueIcons/format-italic.svg - ../resources/InstrumentValueIcons/user-solid-circle.svg - ../resources/InstrumentValueIcons/edit-pencil.svg - ../resources/InstrumentValueIcons/step-forward.svg - ../resources/InstrumentValueIcons/edit-copy.svg - ../resources/InstrumentValueIcons/globe.svg - ../resources/InstrumentValueIcons/arrow-thin-right.svg - ../resources/InstrumentValueIcons/inbox-full.svg - ../resources/InstrumentValueIcons/mood-sad-outline.svg - ../resources/InstrumentValueIcons/bug.svg - ../resources/InstrumentValueIcons/question.svg - ../resources/InstrumentValueIcons/dots-horizontal-double.svg - ../resources/InstrumentValueIcons/format-bold.svg - ../resources/InstrumentValueIcons/close-outline.svg - ../resources/InstrumentValueIcons/dots-horizontal-triple.svg - ../resources/InstrumentValueIcons/format-text-size.svg - ../resources/InstrumentValueIcons/computer-laptop.svg - ../resources/InstrumentValueIcons/arrow-thick-down.svg - ../resources/InstrumentValueIcons/cheveron-outline-down.svg - ../resources/InstrumentValueIcons/travel.svg - ../resources/InstrumentValueIcons/usb.svg - ../resources/InstrumentValueIcons/cheveron-down.svg - ../resources/InstrumentValueIcons/key.svg - ../resources/InstrumentValueIcons/tools copy.svg - ../resources/InstrumentValueIcons/album.svg - ../resources/InstrumentValueIcons/arrow-base-down.svg - ../resources/InstrumentValueIcons/copy.svg - ../resources/InstrumentValueIcons/align-left.svg - ../resources/InstrumentValueIcons/explore.svg - ../resources/InstrumentValueIcons/watch.svg - ../resources/InstrumentValueIcons/playlist.svg - ../resources/InstrumentValueIcons/pause-outline.svg - ../resources/InstrumentValueIcons/location-current.svg - ../resources/InstrumentValueIcons/home.svg - ../resources/InstrumentValueIcons/battery-full.svg - ../resources/InstrumentValueIcons/format-font-size.svg - ../resources/InstrumentValueIcons/exclamation-solid.svg - ../resources/InstrumentValueIcons/music-artist.svg - ../resources/InstrumentValueIcons/music-album.svg - ../resources/InstrumentValueIcons/chart-pie.svg - ../resources/InstrumentValueIcons/photo.svg - ../resources/InstrumentValueIcons/lock-open.svg - ../resources/InstrumentValueIcons/inbox.svg - ../resources/InstrumentValueIcons/hot.svg - ../resources/InstrumentValueIcons/browser-window-new.svg - ../resources/InstrumentValueIcons/zoom-out.svg - ../resources/InstrumentValueIcons/search.svg - ../resources/InstrumentValueIcons/backward.svg - ../resources/InstrumentValueIcons/store-front.svg - ../resources/InstrumentValueIcons/user.svg - ../resources/InstrumentValueIcons/lock-closed.svg - ../resources/InstrumentValueIcons/load-balancer.svg - ../resources/InstrumentValueIcons/border-all.svg - ../resources/InstrumentValueIcons/location-gas-station.svg - ../resources/InstrumentValueIcons/news-paper.svg - ../resources/InstrumentValueIcons/align-justified.svg - ../resources/InstrumentValueIcons/color-palette.svg - ../resources/InstrumentValueIcons/radio.svg - ../resources/InstrumentValueIcons/reply.svg - ../resources/InstrumentValueIcons/target.svg - ../resources/InstrumentValueIcons/border-vertical.svg - ../resources/InstrumentValueIcons/duplicate.svg - ../resources/InstrumentValueIcons/arrow-thick-right.svg - ../resources/InstrumentValueIcons/exclamation-outline.svg - ../resources/InstrumentValueIcons/bolt.svg - ../resources/InstrumentValueIcons/shopping-cart.svg - ../resources/InstrumentValueIcons/calendar.svg - ../resources/InstrumentValueIcons/travel-train.svg - ../resources/InstrumentValueIcons/save-disk.svg - ../resources/InstrumentValueIcons/cloud-upload.svg - ../resources/InstrumentValueIcons/dashboard.svg - ../resources/InstrumentValueIcons/arrow-simple-down.svg - ../resources/InstrumentValueIcons/computer-desktop.svg - ../resources/InstrumentValueIcons/music-playlist.svg - ../resources/InstrumentValueIcons/share-01.svg - ../resources/InstrumentValueIcons/travel-car.svg - ../resources/InstrumentValueIcons/border-horizontal.svg - ../resources/InstrumentValueIcons/fast-forward.svg - ../resources/InstrumentValueIcons/keyboard.svg - ../resources/InstrumentValueIcons/chat-bubble-dots.svg - ../resources/InstrumentValueIcons/folder.svg - ../resources/InstrumentValueIcons/document.svg - ../resources/InstrumentValueIcons/format-underline.svg - ../resources/InstrumentValueIcons/arrow-thin-down.svg - ../resources/InstrumentValueIcons/cheveron-outline-left.svg - ../resources/InstrumentValueIcons/thumbs-down.svg - ../resources/InstrumentValueIcons/stroke-width.svg - ../resources/InstrumentValueIcons/yin-yang.svg - ../resources/InstrumentValueIcons/thumbs-up.svg - ../resources/InstrumentValueIcons/cheveron-left.svg - ../resources/InstrumentValueIcons/radar.svg - ../resources/InstrumentValueIcons/play.svg - ../resources/InstrumentValueIcons/bluetooth.svg - ../resources/InstrumentValueIcons/clipboard.svg - ../resources/InstrumentValueIcons/mood-happy-outline.svg - ../resources/InstrumentValueIcons/reload.svg - ../resources/InstrumentValueIcons/information-solid.svg - ../resources/InstrumentValueIcons/php-elephant.svg - ../resources/InstrumentValueIcons/bookmark-outline-add.svg - ../resources/InstrumentValueIcons/border-inner.svg - ../resources/InstrumentValueIcons/brightness-up.svg - ../resources/InstrumentValueIcons/view-hide.svg - ../resources/InstrumentValueIcons/forward-step.svg - ../resources/InstrumentValueIcons/cheveron-outline-up.svg - ../resources/InstrumentValueIcons/cheveron-outline-right.svg - ../resources/InstrumentValueIcons/share.svg - ../resources/InstrumentValueIcons/border-right.svg - ../resources/InstrumentValueIcons/location-hotel.svg - ../resources/InstrumentValueIcons/brightness-down.svg - ../resources/InstrumentValueIcons/light-bulb.svg - ../resources/InstrumentValueIcons/location-park.svg - ../resources/InstrumentValueIcons/factory.svg - ../resources/InstrumentValueIcons/stand-by.svg - ../resources/InstrumentValueIcons/swap.svg - ../resources/InstrumentValueIcons/portfolio.svg - ../resources/InstrumentValueIcons/arrow-outline-right.svg - ../resources/InstrumentValueIcons/tuning.svg - ../resources/InstrumentValueIcons/view-carousel.svg - ../resources/InstrumentValueIcons/calculator.svg - ../resources/InstrumentValueIcons/show-sidebar.svg - ../resources/InstrumentValueIcons/step-backward.svg - ../resources/InstrumentValueIcons/tablet.svg - ../resources/InstrumentValueIcons/backspace.svg - ../resources/InstrumentValueIcons/map.svg - ../resources/InstrumentValueIcons/arrow-simple-left.svg - ../resources/InstrumentValueIcons/view-show.svg - ../resources/InstrumentValueIcons/adjust.svg - ../resources/InstrumentValueIcons/border-bottom.svg - ../resources/InstrumentValueIcons/document-add.svg - ../resources/InstrumentValueIcons/plugin.svg - ../resources/InstrumentValueIcons/navigation-more.svg - ../resources/InstrumentValueIcons/browser-window-open.svg - ../resources/InstrumentValueIcons/flashlight.svg - ../resources/InstrumentValueIcons/currency-dollar.svg - ../resources/InstrumentValueIcons/close-solid.svg - ../resources/InstrumentValueIcons/vector.svg - ../resources/InstrumentValueIcons/paste.svg - ../resources/InstrumentValueIcons/arrow-outline-up.svg - ../resources/InstrumentValueIcons/pause.svg - ../resources/InstrumentValueIcons/artist.svg - ../resources/InstrumentValueIcons/hour-glass.svg - ../resources/InstrumentValueIcons/browser-window.svg - ../resources/InstrumentValueIcons/border-left.svg - ../resources/InstrumentValueIcons/tag.svg - ../resources/InstrumentValueIcons/translate.svg - ../resources/InstrumentValueIcons/mood-neutral-solid.svg - ../resources/InstrumentValueIcons/pause-solid.svg - ../resources/InstrumentValueIcons/phone.svg - ../resources/InstrumentValueIcons/heart.svg - ../resources/InstrumentValueIcons/headphones.svg - ../resources/InstrumentValueIcons/servers.svg - ../resources/InstrumentValueIcons/close.svg ../resources/InstrumentValueIcons/directions.svg - ../resources/InstrumentValueIcons/arrow-thick-left.svg - ../resources/InstrumentValueIcons/play-outline.svg - ../resources/InstrumentValueIcons/arrow-thick-up.svg - ../resources/InstrumentValueIcons/code.svg - ../resources/InstrumentValueIcons/thermometer.svg - ../resources/InstrumentValueIcons/location-restroom.svg - ../resources/InstrumentValueIcons/list-bullet.svg - ../resources/InstrumentValueIcons/wrench.svg - ../resources/InstrumentValueIcons/compose.svg - ../resources/InstrumentValueIcons/at-symbol.svg - ../resources/InstrumentValueIcons/library.svg - ../resources/InstrumentValueIcons/view-list.svg - ../resources/InstrumentValueIcons/timer.svg - ../resources/InstrumentValueIcons/window-open.svg - ../resources/InstrumentValueIcons/mouse.svg - ../resources/InstrumentValueIcons/buoy.svg - ../resources/InstrumentValueIcons/subdirectory-right.svg - ../resources/InstrumentValueIcons/volume-up.svg - ../resources/InstrumentValueIcons/edit-crop.svg - ../resources/InstrumentValueIcons/screen-full.svg - ../resources/InstrumentValueIcons/forward.svg - ../resources/InstrumentValueIcons/pylon.svg - ../resources/InstrumentValueIcons/align-right.svg - ../resources/InstrumentValueIcons/border-outer.svg - ../resources/InstrumentValueIcons/arrow-thin-up.svg - ../resources/InstrumentValueIcons/printer.svg - ../resources/InstrumentValueIcons/wallet.svg - ../resources/InstrumentValueIcons/arrow-outline-left.svg - ../resources/InstrumentValueIcons/credit-card.svg - ../resources/InstrumentValueIcons/repost.svg - ../resources/InstrumentValueIcons/notifications-outline.svg - ../resources/InstrumentValueIcons/bookmark-outline.svg - ../resources/InstrumentValueIcons/radar copy 2.svg - ../resources/InstrumentValueIcons/share-alt.svg - ../resources/InstrumentValueIcons/link.svg - ../resources/InstrumentValueIcons/attachment.svg - ../resources/InstrumentValueIcons/chart.svg - ../resources/InstrumentValueIcons/shield.svg - ../resources/InstrumentValueIcons/block.svg - ../resources/InstrumentValueIcons/indent-increase.svg - ../resources/InstrumentValueIcons/arrow-base-up.svg - ../resources/InstrumentValueIcons/minus-solid.svg - ../resources/InstrumentValueIcons/folder-outline-add.svg - ../resources/InstrumentValueIcons/location.svg - ../resources/InstrumentValueIcons/mic.svg - ../resources/InstrumentValueIcons/education.svg ../resources/InstrumentValueIcons/announcement.svg + ../resources/InstrumentValueIcons/user-solid-square.svg + ../resources/InstrumentValueIcons/shield.svg + ../resources/InstrumentValueIcons/watch.svg + ../resources/InstrumentValueIcons/share.svg + ../resources/InstrumentValueIcons/bookmark-outline-add.svg + ../resources/InstrumentValueIcons/arrow-thick-left.svg + ../resources/InstrumentValueIcons/reload.svg + ../resources/InstrumentValueIcons/badge.svg + ../resources/InstrumentValueIcons/travel-walk.svg + ../resources/InstrumentValueIcons/cog.svg + ../resources/InstrumentValueIcons/folder-outline.svg + ../resources/InstrumentValueIcons/queue.svg + ../resources/InstrumentValueIcons/indent-decrease.svg + ../resources/InstrumentValueIcons/menu.svg + ../resources/InstrumentValueIcons/computer-laptop.svg + ../resources/InstrumentValueIcons/view-column.svg + ../resources/InstrumentValueIcons/list.svg + ../resources/InstrumentValueIcons/question.svg + ../resources/InstrumentValueIcons/music-artist.svg + ../resources/InstrumentValueIcons/playlist.svg + ../resources/InstrumentValueIcons/wallet.svg + ../resources/InstrumentValueIcons/bluetooth.svg + ../resources/InstrumentValueIcons/radar copy 2.svg + ../resources/InstrumentValueIcons/tuning.svg + ../resources/InstrumentValueIcons/book-reference.svg + ../resources/InstrumentValueIcons/information-solid.svg + ../resources/InstrumentValueIcons/user-group.svg + ../resources/InstrumentValueIcons/view-hide.svg + ../resources/InstrumentValueIcons/gift.svg + ../resources/InstrumentValueIcons/pylon.svg + ../resources/InstrumentValueIcons/arrow-thin-left.svg + ../resources/InstrumentValueIcons/pause.svg + ../resources/InstrumentValueIcons/layers.svg + ../resources/InstrumentValueIcons/repost.svg + ../resources/InstrumentValueIcons/hand-stop.svg + ../resources/InstrumentValueIcons/border-horizontal.svg + ../resources/InstrumentValueIcons/send.svg + ../resources/InstrumentValueIcons/beverage.svg + ../resources/InstrumentValueIcons/align-center.svg + ../resources/InstrumentValueIcons/travel-bus.svg + ../resources/InstrumentValueIcons/artist.svg + ../resources/InstrumentValueIcons/color-palette.svg + ../resources/InstrumentValueIcons/compose.svg + ../resources/InstrumentValueIcons/news-paper.svg + ../resources/InstrumentValueIcons/printer.svg + ../resources/InstrumentValueIcons/border-all.svg + ../resources/InstrumentValueIcons/edit-copy.svg + ../resources/InstrumentValueIcons/dots-horizontal-triple.svg + ../resources/InstrumentValueIcons/border-left.svg + ../resources/InstrumentValueIcons/view-show.svg + ../resources/InstrumentValueIcons/globe.svg + ../resources/InstrumentValueIcons/subdirectory-right.svg + ../resources/InstrumentValueIcons/chart.svg + ../resources/InstrumentValueIcons/arrow-outline-down.svg + ../resources/InstrumentValueIcons/browser-window.svg + ../resources/InstrumentValueIcons/inbox.svg + ../resources/InstrumentValueIcons/music-album.svg + ../resources/InstrumentValueIcons/currency-dollar.svg + ../resources/InstrumentValueIcons/chart-bar.svg + ../resources/InstrumentValueIcons/text-box.svg + ../resources/InstrumentValueIcons/border-outer.svg + ../resources/InstrumentValueIcons/stethoscope.svg + ../resources/InstrumentValueIcons/coffee.svg + ../resources/InstrumentValueIcons/timer.svg + ../resources/InstrumentValueIcons/mood-sad-outline.svg + ../resources/InstrumentValueIcons/show-sidebar.svg + ../resources/InstrumentValueIcons/border-vertical.svg + ../resources/InstrumentValueIcons/thumbs-up.svg + ../resources/InstrumentValueIcons/step-forward.svg + ../resources/InstrumentValueIcons/location-marina.svg + ../resources/InstrumentValueIcons/inbox-download.svg + ../resources/InstrumentValueIcons/cheveron-outline-down.svg + ../resources/InstrumentValueIcons/volume-down.svg + ../resources/InstrumentValueIcons/browser-window-new.svg + ../resources/InstrumentValueIcons/add-solid.svg + ../resources/InstrumentValueIcons/credit-card.svg + ../resources/InstrumentValueIcons/cheveron-outline-up.svg + ../resources/InstrumentValueIcons/edit-pencil.svg + ../resources/InstrumentValueIcons/format-bold.svg + ../resources/InstrumentValueIcons/paste.svg + ../resources/InstrumentValueIcons/radio.svg + ../resources/InstrumentValueIcons/album.svg + ../resources/InstrumentValueIcons/at-symbol.svg + ../resources/InstrumentValueIcons/education.svg + ../resources/InstrumentValueIcons/radar.svg + ../resources/InstrumentValueIcons/headphones.svg + ../resources/InstrumentValueIcons/load-balancer.svg + ../resources/InstrumentValueIcons/home.svg + ../resources/InstrumentValueIcons/backward.svg + ../resources/InstrumentValueIcons/tablet.svg + ../resources/InstrumentValueIcons/mood-happy-solid.svg + ../resources/InstrumentValueIcons/align-right.svg + ../resources/InstrumentValueIcons/folder.svg + ../resources/InstrumentValueIcons/duplicate.svg + ../resources/InstrumentValueIcons/envelope.svg + ../resources/InstrumentValueIcons/bookmark copy 3.svg + ../resources/InstrumentValueIcons/lock-closed.svg + ../resources/InstrumentValueIcons/clipboard.svg + ../resources/InstrumentValueIcons/border-bottom.svg + ../resources/InstrumentValueIcons/shuffle.svg + ../resources/InstrumentValueIcons/save-disk.svg + ../resources/InstrumentValueIcons/refresh.svg + ../resources/InstrumentValueIcons/lock-open.svg + ../resources/InstrumentValueIcons/link.svg + ../resources/InstrumentValueIcons/view-carousel.svg + ../resources/InstrumentValueIcons/share-01.svg + ../resources/InstrumentValueIcons/arrow-thick-down.svg + ../resources/InstrumentValueIcons/ticket.svg + ../resources/InstrumentValueIcons/portfolio.svg + ../resources/InstrumentValueIcons/arrow-simple-down.svg + ../resources/InstrumentValueIcons/location-restroom.svg + ../resources/InstrumentValueIcons/yin-yang.svg + ../resources/InstrumentValueIcons/buoy.svg + ../resources/InstrumentValueIcons/play-outline.svg + ../resources/InstrumentValueIcons/box.svg + ../resources/InstrumentValueIcons/align-left.svg + ../resources/InstrumentValueIcons/minus-solid.svg + ../resources/InstrumentValueIcons/play.svg + ../resources/InstrumentValueIcons/format-italic.svg + ../resources/InstrumentValueIcons/close.svg + ../resources/InstrumentValueIcons/screen-full.svg + ../resources/InstrumentValueIcons/airplane.svg + ../resources/InstrumentValueIcons/forward.svg + ../resources/InstrumentValueIcons/document.svg + ../resources/InstrumentValueIcons/cheveron-outline-left.svg + ../resources/InstrumentValueIcons/travel-car.svg + ../resources/InstrumentValueIcons/library.svg + ../resources/InstrumentValueIcons/heart.svg + ../resources/InstrumentValueIcons/zoom-out.svg + ../resources/InstrumentValueIcons/travel-taxi-cab.svg + ../resources/InstrumentValueIcons/chat-bubble-dots.svg + ../resources/InstrumentValueIcons/vector.svg + ../resources/InstrumentValueIcons/notifications-outline.svg + ../resources/InstrumentValueIcons/swap.svg + ../resources/InstrumentValueIcons/mic.svg + ../resources/InstrumentValueIcons/folder-outline-add.svg + ../resources/InstrumentValueIcons/forward-step.svg + ../resources/InstrumentValueIcons/minus-outline.svg + ../resources/InstrumentValueIcons/translate.svg + ../resources/InstrumentValueIcons/navigation-more.svg + ../resources/InstrumentValueIcons/battery-full.svg + ../resources/InstrumentValueIcons/pause-solid.svg + ../resources/InstrumentValueIcons/explore.svg + ../resources/InstrumentValueIcons/format-text-size.svg + ../resources/InstrumentValueIcons/reply.svg + ../resources/InstrumentValueIcons/volume-off.svg + ../resources/InstrumentValueIcons/list-add.svg + ../resources/InstrumentValueIcons/pin.svg + ../resources/InstrumentValueIcons/zoom-in.svg + ../resources/InstrumentValueIcons/photo.svg + ../resources/InstrumentValueIcons/mobile-devices.svg + ../resources/InstrumentValueIcons/text-decoration.svg + ../resources/InstrumentValueIcons/music-playlist.svg + ../resources/InstrumentValueIcons/step-backward.svg + ../resources/InstrumentValueIcons/information-outline.svg + ../resources/InstrumentValueIcons/share-alt.svg + ../resources/InstrumentValueIcons/exclamation-outline.svg + ../resources/InstrumentValueIcons/notification.svg + ../resources/InstrumentValueIcons/window.svg + ../resources/InstrumentValueIcons/map.svg + ../resources/InstrumentValueIcons/thermometer.svg + ../resources/InstrumentValueIcons/calendar.svg + ../resources/InstrumentValueIcons/stand-by.svg + ../resources/InstrumentValueIcons/thumbs-down.svg + ../resources/InstrumentValueIcons/cheveron-down.svg + ../resources/InstrumentValueIcons/factory.svg + ../resources/InstrumentValueIcons/stroke-width.svg + ../resources/InstrumentValueIcons/indent-increase.svg + ../resources/InstrumentValueIcons/search.svg + ../resources/InstrumentValueIcons/add-outline.svg + ../resources/InstrumentValueIcons/mood-neutral-outline.svg + ../resources/InstrumentValueIcons/cheveron-outline-right.svg + ../resources/InstrumentValueIcons/arrow-thick-right.svg + ../resources/InstrumentValueIcons/key.svg + ../resources/InstrumentValueIcons/cloud.svg + ../resources/InstrumentValueIcons/mood-happy-outline.svg + ../resources/InstrumentValueIcons/dots-horizontal-double.svg + ../resources/InstrumentValueIcons/format-font-size.svg + ../resources/InstrumentValueIcons/arrow-outline-up.svg + ../resources/InstrumentValueIcons/arrow-thin-up.svg + ../resources/InstrumentValueIcons/network.svg + ../resources/InstrumentValueIcons/mouse.svg + ../resources/InstrumentValueIcons/checkmark-outline.svg + ../resources/InstrumentValueIcons/mood-sad-solid.svg + ../resources/InstrumentValueIcons/store-front.svg + ../resources/InstrumentValueIcons/battery-half.svg + ../resources/InstrumentValueIcons/tools copy.svg + ../resources/InstrumentValueIcons/time.svg + ../resources/InstrumentValueIcons/block.svg + ../resources/InstrumentValueIcons/camera.svg + ../resources/InstrumentValueIcons/user-add.svg + ../resources/InstrumentValueIcons/cheveron-up.svg + ../resources/InstrumentValueIcons/window-new.svg + ../resources/InstrumentValueIcons/battery-low.svg + ../resources/InstrumentValueIcons/volume-up.svg + ../resources/InstrumentValueIcons/volume-mute.svg + ../resources/InstrumentValueIcons/arrow-simple-up.svg + ../resources/InstrumentValueIcons/travel.svg + ../resources/InstrumentValueIcons/location.svg + ../resources/InstrumentValueIcons/dashboard.svg + ../resources/InstrumentValueIcons/light-bulb.svg + ../resources/InstrumentValueIcons/travel-case.svg + ../resources/InstrumentValueIcons/edit-crop.svg + ../resources/InstrumentValueIcons/close-solid.svg + ../resources/InstrumentValueIcons/notifications.svg + ../resources/InstrumentValueIcons/video-camera.svg + ../resources/InstrumentValueIcons/film.svg + ../resources/InstrumentValueIcons/border-right.svg + ../resources/InstrumentValueIcons/bolt.svg + ../resources/InstrumentValueIcons/keyboard.svg + ../resources/InstrumentValueIcons/shopping-cart.svg + ../resources/InstrumentValueIcons/cheveron-left.svg + ../resources/InstrumentValueIcons/flag.svg + ../resources/InstrumentValueIcons/adjust.svg + ../resources/InstrumentValueIcons/wrench.svg + ../resources/InstrumentValueIcons/station.svg + ../resources/InstrumentValueIcons/target.svg + ../resources/InstrumentValueIcons/location-food.svg + ../resources/InstrumentValueIcons/hour-glass.svg + ../resources/InstrumentValueIcons/date-add.svg + ../resources/InstrumentValueIcons/location-gas-station.svg + ../resources/InstrumentValueIcons/cheveron-right.svg + ../resources/InstrumentValueIcons/checkmark.svg + ../resources/InstrumentValueIcons/format-underline.svg + ../resources/InstrumentValueIcons/border-none.svg + ../resources/InstrumentValueIcons/inbox-full.svg + ../resources/InstrumentValueIcons/window-open.svg + ../resources/InstrumentValueIcons/travel-train.svg + ../resources/InstrumentValueIcons/location-current.svg + ../resources/InstrumentValueIcons/computer-desktop.svg + ../resources/InstrumentValueIcons/servers.svg + ../resources/InstrumentValueIcons/close-outline.svg + ../resources/InstrumentValueIcons/apparel.svg + ../resources/InstrumentValueIcons/arrow-thick-up.svg + ../resources/InstrumentValueIcons/border-top.svg + ../resources/InstrumentValueIcons/bookmark copy 2.svg + ../resources/InstrumentValueIcons/trophy.svg + ../resources/InstrumentValueIcons/view-list.svg + ../resources/InstrumentValueIcons/arrow-thin-right.svg + ../resources/InstrumentValueIcons/arrow-outline-left.svg + ../resources/InstrumentValueIcons/edit-cut.svg + ../resources/InstrumentValueIcons/brightness-up.svg + ../resources/InstrumentValueIcons/phone.svg + ../resources/InstrumentValueIcons/arrow-outline-right.svg + ../resources/InstrumentValueIcons/mood-neutral-solid.svg + ../resources/InstrumentValueIcons/arrow-base-down.svg + ../resources/InstrumentValueIcons/arrow-simple-left.svg + ../resources/InstrumentValueIcons/browser-window-open.svg + ../resources/InstrumentValueIcons/document-add.svg + ../resources/InstrumentValueIcons/inbox-check.svg + ../resources/InstrumentValueIcons/star-full.svg + ../resources/InstrumentValueIcons/fast-forward.svg + ../resources/InstrumentValueIcons/fast-rewind.svg + ../resources/InstrumentValueIcons/hot.svg + ../resources/InstrumentValueIcons/brightness-down.svg + ../resources/InstrumentValueIcons/backward-step.svg + ../resources/InstrumentValueIcons/user.svg + ../resources/InstrumentValueIcons/backspace.svg + ../resources/InstrumentValueIcons/border-inner.svg + ../resources/InstrumentValueIcons/chart-pie.svg + ../resources/InstrumentValueIcons/arrow-base-up.svg + ../resources/InstrumentValueIcons/music-notes.svg + ../resources/InstrumentValueIcons/filter.svg + ../resources/InstrumentValueIcons/code.svg + ../resources/InstrumentValueIcons/dial-pad.svg + ../resources/InstrumentValueIcons/reply-all.svg + ../resources/InstrumentValueIcons/arrow-thin-down.svg + ../resources/InstrumentValueIcons/usb.svg + ../resources/InstrumentValueIcons/anchor.svg + ../resources/InstrumentValueIcons/align-justified.svg + ../resources/InstrumentValueIcons/conversation.svg + ../resources/InstrumentValueIcons/bug.svg + ../resources/InstrumentValueIcons/arrow-simple-right.svg + ../resources/InstrumentValueIcons/location-park.svg + ../resources/InstrumentValueIcons/flashlight.svg + ../resources/InstrumentValueIcons/pen-tool.svg + ../resources/InstrumentValueIcons/subdirectory-left.svg + ../resources/InstrumentValueIcons/exclamation-solid.svg + ../resources/InstrumentValueIcons/php-elephant.svg + ../resources/InstrumentValueIcons/bookmark.svg + ../resources/InstrumentValueIcons/location-hotel.svg + ../resources/InstrumentValueIcons/calculator.svg + ../resources/InstrumentValueIcons/view-tile.svg + ../resources/InstrumentValueIcons/plugin.svg + ../resources/InstrumentValueIcons/tag.svg + ../resources/InstrumentValueIcons/pause-outline.svg + ../resources/InstrumentValueIcons/copy.svg + ../resources/InstrumentValueIcons/hard-drive.svg + ../resources/InstrumentValueIcons/attachment.svg + ../resources/InstrumentValueIcons/cloud-upload.svg + ../resources/InstrumentValueIcons/list-bullet.svg + ../resources/InstrumentValueIcons/user-solid-circle.svg + ../resources/InstrumentValueIcons/trash.svg + ../resources/InstrumentValueIcons/bookmark-outline.svg + ../resources/InstrumentValueIcons/location-shopping.svg diff --git a/custom-example/README.jpg b/custom/README.jpg similarity index 100% rename from custom-example/README.jpg rename to custom/README.jpg diff --git a/custom-example/README.md b/custom/README.md similarity index 100% rename from custom-example/README.md rename to custom/README.md diff --git a/custom-example/android/res/drawable-hdpi/icon.png b/custom/android-abandon/res/drawable-hdpi/icon.png similarity index 100% rename from custom-example/android/res/drawable-hdpi/icon.png rename to custom/android-abandon/res/drawable-hdpi/icon.png diff --git a/custom-example/android/res/drawable-ldpi/icon.png b/custom/android-abandon/res/drawable-ldpi/icon.png similarity index 100% rename from custom-example/android/res/drawable-ldpi/icon.png rename to custom/android-abandon/res/drawable-ldpi/icon.png diff --git a/custom-example/android/res/drawable-mdpi/icon.png b/custom/android-abandon/res/drawable-mdpi/icon.png similarity index 100% rename from custom-example/android/res/drawable-mdpi/icon.png rename to custom/android-abandon/res/drawable-mdpi/icon.png diff --git a/custom-example/android/res/drawable-xhdpi/icon.png b/custom/android-abandon/res/drawable-xhdpi/icon.png similarity index 100% rename from custom-example/android/res/drawable-xhdpi/icon.png rename to custom/android-abandon/res/drawable-xhdpi/icon.png diff --git a/custom-example/android/res/drawable-xxhdpi/icon.png b/custom/android-abandon/res/drawable-xxhdpi/icon.png similarity index 100% rename from custom-example/android/res/drawable-xxhdpi/icon.png rename to custom/android-abandon/res/drawable-xxhdpi/icon.png diff --git a/custom-example/android/res/drawable-xxxhdpi/icon.png b/custom/android-abandon/res/drawable-xxxhdpi/icon.png similarity index 100% rename from custom-example/android/res/drawable-xxxhdpi/icon.png rename to custom/android-abandon/res/drawable-xxxhdpi/icon.png diff --git a/custom-example/custom.pri b/custom/custom.pri similarity index 78% rename from custom-example/custom.pri rename to custom/custom.pri index dd5aa4b..6d26c44 100644 --- a/custom-example/custom.pri +++ b/custom/custom.pri @@ -23,6 +23,7 @@ DEFINES += APP_VERSION_STR=\"\\\"$$CUSTOM_QGC_VERSION\\\"\" message(Custom QGC Version: $${CUSTOM_QGC_VERSION}) # Build a single flight stack by disabling APM support +MAVLINK_CONF = common CONFIG += QGC_DISABLE_APM_MAVLINK CONFIG += QGC_DISABLE_APM_PLUGIN QGC_DISABLE_APM_PLUGIN_FACTORY @@ -34,19 +35,19 @@ CONFIG += QGC_DISABLE_PX4_PLUGIN_FACTORY DEFINES += CUSTOMHEADER=\"\\\"CustomPlugin.h\\\"\" DEFINES += CUSTOMCLASS=CustomPlugin -TARGET = CustomQGroundControl -DEFINES += QGC_APPLICATION_NAME='"\\\"Custom QGroundControl\\\""' +TARGET = Spiri +DEFINES += QGC_APPLICATION_NAME='"\\\"Spiri\\\""' -DEFINES += QGC_ORG_NAME=\"\\\"qgroundcontrol.org\\\"\" -DEFINES += QGC_ORG_DOMAIN=\"\\\"org.qgroundcontrol\\\"\" +DEFINES += QGC_ORG_NAME=\"\\\"spiri.org\\\"\" +DEFINES += QGC_ORG_DOMAIN=\"\\\"org.spiri\\\"\" -QGC_APP_NAME = "Custom QGroundControl" -QGC_BINARY_NAME = "CustomQGroundControl" -QGC_ORG_NAME = "Custom" -QGC_ORG_DOMAIN = "org.custom" -QGC_ANDROID_PACKAGE = "org.custom.qgroundcontrol" -QGC_APP_DESCRIPTION = "Custom QGroundControl" -QGC_APP_COPYRIGHT = "Copyright (C) 2020 QGroundControl Development Team. All rights reserved." +QGC_APP_NAME = "Spiri" +QGC_BINARY_NAME = "Spiri" +QGC_ORG_NAME = "Spiri" +QGC_ORG_DOMAIN = "org.spiri" +QGC_ANDROID_PACKAGE = "org.spiri.spiri" +QGC_APP_DESCRIPTION = "Spiri" +QGC_APP_COPYRIGHT = "Copyright (C) 2023 Spiri Development Team. All rights reserved." # Our own, custom resources RESOURCES += \ diff --git a/custom-example/custom.qrc b/custom/custom.qrc similarity index 100% rename from custom-example/custom.qrc rename to custom/custom.qrc diff --git a/custom-example/custom_deploy.pri b/custom/custom_deploy.pri similarity index 100% rename from custom-example/custom_deploy.pri rename to custom/custom_deploy.pri diff --git a/custom-example/deploy/qgroundcontrol-start.sh b/custom/deploy/qgroundcontrol-start.sh old mode 100755 new mode 100644 similarity index 100% rename from custom-example/deploy/qgroundcontrol-start.sh rename to custom/deploy/qgroundcontrol-start.sh diff --git a/custom-example/deploy/qgroundcontrol.desktop b/custom/deploy/qgroundcontrol.desktop similarity index 100% rename from custom-example/deploy/qgroundcontrol.desktop rename to custom/deploy/qgroundcontrol.desktop diff --git a/custom-example/qgcresources.exclusion b/custom/qgcresources.exclusion similarity index 100% rename from custom-example/qgcresources.exclusion rename to custom/qgcresources.exclusion diff --git a/custom-example/qgcresources.qrc b/custom/qgcresources.qrc similarity index 96% rename from custom-example/qgcresources.qrc rename to custom/qgcresources.qrc index 3d5fda0..23d76dd 100644 --- a/custom-example/qgcresources.qrc +++ b/custom/qgcresources.qrc @@ -31,7 +31,6 @@ ../resources/LockClosed.svg ../resources/LockOpen.svg ../resources/notile.png - ../resources/NoVideoBackground.jpg ../resources/Pause.svg ../resources/pause-mission.svg ../resources/pencil.svg @@ -55,9 +54,6 @@ ../resources/XDelete.svg ../resources/XDeleteBlack.svg ../resources/waypoint.svg - ../resources/Gripper.svg - ../resources/GripperRelease.svg - ../resources/GripperGrab.svg ../resources/icons/qgroundcontrol.ico diff --git a/custom-example/qgroundcontrol.exclusion b/custom/qgroundcontrol.exclusion similarity index 100% rename from custom-example/qgroundcontrol.exclusion rename to custom/qgroundcontrol.exclusion diff --git a/custom-example/qgroundcontrol.qrc b/custom/qgroundcontrol.qrc similarity index 95% rename from custom-example/qgroundcontrol.qrc rename to custom/qgroundcontrol.qrc index 5a56173..d4fce6e 100644 --- a/custom-example/qgroundcontrol.qrc +++ b/custom/qgroundcontrol.qrc @@ -14,11 +14,9 @@ ../src/ui/toolbar/ModeIndicator.qml ../src/ui/toolbar/MultiVehicleSelector.qml ../src/ui/toolbar/RCRSSIIndicator.qml - ../src/ui/toolbar/RemoteIDIndicator.qml ../src/ui/toolbar/ROIIndicator.qml ../src/ui/toolbar/TelemetryRSSIIndicator.qml ../src/ui/toolbar/VTOLModeIndicator.qml - ../src/ui/toolbar/APMSupportForwardingIndicator.qml ../src/FlightDisplay/DefaultChecklist.qml @@ -40,7 +38,6 @@ ../src/ui/preferences/BluetoothSettings.qml ../src/PlanView/CorridorScanEditor.qml ../src/ui/preferences/DebugWindow.qml - ../src/ui/preferences/RemoteIDSettings.qml ../src/AutoPilotPlugins/Common/ESP8266Component.qml ../src/AutoPilotPlugins/Common/ESP8266ComponentSummary.qml ../src/ui/ExitWithErrorWindow.qml @@ -111,7 +108,6 @@ ../src/QmlControls/KMLOrSHPFileDialog.qml ../src/QmlControls/LogReplayStatusBar.qml ../src/ui/toolbar/MainStatusIndicator.qml - ../src/ui/toolbar/FlightModeMenuIndicator.qml ../src/ui/toolbar/MainToolBar.qml ../src/QmlControls/MainWindowSavedState.qml ../src/QmlControls/MAVLinkChart.qml @@ -133,7 +129,6 @@ ../src/QmlControls/PreFlightCheckGroup.qml ../src/QmlControls/PreFlightCheckModel.qml ../src/QmlControls/QGCButton.qml - ../src/QmlControls/QGCColumnButton.qml ../src/QmlControls/AutotuneUI.qml ../src/QmlControls/QGCCheckBox.qml ../src/QmlControls/QGCColoredImage.qml @@ -156,10 +151,10 @@ ../src/QmlControls/QGCMouseArea.qml ../src/QmlControls/QGCMovableItem.qml ../src/QmlControls/QGCPopupDialog.qml + ../src/QmlControls/QGCPopupDialogContainer.qml ../src/QmlControls/QGCPipOverlay.qml ../src/QmlControls/QGCPipState.qml ../src/QmlControls/QGCRadioButton.qml - ../src/QmlControls/QGCSimpleMessageDialog.qml ../src/QmlControls/QGCSlider.qml ../src/QmlControls/QGCSwitch.qml ../src/QmlControls/QGCTabBar.qml @@ -167,6 +162,9 @@ ../src/QmlControls/QGCTextField.qml ../src/QmlControls/QGCToolBarButton.qml ../src/QmlControls/QGCToolInsets.qml + ../src/QmlControls/QGCViewDialog.qml + ../src/QmlControls/QGCViewDialogContainer.qml + ../src/QmlControls/QGCViewMessage.qml ../src/QmlControls/QGroundControl/Controls/qmldir ../src/PlanView/RallyPointEditorHeader.qml ../src/PlanView/RallyPointItemEditor.qml @@ -206,6 +204,7 @@ ../src/QmlControls/QGroundControl/FactControls/qmldir ../src/FlightDisplay/FlightDisplayViewVideo.qml ../src/FlightDisplay/FlightDisplayViewWidgets.qml + ../src/FlightDisplay/FlyViewAirspaceIndicator.qml ../src/FlightDisplay/FlyView.qml ../src/FlightDisplay/FlyViewInstrumentPanel.qml ../src/FlightDisplay/FlyViewMap.qml @@ -221,11 +220,9 @@ ../src/FlightDisplay/GuidedActionLand.qml ../src/FlightDisplay/GuidedActionList.qml ../src/FlightDisplay/GuidedActionTakeoff.qml - ../src/FlightDisplay/GuidedActionGripper.qml - ../src/FlightDisplay/GripperMenu.qml ../src/FlightDisplay/GuidedActionPause.qml ../src/FlightDisplay/GuidedActionRTL.qml - ../src/FlightDisplay/GuidedValueSlider.qml + ../src/FlightDisplay/GuidedAltitudeSlider.qml ../src/FlightDisplay/GuidedToolStripAction.qml ../src/FlightDisplay/MultiVehicleList.qml ../src/FlightDisplay/PreFlightBatteryCheck.qml @@ -286,8 +283,6 @@ ../src/AnalyzeView/VibrationPage.qml ../src/FlightDisplay/VirtualJoystick.qml ../src/PlanView/VTOLLandingPatternEditor.qml - ../src/comm/MockLinkOptionsDlg.qml - ../src/FlightDisplay/FlyViewInsetViewer.qml ../src/FirstRunPromptDialogs/UnitsFirstRunPrompt.qml @@ -304,7 +299,6 @@ ../src/MissionManager/CameraSection.FactMetaData.json ../src/MissionManager/CameraSpec.FactMetaData.json ../src/MissionManager/CorridorScan.SettingsGroup.json - ../src/Settings/RemoteID.SettingsGroup.json ../src/QmlControls/EditPositionDialog.FactMetaData.json ../src/Settings/FirmwareUpgrade.SettingsGroup.json ../src/Settings/FlightMap.SettingsGroup.json @@ -346,8 +340,6 @@ ../src/Vehicle/VibrationFact.json ../src/Vehicle/WindFact.json ../src/Vehicle/HygrometerFact.json - ../src/Vehicle/GeneratorFact.json - ../src/Vehicle/EFIFact.json ../src/Settings/Video.SettingsGroup.json ../src/MissionManager/VTOLLandingPattern.FactMetaData.json @@ -358,6 +350,5 @@ ../src/comm/MockLink.General.MetaData.json.xz ../src/comm/MockLink.Parameter.MetaData.json.xz ../src/comm/MockLink.Parameter.MetaData.json - ../src/comm/Mocklink.Arduplane.params.ftp.bin diff --git a/custom-example/res/Custom/Camera/ZoomControl.qml b/custom/res/Custom/Camera/ZoomControl.qml similarity index 100% rename from custom-example/res/Custom/Camera/ZoomControl.qml rename to custom/res/Custom/Camera/ZoomControl.qml diff --git a/custom-example/res/Custom/Camera/qmldir b/custom/res/Custom/Camera/qmldir similarity index 100% rename from custom-example/res/Custom/Camera/qmldir rename to custom/res/Custom/Camera/qmldir diff --git a/custom-example/res/Custom/Widgets/CustomArtificialHorizon.qml b/custom/res/Custom/Widgets/CustomArtificialHorizon.qml similarity index 100% rename from custom-example/res/Custom/Widgets/CustomArtificialHorizon.qml rename to custom/res/Custom/Widgets/CustomArtificialHorizon.qml diff --git a/custom-example/res/Custom/Widgets/CustomAttitudeWidget.qml b/custom/res/Custom/Widgets/CustomAttitudeWidget.qml similarity index 100% rename from custom-example/res/Custom/Widgets/CustomAttitudeWidget.qml rename to custom/res/Custom/Widgets/CustomAttitudeWidget.qml diff --git a/custom-example/res/Custom/Widgets/CustomIconButton.qml b/custom/res/Custom/Widgets/CustomIconButton.qml similarity index 100% rename from custom-example/res/Custom/Widgets/CustomIconButton.qml rename to custom/res/Custom/Widgets/CustomIconButton.qml diff --git a/custom-example/res/Custom/Widgets/CustomOnOffSwitch.qml b/custom/res/Custom/Widgets/CustomOnOffSwitch.qml similarity index 100% rename from custom-example/res/Custom/Widgets/CustomOnOffSwitch.qml rename to custom/res/Custom/Widgets/CustomOnOffSwitch.qml diff --git a/custom-example/res/Custom/Widgets/CustomQuickButton.qml b/custom/res/Custom/Widgets/CustomQuickButton.qml similarity index 100% rename from custom-example/res/Custom/Widgets/CustomQuickButton.qml rename to custom/res/Custom/Widgets/CustomQuickButton.qml diff --git a/custom-example/res/Custom/Widgets/CustomSignalStrength.qml b/custom/res/Custom/Widgets/CustomSignalStrength.qml similarity index 100% rename from custom-example/res/Custom/Widgets/CustomSignalStrength.qml rename to custom/res/Custom/Widgets/CustomSignalStrength.qml diff --git a/custom-example/res/Custom/Widgets/CustomToolBarButton.qml b/custom/res/Custom/Widgets/CustomToolBarButton.qml similarity index 100% rename from custom-example/res/Custom/Widgets/CustomToolBarButton.qml rename to custom/res/Custom/Widgets/CustomToolBarButton.qml diff --git a/custom-example/res/Custom/Widgets/CustomVehicleButton.qml b/custom/res/Custom/Widgets/CustomVehicleButton.qml similarity index 100% rename from custom-example/res/Custom/Widgets/CustomVehicleButton.qml rename to custom/res/Custom/Widgets/CustomVehicleButton.qml diff --git a/custom-example/res/Custom/Widgets/qmldir b/custom/res/Custom/Widgets/qmldir similarity index 100% rename from custom-example/res/Custom/Widgets/qmldir rename to custom/res/Custom/Widgets/qmldir diff --git a/custom-example/res/CustomFlyViewOverlay.qml b/custom/res/CustomFlyViewOverlay.qml similarity index 84% rename from custom-example/res/CustomFlyViewOverlay.qml rename to custom/res/CustomFlyViewOverlay.qml index 422c930..03ff9e8 100644 --- a/custom-example/res/CustomFlyViewOverlay.qml +++ b/custom/res/CustomFlyViewOverlay.qml @@ -55,38 +55,8 @@ Item { QGCToolInsets { id: _totalToolInsets - leftEdgeTopInset: parentToolInsets.leftEdgeTopInset - leftEdgeCenterInset: exampleRectangle.leftEdgeCenterInset - leftEdgeBottomInset: parentToolInsets.leftEdgeBottomInset - rightEdgeTopInset: parentToolInsets.rightEdgeTopInset - rightEdgeCenterInset: parentToolInsets.rightEdgeCenterInset - rightEdgeBottomInset: parent.width - compassBackground.x - topEdgeLeftInset: parentToolInsets.topEdgeLeftInset topEdgeCenterInset: compassArrowIndicator.y + compassArrowIndicator.height - topEdgeRightInset: parentToolInsets.topEdgeRightInset - bottomEdgeLeftInset: parentToolInsets.bottomEdgeLeftInset - bottomEdgeCenterInset: parentToolInsets.bottomEdgeCenterInset - bottomEdgeRightInset: parent.height - attitudeIndicator.y - } - - // This is an example of how you can use parent tool insets to position an element on the custom fly view layer - // - we use parent topEdgeLeftInset to position the widget below the toolstrip - // - we use parent bottomEdgeLeftInset to dodge the virtual joystick if enabled - // - we use the parent leftEdgeTopInset to size our element to the same width as the ToolStripAction - // - we export the width of this element as the leftEdgeCenterInset so that the map will recenter if the vehicle flys behind this element - Rectangle { - id: exampleRectangle - visible: false // to see this example, set this to true. To view insets, enable the insets viewer FlyView.qml - anchors.left: parent.left - anchors.top: parent.top - anchors.bottom: parent.bottom - anchors.topMargin: parentToolInsets.topEdgeLeftInset + _toolsMargin - anchors.bottomMargin: parentToolInsets.bottomEdgeLeftInset + _toolsMargin - anchors.leftMargin: _toolsMargin - width: parentToolInsets.leftEdgeTopInset - _toolsMargin - color: 'red' - - property real leftEdgeCenterInset: visible ? x + width : 0 + rightEdgeBottomInset: parent.width - compassBackground.x } //------------------------------------------------------------------------- @@ -239,7 +209,7 @@ Item { Rectangle { id: attitudeIndicator - anchors.bottomMargin: _toolsMargin + parentToolInsets.bottomEdgeRightInset + anchors.bottomMargin: _toolsMargin anchors.rightMargin: _toolsMargin anchors.bottom: parent.bottom anchors.right: parent.right diff --git a/custom-example/res/Images/CustomAppIcon.png b/custom/res/Images/CustomAppIcon.png similarity index 100% rename from custom-example/res/Images/CustomAppIcon.png rename to custom/res/Images/CustomAppIcon.png diff --git a/custom-example/res/Images/CustomVehicleIcon.svg b/custom/res/Images/CustomVehicleIcon.svg similarity index 99% rename from custom-example/res/Images/CustomVehicleIcon.svg rename to custom/res/Images/CustomVehicleIcon.svg index 341f04c..671b229 100644 --- a/custom-example/res/Images/CustomVehicleIcon.svg +++ b/custom/res/Images/CustomVehicleIcon.svg @@ -1,7 +1,7 @@ - - - - - Svg Vector Icons : http://www.onlinewebfonts.com/icon - + + + + + Svg Vector Icons : http://www.onlinewebfonts.com/icon + \ No newline at end of file diff --git a/custom-example/res/Images/altitude.svg b/custom/res/Images/altitude.svg similarity index 100% rename from custom-example/res/Images/altitude.svg rename to custom/res/Images/altitude.svg diff --git a/custom-example/res/Images/attitude_crosshair.svg b/custom/res/Images/attitude_crosshair.svg similarity index 100% rename from custom-example/res/Images/attitude_crosshair.svg rename to custom/res/Images/attitude_crosshair.svg diff --git a/custom-example/res/Images/attitude_dial.svg b/custom/res/Images/attitude_dial.svg similarity index 100% rename from custom-example/res/Images/attitude_dial.svg rename to custom/res/Images/attitude_dial.svg diff --git a/custom-example/res/Images/attitude_pointer.svg b/custom/res/Images/attitude_pointer.svg similarity index 100% rename from custom-example/res/Images/attitude_pointer.svg rename to custom/res/Images/attitude_pointer.svg diff --git a/custom-example/res/Images/chronometer.svg b/custom/res/Images/chronometer.svg similarity index 100% rename from custom-example/res/Images/chronometer.svg rename to custom/res/Images/chronometer.svg diff --git a/custom-example/res/Images/compass_needle.svg b/custom/res/Images/compass_needle.svg similarity index 100% rename from custom-example/res/Images/compass_needle.svg rename to custom/res/Images/compass_needle.svg diff --git a/custom-example/res/Images/compass_pointer.svg b/custom/res/Images/compass_pointer.svg similarity index 100% rename from custom-example/res/Images/compass_pointer.svg rename to custom/res/Images/compass_pointer.svg diff --git a/custom-example/res/Images/distance.svg b/custom/res/Images/distance.svg similarity index 100% rename from custom-example/res/Images/distance.svg rename to custom/res/Images/distance.svg diff --git a/custom-example/res/Images/horizontal_speed.svg b/custom/res/Images/horizontal_speed.svg similarity index 100% rename from custom-example/res/Images/horizontal_speed.svg rename to custom/res/Images/horizontal_speed.svg diff --git a/custom-example/res/Images/microSD.svg b/custom/res/Images/microSD.svg similarity index 100% rename from custom-example/res/Images/microSD.svg rename to custom/res/Images/microSD.svg diff --git a/custom-example/res/Images/odometer.svg b/custom/res/Images/odometer.svg similarity index 100% rename from custom-example/res/Images/odometer.svg rename to custom/res/Images/odometer.svg diff --git a/custom-example/res/Images/vertical_speed.svg b/custom/res/Images/vertical_speed.svg similarity index 100% rename from custom-example/res/Images/vertical_speed.svg rename to custom/res/Images/vertical_speed.svg diff --git a/custom-example/res/Images/void.png b/custom/res/Images/void.png similarity index 100% rename from custom-example/res/Images/void.png rename to custom/res/Images/void.png diff --git a/custom-example/src/AutoPilotPlugin/CustomAutoPilotPlugin.cc b/custom/src/AutoPilotPlugin/CustomAutoPilotPlugin.cc similarity index 100% rename from custom-example/src/AutoPilotPlugin/CustomAutoPilotPlugin.cc rename to custom/src/AutoPilotPlugin/CustomAutoPilotPlugin.cc diff --git a/custom-example/src/AutoPilotPlugin/CustomAutoPilotPlugin.h b/custom/src/AutoPilotPlugin/CustomAutoPilotPlugin.h similarity index 100% rename from custom-example/src/AutoPilotPlugin/CustomAutoPilotPlugin.h rename to custom/src/AutoPilotPlugin/CustomAutoPilotPlugin.h diff --git a/custom-example/src/CustomPlugin.cc b/custom/src/CustomPlugin.cc similarity index 100% rename from custom-example/src/CustomPlugin.cc rename to custom/src/CustomPlugin.cc diff --git a/custom-example/src/CustomPlugin.h b/custom/src/CustomPlugin.h similarity index 100% rename from custom-example/src/CustomPlugin.h rename to custom/src/CustomPlugin.h diff --git a/custom-example/src/FirmwarePlugin/CustomFirmwarePlugin.cc b/custom/src/FirmwarePlugin/CustomFirmwarePlugin.cc similarity index 100% rename from custom-example/src/FirmwarePlugin/CustomFirmwarePlugin.cc rename to custom/src/FirmwarePlugin/CustomFirmwarePlugin.cc diff --git a/custom-example/src/FirmwarePlugin/CustomFirmwarePlugin.h b/custom/src/FirmwarePlugin/CustomFirmwarePlugin.h similarity index 100% rename from custom-example/src/FirmwarePlugin/CustomFirmwarePlugin.h rename to custom/src/FirmwarePlugin/CustomFirmwarePlugin.h diff --git a/custom-example/src/FirmwarePlugin/CustomFirmwarePluginFactory.cc b/custom/src/FirmwarePlugin/CustomFirmwarePluginFactory.cc similarity index 100% rename from custom-example/src/FirmwarePlugin/CustomFirmwarePluginFactory.cc rename to custom/src/FirmwarePlugin/CustomFirmwarePluginFactory.cc diff --git a/custom-example/src/FirmwarePlugin/CustomFirmwarePluginFactory.h b/custom/src/FirmwarePlugin/CustomFirmwarePluginFactory.h similarity index 100% rename from custom-example/src/FirmwarePlugin/CustomFirmwarePluginFactory.h rename to custom/src/FirmwarePlugin/CustomFirmwarePluginFactory.h diff --git a/custom-example/updateinstrumentqrc.py b/custom/updateinstrumentqrc.py old mode 100755 new mode 100644 similarity index 100% rename from custom-example/updateinstrumentqrc.py rename to custom/updateinstrumentqrc.py diff --git a/custom-example/updateqrc.py b/custom/updateqrc.py old mode 100755 new mode 100644 similarity index 100% rename from custom-example/updateqrc.py rename to custom/updateqrc.py diff --git a/deploy/docker/Dockerfile-build-linux b/deploy/docker/Dockerfile-build-linux index 14be001..907db59 100644 --- a/deploy/docker/Dockerfile-build-linux +++ b/deploy/docker/Dockerfile-build-linux @@ -18,7 +18,7 @@ ENV QT_DESKTOP $QT_PATH/${QT_VERSION}/gcc_64 ENV PATH /usr/lib/ccache:$QT_DESKTOP/bin:$PATH -RUN apt-get update && apt-get -y --quiet --no-install-recommends install \ +RUN apt update && apt -y --quiet --no-install-recommends install \ apt-utils \ binutils \ build-essential \ diff --git a/deploy/docker/install-qt-linux.sh b/deploy/docker/install-qt-linux.sh index dd5dbaa..2cc384f 100755 --- a/deploy/docker/install-qt-linux.sh +++ b/deploy/docker/install-qt-linux.sh @@ -10,9 +10,9 @@ QT_MODULES="${QT_MODULES:-qtcharts}" # Exit immediately if a command exits with a non-zero status set -e -apt-get update -apt-get install python3 python3-pip -y +apt update +apt install python3 python3-pip -y pip3 install aqtinstall -aqt install-qt ${QT_HOST} ${QT_TARGET} ${QT_VERSION} -O ${QT_PATH} -m ${QT_MODULES} +aqt install --outputdir ${QT_PATH} ${QT_VERSION} ${QT_HOST} ${QT_TARGET} -m ${QT_MODULES} echo "Remember to export the following to your PATH: ${QT_PATH}/${QT_VERSION}/*/bin" echo "export PATH=$(readlink -e ${QT_PATH}/${QT_VERSION}/*/bin/):PATH" \ No newline at end of file diff --git a/deploy/linux-fixup-rpaths.bash b/deploy/linux-fixup-rpaths.bash index 4ea8c5f..5b566bf 100755 --- a/deploy/linux-fixup-rpaths.bash +++ b/deploy/linux-fixup-rpaths.bash @@ -47,47 +47,40 @@ find "${SEARCHDIR}" \ -executable \ 2>/dev/null | while IFS='' read -r library; do + # Get the library's current RPATH (RUNPATH) + # Example output of `readelf -d ./build/build-qgroundcontrol-Desktop_Qt_5_15_2_GCC_64bit-Debug/staging/QGroundControl`: + # 0x000000000000001d (RUNPATH) Library runpath: [$ORIGIN/Qt/libs:/home/kbennett/storage/Qt/5.15.2/gcc_64/lib] + # + # It's possible there's no current rpath for a particular library, so turn + # off pipefail to avoid grep causing it to die. + # If you find a better way to do this, please fix. + set +o pipefail + current_rpath="$( + # read the library, parsing its header + # search for the RUNPATH field + # filter out the human-readable text to leave only the RUNPATH value + readelf -d "${library}" | + grep -P '^ 0x[0-9a-f]+ +\(RUNPATH\) ' | + sed -r 's/^ 0x[0-9a-f]+ +\(RUNPATH\) +Library runpath: \[(.*)\]$/\1/g' + )" + set -o pipefail - # readelf is expensive, so keep track of updates with a timestamp file - if [ ! -e "$library.stamp" ] || [ "$library" -nt "$library.stamp" ]; then + # Get the directory containing the library + library_dir="$(dirname "${library}")" - # Get the library's current RPATH (RUNPATH) - # Example output of `readelf -d ./build/build-qgroundcontrol-Desktop_Qt_5_15_2_GCC_64bit-Debug/staging/QGroundControl`: - # 0x000000000000001d (RUNPATH) Library runpath: [$ORIGIN/Qt/libs:/home/kbennett/storage/Qt/5.15.2/gcc_64/lib] - # - # It's possible there's no current rpath for a particular library, so turn - # off pipefail to avoid grep causing it to die. - # If you find a better way to do this, please fix. - set +o pipefail - current_rpath="$( - # read the library, parsing its header - # search for the RUNPATH field - # filter out the human-readable text to leave only the RUNPATH value - readelf -d "${library}" | - grep -P '^ 0x[0-9a-f]+ +\(RUNPATH\) ' | - sed -r 's/^ 0x[0-9a-f]+ +\(RUNPATH\) +Library runpath: \[(.*)\]$/\1/g' - )" - set -o pipefail + # Get the relative path from the library's directory to the Qt/libs directory. + our_rpath="$(realpath --relative-to "${library_dir}" "${RPATHDIR}")" - # Get the directory containing the library - library_dir="$(dirname "${library}")" + # Calculate a new rpath with our library's rpath prefixed. + # Note: '$ORIGIN' must not be expanded by the shell! + # shellcheck disable=SC2016 + new_rpath='$ORIGIN/'"${our_rpath}" - # Get the relative path from the library's directory to the Qt/libs directory. - our_rpath="$(realpath --relative-to "${library_dir}" "${RPATHDIR}")" - - # Calculate a new rpath with our library's rpath prefixed. - # Note: '$ORIGIN' must not be expanded by the shell! - # shellcheck disable=SC2016 - new_rpath='$ORIGIN/'"${our_rpath}" - - # If the library already had an rpath, then prefix ours to it. - if [ -n "${current_rpath}" ]; then - new_rpath="${new_rpath}:${current_rpath}" - fi - - # patch the library's rpath - patchelf --set-rpath "${new_rpath}" "${library}" - - touch "$library.stamp" + # If the library already had an rpath, then prefix ours to it. + if [ -n "${current_rpath}" ]; then + new_rpath="${new_rpath}:${current_rpath}" fi + + # patch the library's rpath + patchelf --set-rpath "${new_rpath}" "${library}" done diff --git a/deploy/windows/driver.msi b/deploy/windows/driver.msi index 7d89fee..361a907 100644 Binary files a/deploy/windows/driver.msi and b/deploy/windows/driver.msi differ diff --git a/deploy/windows/nullsoft_installer.nsi b/deploy/windows/nullsoft_installer.nsi index 0999878..4d5cc4e 100644 --- a/deploy/windows/nullsoft_installer.nsi +++ b/deploy/windows/nullsoft_installer.nsi @@ -97,7 +97,7 @@ doInstall: ; QGC stores its own driver version key to prevent installation if already up to date ; This prevents running the driver install a second time which will start up in repair mode which is confusing !define QGCDRIVERVERSIONKEY "SOFTWARE\QGroundControlUAVDrivers" - !define QGCCURRENTDRIVERVERSION 3 + !define QGCCURRENTDRIVERVERSION 2 ; If the drivers are already installed the key "HKCU/SOFTWARE\MichaelOborne\driver\installed" will be present and set to 1 SetRegView 64 diff --git a/doc/Doxyfile b/doc/Doxyfile index aadd192..da6413d 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -142,11 +142,15 @@ FILE_PATTERNS = *.c \ *.py \ *.qml RECURSIVE = YES -EXCLUDE = ../src/PairingManager/NfcLibrary \ +EXCLUDE = ../src/Airmap/QJsonWebToken \ + ../src/PairingManager/NfcLibrary \ ../src/PairingManager/NfcTask \ ../src/PairingManager/TML \ ../src/GPS/Drivers \ ../src/GPS/RTCM \ + ../src/Airmap/QJsonWebToken \ + ../src/Airmap/README.md \ + ../src/QtLocationPlugin/qtlocation/README.md \ ../src/VideoStreaming/README.md EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = *Test.* diff --git a/libs/libevents/CMakeLists.txt b/libs/libevents/CMakeLists.txt index 21c194f..204f038 100644 --- a/libs/libevents/CMakeLists.txt +++ b/libs/libevents/CMakeLists.txt @@ -10,8 +10,4 @@ add_library(libevents_parser ) target_include_directories(libevents_parser PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(libevents_parser PUBLIC Qt5::Core) -target_link_libraries(libevents_parser PUBLIC comm) - -add_library(libevents_health_and_arming_checks - libevents/libs/cpp/parse/health_and_arming_checks.cpp) -target_link_libraries(libevents_health_and_arming_checks PRIVATE comm) +target_link_libraries(libevents_parser PUBLIC comm) \ No newline at end of file diff --git a/libs/shapelib/AUTHORS b/libs/shapelib/AUTHORS new file mode 100644 index 0000000..0b0340f --- /dev/null +++ b/libs/shapelib/AUTHORS @@ -0,0 +1,2 @@ +Frank Warmerdam et al. + diff --git a/libs/shapelib/CMakeLists.txt b/libs/shapelib/CMakeLists.txt new file mode 100644 index 0000000..4ce1b6c --- /dev/null +++ b/libs/shapelib/CMakeLists.txt @@ -0,0 +1,248 @@ +# Top-level CMakeLists.txt for the CMake-based build and test system +# of the shapelib software. + +# Copyright (C) 2012-2013 Alan W. Irwin + +# See README.CMake + +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU Library General Public License as published +# by the Free Software Foundation; version 2 of the License. +# +# This file is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this file; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# It is a fatal error if no working C compiler is available to build +# the shapelib library and utilities +project(shapelib C) + +message(STATUS "CMake version = ${CMAKE_VERSION}") +message(STATUS "CMAKE_SYSTEM_NAME = ${CMAKE_SYSTEM_NAME}") + +# Version 2.8.5 or above of cmake is currently required for all platforms. +cmake_minimum_required(VERSION 2.8.5 FATAL_ERROR) + +# libraries are all shared by default. +option(BUILD_SHARED_LIBS "Build shared libraries" OFF) + +cmake_policy(SET CMP0026 OLD) # Disallow use of the LOCATION property for build targets + +if(NOT MSVC) + add_compile_options( + -Wno-missing-braces + -Wno-sign-compare + -Wno-return-type + ) +endif() + +set(CMAKE_POSITION_INDEPENDENT_CODE ON) + +# Use rpath? +if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + # No rpath on Darwin. Setting it will only cause trouble. +else(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + option(USE_RPATH "Use -rpath when linking libraries, executables" ON) +endif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + +# In windows all created dlls are gathered in the dll directory +# if you add this directory to your PATH all shared libraries are available +if(BUILD_SHARED_LIBS AND WIN32 AND NOT CYGWIN) + set(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/dll) +endif(BUILD_SHARED_LIBS AND WIN32 AND NOT CYGWIN) + +set(PACKAGE shp) + +# Set up install locations. +set( + CMAKE_INSTALL_BINDIR + ${CMAKE_INSTALL_PREFIX}/bin + CACHE PATH "install location for user executables" + ) + +set( + CMAKE_INSTALL_LIBDIR + ${CMAKE_INSTALL_PREFIX}/lib + CACHE PATH "install location for object code libraries" + ) + +set( + CMAKE_INSTALL_INCLUDEDIR + ${CMAKE_INSTALL_PREFIX}/include + CACHE PATH "install location for C header files" + ) + +set( + CMAKE_INSTALL_SHP_DATADIR + ${CMAKE_INSTALL_PREFIX}/share/${PACKAGE} + CACHE PATH "install location for read-only architecture-independent shp data" + ) + +# Export build information to help other projects link installed +# shapelib software. Only one of these signatures is required +# for the export_shp name. +install(EXPORT export_shp DESTINATION ${CMAKE_INSTALL_SHP_DATADIR}) + +# Initial boilerplate done, now build library and executables. + +set(lib_SRC + shpopen.c + dbfopen.c + safileio.c + shptree.c + sbnsearch.c + ) +option(SHP_DROP_UNABLE_TO_OPEN_MSG "Drop \"unable to open\" error messages" ON) +if(SHP_DROP_UNABLE_TO_OPEN_MSG) + #define the SHP_DROP_UNABLE_TO_OPEN_MSG C macro for this source file. + set_source_files_properties(shpopen.c + PROPERTIES + COMPILE_DEFINITIONS SHP_DROP_UNABLE_TO_OPEN_MSG + ) +endif(SHP_DROP_UNABLE_TO_OPEN_MSG) + +add_library(shp ${lib_SRC}) + +if(WIN32 AND NOT CYGWIN) + set_target_properties(shp + PROPERTIES + COMPILE_DEFINITIONS SHAPELIB_DLLEXPORT + ) +endif(WIN32 AND NOT CYGWIN) + +if(UNIX) + find_library(M_LIB m) + if(M_LIB) + TARGET_LINK_LIBRARIES(shp -lm) + endif() +endif(UNIX) + +set(shp_SOVERSION 1) +set(shp_VERSION 1.4.1) +set_target_properties(shp + PROPERTIES + SOVERSION ${shp_SOVERSION} + VERSION ${shp_VERSION} + INSTALL_NAME_DIR "${CMAKE_INSTALL_LIBDIR}" + ) + +if(USE_RPATH) + set_target_properties(shp + PROPERTIES + INSTALL_RPATH "${CMAKE_INSTALL_LIBDIR}" + ) +endif(USE_RPATH) + +install(TARGETS shp + EXPORT export_shp + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + ) + +# executables to be built and installed. +set(executables + shpcreate + shpadd + shpdump + shprewind + dbfcreate + dbfadd + dbfdump + shptreedump + ) + +find_program(BASH_EXECUTABLE bash) +find_program(SED_EXECUTABLE sed) +if(BASH_EXECUTABLE AND SED_EXECUTABLE) + #set(BUILD_TEST ON) +else(BASH_EXECUTABLE AND SED_EXECUTABLE) + message(STATUS "WARNING: sed or bash not available so disabling testing") +endif(BASH_EXECUTABLE AND SED_EXECUTABLE) + +# For the first series of tests, the user needs to have downloaded +# from http://dl.maptools.org/dl/shapelib/shape_eg_data.zip, unpacked +# that file, and specified the location of that directory with +# the cmake option, -DEG_DATA:PATH=whatever +if(BUILD_TEST) + if(EG_DATA) + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/script.sed "s?/u/www/projects/shapelib/eg_data?${EG_DATA}?\n") + else(EG_DATA) + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/script.sed "") + message(STATUS "WARNING: EG_DATA:PATH not set to point to downloaded eg_data directory so the eg_data part of testing will be ignored.") + endif(EG_DATA) +endif(BUILD_TEST) + +foreach(executable ${executables}) + add_executable(${executable} EXCLUDE_FROM_ALL ${executable}.c) + target_link_libraries(${executable} shp) + if(USE_RPATH) + set_target_properties(${executable} + PROPERTIES + INSTALL_RPATH "${CMAKE_INSTALL_LIBDIR}" + ) + endif(USE_RPATH) + if(BUILD_TEST) + get_target_property(${executable}_LOC ${executable} LOCATION) + file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/script.sed "s?\\./${executable}?${${executable}_LOC}?\n") + endif(BUILD_TEST) +endforeach(executable ${executables}) + +# Install header +install(FILES shapefil.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + +if(BUILD_TEST) + # Set up tests: + + enable_testing() + + # Other executables to be built to facilitate tests. + foreach(executable shptest shputils) + add_executable(${executable} EXCLUDE_FROM_ALL ${executable}.c) + target_link_libraries(${executable} shp) + get_target_property(${executable}_LOC ${executable} LOCATION) + file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/script.sed "s?\\./${executable}?${${executable}_LOC}?\n") + endforeach(executable shptest shputils) + + # Write this as a shell script since execute_process cannot handle + # anything like redirection. + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/script.sh "${SED_EXECUTABLE} -f script.sed < $1 >| $2") + execute_process( + COMMAND + ${BASH_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/script.sh ${CMAKE_CURRENT_SOURCE_DIR}/tests/test1.sh ${CMAKE_CURRENT_BINARY_DIR}/sed_scripted_test1.sh + ) + + execute_process( + COMMAND + ${BASH_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/script.sh ${CMAKE_CURRENT_SOURCE_DIR}/tests/test2.sh ${CMAKE_CURRENT_BINARY_DIR}/sed_scripted_test2.sh + ) + + execute_process( + COMMAND + ${BASH_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/script.sh ${CMAKE_CURRENT_SOURCE_DIR}/tests/test3.sh ${CMAKE_CURRENT_BINARY_DIR}/sed_scripted_test3.sh + ) + + if(EG_DATA) + # These tests correspond to everything in test1.sh + add_test( + NAME test1 + COMMAND ${BASH_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/sed_scripted_test1.sh + ) + endif(EG_DATA) + # These tests correspond to everything in test2.sh + add_test( + NAME test2 + COMMAND ${BASH_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/sed_scripted_test2.sh + ) + + # These tests correspond to everything in test3.sh + add_test( + NAME test3 + COMMAND ${BASH_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/sed_scripted_test3.sh + ) +endif(BUILD_TEST) diff --git a/libs/shapelib/COPYING b/libs/shapelib/COPYING new file mode 100644 index 0000000..0b643ac --- /dev/null +++ b/libs/shapelib/COPYING @@ -0,0 +1,483 @@ + + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + diff --git a/libs/shapelib/ChangeLog b/libs/shapelib/ChangeLog new file mode 100644 index 0000000..e8fbde5 --- /dev/null +++ b/libs/shapelib/ChangeLog @@ -0,0 +1,528 @@ +2017-09-10 Even Rouault + + * shpopen.c: resync with GDAL copy. Make sure to zero terminate all + error messages. And fix regression regarding re-writing the last shape + of a file (https://trac.osgeo.org/gdal/ticket/7031) + +2017-07-10 Even Rouault + + * contrib/shpgeo.c: fix compilation on _MSC_VER < 1800 regarding lack + of NAN macro. + +2016-12-09 Even Rouault + + * Makefile.am: add web/maptools.css to EXTRA_DIST + + * Shapelib 1.4.0 released + +2016-12-06 Even Rouault + + * configure.ac: change soname to 2:1:0 to be in sync with Debian soname. + http://bugzilla.maptools.org/show_bug.cgi?id=2628 + Patch by Bas Couwenberg + + * contrib/doc/Shape_PointInPoly_README.txt, contrib/shpgeo.c: typo fixes. + http://bugzilla.maptools.org/show_bug.cgi?id=2629 + Patch by Bas Couwenberg + + * web/*: use a local .css file to avoid a privacy breach issue reported + by the lintian QA tool. + http://bugzilla.maptools.org/show_bug.cgi?id=2630 + Patch by Bas Couwenberg + +2016-12-06 Even Rouault + + * web/release.html, HOWTO-RELEASE, configure.ac, CMakeLists.txt: prepare + for 1.4.0 release. + +2016-12-05 Even Rouault + + * dbfopen.c, shapefil.h: write DBF end-of-file character 0x1A by default. + This behaviour can be controlled with the DBFSetWriteEndOfFileChar() + function. + +2016-12-05 Even Rouault + + * Major overhaul of Makefile build system to use autoconf/automake. + Contributed by Sandro Mani: https://github.com/manisandro/shapelib/tree/autotools + + * Warning fixes in contrib/ + +2016-12-04 Even Rouault + + * shpopen.c, dbfopen.c, shptree.c, shapefil.h: resync with + GDAL Shapefile driver. Mostly cleanups. SHPObject and DBFInfo + structures extended with new members. New functions: + DBFSetLastModifiedDate, SHPOpenLLEx, SHPRestoreSHX, + SHPSetFastModeReadObject + + * sbnsearch.c: new file to implement original ESRI .sbn spatial + index reading. (no write support). New functions: + SBNOpenDiskTree, SBNCloseDiskTree, SBNSearchDiskTree, + SBNSearchDiskTreeInteger, SBNSearchFreeIds + + * Makefile, makefile.vc, CMakeLists.txt, shapelib.def: updates + with new file and symbols. + + * commit: helper script to cvs commit + +2013-11-26 Frank Warmerdam + + * CMakeLists.txt: CMake support from Alan W. Irwin. + + * dbfdump.c: untested reporting for deleted records. + +2012-04-10 Frank Warmerdam + + * Shapelib 1.3.0 released. + +2012-01-27 Frank Warmerdam + + * shptree.c: optimize quadtree generation (gdal #4472) + +2012-01-24 Frank Warmerdam + + * shpopen.c: fix memory leaks on failure to open .shp file. + +2011-12-11 Frank Warmerdam + + * shptree.c,h: Use SAHooks for .qix access (gdal #3365) + +2011-09-14 Frank Warmerdam + + * shpopen.c: fix missing cast (#2344) + +2011-07-24 + + * shpopen.c, dbfopen.c, shptree.c, shapefil.h: Minimize use of + CPL services in favor of SAHooks.Error(). + + * Makefile: Remove all the shared library building stuff, it is just + too half assed, and results in all sorts of bug reports and complaints. + Instead just install a static libshp.a. + +2011-07-23 + + * Makefile: build shpdumptree as part of all target (#1648). + + * shpopen.c: fix memory leaks in error cases (#2061) + + * contrib/*.c: Include stdlib.h and strings.h (#2146) + + * shpdump.c: change to use %.15g for coordinate reporting. (#2277) + +2011-05-13 Frank Warmerdam + + * dbfopen.c, shapelib.h: Add functions to reorder and alter + field definitions. DBFReorderFields() and DBFAlterFields(). + +2011-05-07 Frank Warmerdam + + * dbfopen.c: Ensure pending record is flushed when adding a native + field (gdal #4073). + +2011-04-16 Frank Warmerdam + + * shapefil.h: avoid warnings with SHP_CVSID on gcc. + +2010-12-06 Frank Warmerdam + + * dbfopen.c: fix read past end of init data fetching code page + http://bugzilla.maptools.org/show_bug.cgi?id=2276 + +2010-07-01 Frank Warmerdam + + * shpopen.c: do not error out on a shape with zero vertices. + + * shpdump.c: do not crash if null shape returned by read object. + +2010-06-29 Frank Warmerdam + + * shptree.c: fix sign of Z and M comparisons in SHPCheckObjectContained. + (http://bugzilla.maptools.org/show_bug.cgi?id=2223) + +2010-01-28 Frank Warmerdam + + * shpopen.c/shapefil.h: Handle the .shp file length limits more + gracefully. (http://trac.osgeo.org/gdal/ticket/3236) + + * shpopen.c: Improve the numerical accurancy of algorithms in + SHPRewind() (http://trac.osgeo.org/gdal/ticket/3363). + +2010-01-16 Frank Warmerdam + + * shpopen.c: support passing in zero/nulls to create an empty + SHPObject: http://bugzilla.maptools.org/show_bug.cgi?id=2148 + +2009-10-29 Frank Warmerdam + + * dbfopen.c: avoid crash risk for truncated files. + http://trac.osgeo.org/gdal/ticket/3093 + +2009-09-17 Bram de Greve + + * shpopen.c: on Win32, define snprintf as alias to _snprintf + +2008-11-12 Frank Warmerdam + + * shptree.c: improve safety in face of buggy .shp file. + http://trac.osgeo.org/gdal/ticket/2610 + + * dbfopen.c: DBFCreateField() can now also operate on files with + records, c/o Martin Dobias. + https://trac.osgeo.org/gdal/ticket/2672 + +2008-11-11 Frank Warmerdam + + * dbfopen.c: Introduce DBFDeleteField() function from Martin Dobias. + http://trac.osgeo.org/gdal/ticket/2671 + +2008-03-14 Frank Warmerdam + + * Correct crash on buggy geometries (Even Rouault). + http://trac.osgeo.org/gdal/ticket/2218 + +2008-01-16 Bram de Greve + + * shapefil.h, safileio.c: add file hooks that accept UTF-8 + encoded filenames on some platforms. Use SASetupUtf8Hooks + to setup the hooks and check SHPAPI_UTF8_HOOKS for its + availability. Currently, this is only available on the Windows + platform that decodes the UTF-8 filenames to wide character + strings and feed them to _wfopen and _wremove. + +2008-01-10 Frank Warmerdam + + * shapefil.h: Avoid _ prefix on #defines. + http://bugzilla.maptools.org/show_bug.cgi?id=1840 + +2008-01-03 Bram de Greve + + * dbfopen.c: in DBFCreate, use default code page + LDID/87 (= 0x57, ANSI) instead of LDID/3. This seems + to be the same as what ESRI would be doing by default. + +2007-12-30 Frank Warmerdam + + * shpadd.c/shpcreate.c: Add support for z and m files. + + * Massive overhaul to use hooks for file io, etc. + +2007-12-18 Bram de Greve + + * dbfopen.c/shapefil.h/safileio.c: create hook for client + specific atof http://bugzilla.maptools.org/show_bug.cgi?id=1615 + + * dbfopen.c: check for NULL handle before closing cpCPG file, + and close after reading. + +2007-12-15 Bram de Greve + + * dbfopen.c/shapefil.h/safileio.c: read the Code Page information + from the DBF file, and exports this information as a string through + the DBFGetCodePage function. This is either the number from the LDID + header field ("LDID/") or as the content of an accompanying + .CPG file. When creating a DBF file, the code can be set using + DBFCreateEx. + +2007-12-12 Bram de Greve + + * dbfopen.c: check for NULL handle in DBFClose. + +2007-11-21 Frank Warmerdam + + * shpopen.c/shapefil.h: Don't keep .shx file open in read-only mode. + http://trac.osgeo.org/gdal/ticket/1956 + +2007-11-14 Frank Warmerdam + + * shpopen.c: checks after mallocs to detect for corrupted/voluntary + broken shapefiles. http://trac.osgeo.org/gdal/ticket/1991 + +2007-09-03 Frank Warmerdam + + * shpgeo.c: Fixed SHPDimension() (missing breaks) in shpgeo.c. + Fix contributed by Andrea Peri. + + * dbfopen.c: Move the static dDoubleField return buffer into DBFInfo + structure to avoid multithreaded risks. + + * dbfopen.c: Simplify DBFReadTuple() to avoid use of static tuple. + Note that this means DBFReadTuple() results are only valid till the + next record is read for any reason. + +2007-06-21 Frank Warmerdam + + * shpopen.c: Fix for SHPRewind() for "contact at one vertex" + cases in rings. http://trac.osgeo.org/gdal/ticket/976 + +2006-11-06 Frank Warmerdam + + * contrib/shpgeo.c: Modified SHPProject to use pj_transform() so + it works for datums and stuff. Submitted by Steffen Macke. + +2006-09-04 Frank Warmerdam + + * shpeopen.c: (MLoskot) Added stronger test of Shapefile reading + failures, e.g. truncated files. The problem was discovered by Tim + Sutton and reported here: + https://svn.qgis.org/trac/ticket/200 + +2006-06-17 Frank Warmerdam + + * dbfopen.c: use calloc() for DBFInfo in DBFCreate() to ensure + all fields initialized to zero if not otherwise mentioned. + + * dbfopen.c: Don't allow creation of string fields with width larger + than 255 per http://bugzilla.maptools.org/show_bug.cgi?id=1434 + +2006-06-16 Frank Warmerdam + + * dbfopen.c: Don't treat decimals value as high order field length + for strings, as it causes serious bugs in some cases such as + http://bugzilla.remotesensing.org/show_bug.cgi?id=1202 + + * dbfopen.c: Made static field buffer in DBFReadAttribute() into a + field in the DBFInfo structure to avoid multi-threading problems. + +2006-03-29 Frank Warmerdam + + * dbfopen.c: Fixed bug in DBFCloneEmpty() (treating pachFieldType as + an array of int). + +2006-02-08 Frank Warmerdam + + * dbfopen.c: Changed to put spaces into string fields that are NULL + as per http://bugzilla.maptools.org/show_bug.cgi?id=316. + +2006-01-26 Frank Warmerdam + + * shpopen.c, shapefil.h, shpdump.c: Added bMeasureIsUsed support as + per http://bugzilla.maptools.org/show_bug.cgi?id=1249 + +2006-01-04 Frank Warmerdam + + * dbfopen.c/shapefil.h: Added functions to check if dbf record is + deleted, and to mark it as deleted. + +2005-02-11 Frank Warmerdam + + * shpopen.c: Check panPartStart[0] is 0 in SHPCreateObject(). + + * Fixed bug 305 in DBFCloneEmpty() - header length problem. + + * Make the pszStringField buffer for DBFReadAttribute() static char + [256] as per bug 306. + +2004-09-15 Frank Warmerdam + + * dbfopen.c: treat all blanks as NULL in DBFIsAttributeNULL(). + +2004-06-23 Frank Warmerdam + + * contrib/shpsort.c: added new contribute program from Eric Miller. + +2003-04-07 Frank Warmerdam + + * Issue 1.2.10 Release. + +2003-03-10 Frank Warmerdam + + * dbfopen.c: modified DBFWriteAttribute call so that it returns FALSE + if it has to truncate the input value. + +2003-01-28 Frank Warmerdam + + * shptree.c: avoid build warnings. + +2002-05-07 Frank Warmerdam + + * dbfopen.c: Added DBFWriteAttributeDirectly() from the AVCE00 + distribution to simplify AVC integration in GDAL. + + * shptree.c: added use of qsort() in place of bubble sort as + submitted by Bernhard Herzog. + +2002-04-10 Frank Warmerdam + + * shpopen.c: Added SHPRewindObject() to correct ring winding. + + * shprewind.c: New utility program. + +2002-03-12 Frank Warmerdam + + * shapelib.def: added DBFWriteNULLAttribute. + +2002-01-17 Frank Warmerdam + + * contrib/ShapeFileII.pas: Contributed Delphi Pascal interface + to Shapelib. + +2002-01-15 Frank Warmerdam + + * shapelib.h: Added support for SHAPELIB_DLLEXPORT macro, and write + up material attempting to explain the use of SHPAPI_CALL macros. + + * dbfopen.c: Compute nHeaderLength in DBFCloneEmpty() instead of + copying it from the source file so we don't have quirks when copying + from files with extra bytes of spacers in the header that don't + themselves get copied properly. + +2001-12-07 Frank Warmerdam + + * shpopen.c: Fix fclose() of SHX file if SHX file fails to open. + Should be closing SHP file. Reported by Ben Discoe. + +2001-11-28 Frank Warmerdam + + * dbfopen.c: two fixes for compiler warnings as suggested by + Richard Hash. + +2001-11-01 Frank Warmerdam + + * shpopen.c/shapefil.h: Move record buffer into SHPInfo so that + different threads can safely access separate files. Other threading + issues may remain. + +2001-08-28 Frank Warmerdam + + * Issue Shapelib 1.2.9 + + * shputils.c: DBFAddField() call should check for -1 return value + for failure. + +2001-07-03 Frank Warmerdam + + * shpopen.c: cleanup better if SHX missing, provided by + Riccardo Cohen. + +2001-06-21 Frank Warmerdam + + * dbfopen.c: Fixed NULL support with patches from Jim Matthews. + + * shpopen.c: Be more careful of establishing initial file bounds in + face of possible NULL shapes. + +2001-06-01 Frank Warmerdam + + * dbfopen.c: ensure binary mode open. + +2001-05-31 Frank Warmerdam + + * shpopen.c: Add support for writing null shapes. + + * dbfopen.c: added DBFGetFieldIndex(), contributed by Jim Matthews. + + * dbfopen.c/shapefil.h/dbf_api.h: added support for NULL fields + in .dbf files. + +2001-05-28 Frank Warmerdam + + * shpopen.c: add some checking on the record count to ensure it + is reasonable. + +2001-05-23 Frank Warmerdam + + * shapefile.h, shpopen.c, dbfopen.c, shptree.c: added the SHPAPI_CALL + macro to allow compilation with _stdcall conventions. + +2001-02-06 Frank Warmerdam + + * Fixed a few memory leaks when SHPOpen() fails. + +2000-12-05 Frank Warmerdam + + * Fix from Craig Bruce (Cubewerx) for DBFReadAttribute() for + the white space trimming code to avoid reading outside allocated + memory. + +2000-11-02 Frank Warmerdam + + * Checked in upgraded shputils.c from Bill Miller. + +2000-10-05 Frank Warmerdam + + * Fixed DBFWriteAttribute() to ensure we can't overwrite the + end of the szSField buffer even if the width is set large. + Bug report by Kirk Benell . + +2000-09-25 Frank Warmerdam + + * Added DBFGetNativeFieldType() (contributed by Daniel) to dbfopen.c. + +2000-07-18 Frank Warmerdam + + * added better enforcement of -1 for append in SHPWriteObject(). + +2000-07-07 Frank Warmerdam + + * Added stdlib.h and string.h where needed, and removed lots of + unused variables, mainly from example mainlines at the suggestion + of Bill Hughes. + +2000-05-24 Frank Warmerdam + + * Added logic to shpadd to grow vertex lists at the suggestion of + Santiago Nullo . + +2000-05-23 Frank Warmerdam + + * Added checks in dbfopen.c on return result of fseek() and fread(). + + * Avoid crashing in DBReadIntegerAttribute() or DBFReadDoubleAttribte() + if the field or record are out of range. + +2000-03-28 Frank Warmerdam + + * Release as 1.2.8. + + * Incorporated a -version-info fix and added mkinstalldirs from Jan. + +2000-03-17 Frank Warmerdam + + * Added shared library hack to Makefile. + + * Fixed up test scripts to look in ./ for executables. + +Wed Feb 16 11:20:29 2000 Frank Warmerdam + + * Release 1.2.7. + + * Modified SHPReadObject() so that will return NULL (type 0) shapes + in a sort of sensible way. + +Wed Dec 15 08:49:53 1999 Frank Warmerdam + + * Fixed record size written at beginning of records in .shp + file. It was 4 bytes to long (thanks to Mikko Syrja of 3D-system Oy) + + * Use atof() instead of sscanf() in dbfopen.c, and add stdlib.h. + +Mon Dec 13 12:29:01 1999 Frank Warmerdam + + * Added support for uppercase .DBF extention c/o + Dennis Christopher + +Fri Nov 5 09:12:31 1999 Frank Warmerdam + + * Updated license headers to include the option of use of the code + under the LGPL. + +1999-09-15 + + * Added shapelib.dll target to makefile.vc. + +Mon May 10 23:19:42 1999 Frank Warmerdam + + * Added candrsn's improvements to extension handling in dbfopen.c + + * Added ``raw tuple'' api to dbfopen.c, still not in dbf_api.html. + From candrsn. + + +Tue May 4 11:04:31 1999 Frank Warmerdam + + * Prepare 1.2.5 release. + + * Added support for 'F' fields. + diff --git a/libs/shapelib/INSTALL b/libs/shapelib/INSTALL new file mode 100644 index 0000000..2099840 --- /dev/null +++ b/libs/shapelib/INSTALL @@ -0,0 +1,370 @@ +Installation Instructions +************************* + +Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation, +Inc. + + Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. This file is offered as-is, +without warranty of any kind. + +Basic Installation +================== + + Briefly, the shell command `./configure && make && make install' +should configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. Some packages provide this +`INSTALL' file but do not implement all of the features documented +below. The lack of an optional feature in a given package is not +necessarily a bug. More recommendations for GNU packages can be found +in *note Makefile Conventions: (standards)Makefile Conventions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + + The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package, generally using the just-built uninstalled binaries. + + 4. Type `make install' to install the programs and any data files and + documentation. When installing into a prefix owned by root, it is + recommended that the package be configured and built as a regular + user, and only the `make install' phase executed with root + privileges. + + 5. Optionally, type `make installcheck' to repeat any self-tests, but + this time using the binaries in their final installed location. + This target does not install anything. Running this target as a + regular user, particularly if the prior `make install' required + root privileges, verifies that the installation completed + correctly. + + 6. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 7. Often, you can also type `make uninstall' to remove the installed + files again. In practice, not all packages have tested that + uninstallation works correctly, even though it is required by the + GNU Coding Standards. + + 8. Some packages, particularly those that use Automake, provide `make + distcheck', which can by used by developers to test that all other + targets like `make install' and `make uninstall' work correctly. + This target is generally not run by end users. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. This +is known as a "VPATH" build. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + + On MacOS X 10.5 and later systems, you can create libraries and +executables that work on multiple system types--known as "fat" or +"universal" binaries--by specifying multiple `-arch' options to the +compiler but only a single `-arch' option to the preprocessor. Like +this: + + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CPP="gcc -E" CXXCPP="g++ -E" + + This is not guaranteed to produce working output in all cases, you +may have to build one architecture at a time and combine the results +using the `lipo' tool if you have problems. + +Installation Names +================== + + By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX', where PREFIX must be an +absolute file name. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. In general, the +default for these options is expressed in terms of `${prefix}', so that +specifying just `--prefix' will affect all of the other directory +specifications that were not explicitly provided. + + The most portable way to affect installation locations is to pass the +correct locations to `configure'; however, many packages provide one or +both of the following shortcuts of passing variable assignments to the +`make install' command line to change installation locations without +having to reconfigure or recompile. + + The first method involves providing an override variable for each +affected directory. For example, `make install +prefix=/alternate/directory' will choose an alternate location for all +directory configuration variables that were expressed in terms of +`${prefix}'. Any directories that were specified during `configure', +but not in terms of `${prefix}', must each be overridden at install +time for the entire installation to be relocated. The approach of +makefile variable overrides for each directory variable is required by +the GNU Coding Standards, and ideally causes no recompilation. +However, some platforms have known limitations with the semantics of +shared libraries that end up requiring recompilation when using this +method, particularly noticeable in packages that use GNU Libtool. + + The second method involves providing the `DESTDIR' variable. For +example, `make install DESTDIR=/alternate/directory' will prepend +`/alternate/directory' before all installation names. The approach of +`DESTDIR' overrides is not required by the GNU Coding Standards, and +does not work on platforms that have drive letters. On the other hand, +it does better at avoiding recompilation issues, and works well even +when some directory options were not specified in terms of `${prefix}' +at `configure' time. + +Optional Features +================= + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + + Some packages offer the ability to configure how verbose the +execution of `make' will be. For these packages, running `./configure +--enable-silent-rules' sets the default to minimal output, which can be +overridden with `make V=1'; while running `./configure +--disable-silent-rules' sets the default to verbose, which can be +overridden with `make V=0'. + +Particular systems +================== + + On HP-UX, the default C compiler is not ANSI C compatible. If GNU +CC is not installed, it is recommended to use the following options in +order to use an ANSI C compiler: + + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + HP-UX `make' updates targets which have the same time stamps as +their prerequisites, which makes it generally unusable when shipped +generated files such as `configure' are involved. Use GNU `make' +instead. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its `' header file. The option `-nodtk' can be used as +a workaround. If GNU CC is not installed, it is therefore recommended +to try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + + On Solaris, don't put `/usr/ucb' early in your `PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in `/usr/bin'. So, if you need `/usr/ucb' +in your `PATH', put it _after_ `/usr/bin'. + + On Haiku, software installed for all users goes in `/boot/common', +not `/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS + KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf limitation. Until the limitation is lifted, you can use +this workaround: + + CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of all of the options to `configure', and exit. + +`--help=short' +`--help=recursive' + Print a summary of the options unique to this package's + `configure', and exit. The `short' variant lists options used + only in the top level, while the `recursive' variant lists options + also present in any nested packages. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--prefix=DIR' + Use DIR as the installation prefix. *note Installation Names:: + for more details, including other options available for fine-tuning + the installation locations. + +`--no-create' +`-n' + Run the configure checks, but stop before creating any output + files. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. diff --git a/libs/shapelib/Makefile.am b/libs/shapelib/Makefile.am new file mode 100644 index 0000000..2d22cc6 --- /dev/null +++ b/libs/shapelib/Makefile.am @@ -0,0 +1,76 @@ +## Process this file with automake to produce Makefile.in + +SUBDIRS = . contrib + +ACLOCAL_AMFLAGS = -I m4 +AUTOMAKE_OPTIONS = dist-zip + +if PLATFORM_WIN32 +no_undefined = -no-undefined +endif + +# Extra files to distribute in the source tarball +EXTRA_DIST = makefile.vc CMakeLists.txt autogen.sh \ + tests/test1.sh tests/test2.sh tests/test3.sh \ + tests/stream1.out tests/stream1.out tests/stream1.out \ + web/maptools.css \ + web/codepage.html \ + web/index.html \ + web/shapelib-tools.html \ + web/shp_api.html \ + web/release.html \ + web/dbf_api.html \ + web/license.html \ + web/manifest.html \ + README.tree README.CMake + +# pkg-config file +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = shapelib.pc + +# Library +lib_LTLIBRARIES = libshp.la +libshp_la_includedir = $(includedir) +libshp_la_include_HEADERS = shapefil.h +libshp_la_SOURCES = shpopen.c dbfopen.c safileio.c shptree.c sbnsearch.c +libshp_la_LDFLAGS = -version-info $(SHAPELIB_SO_VERSION) $(no_undefined) $(LIBM) + +# Installed executables +bin_PROGRAMS = dbfadd dbfcreate dbfdump shpadd shpcreate shpdump shprewind shptreedump shputils + +dbfadd_SOURCES = dbfadd.c +dbfadd_LDADD = $(top_builddir)/libshp.la + +dbfcreate_SOURCES = dbfcreate.c +dbfcreate_LDADD = $(top_builddir)/libshp.la + +dbfdump_SOURCES = dbfdump.c +dbfdump_LDADD = $(top_builddir)/libshp.la + +shpadd_SOURCES = shpadd.c +shpadd_LDADD = $(top_builddir)/libshp.la + +shpcreate_SOURCES = shpcreate.c +shpcreate_LDADD = $(top_builddir)/libshp.la + +shpdump_SOURCES = shpdump.c +shpdump_LDADD = $(top_builddir)/libshp.la + +shprewind_SOURCES = shprewind.c +shprewind_LDADD = $(top_builddir)/libshp.la + +shptreedump_SOURCES = shptreedump.c +shptreedump_LDADD = $(top_builddir)/libshp.la + +shputils_SOURCES = shputils.c +shputils_LDADD = $(top_builddir)/libshp.la + +# Non-installed executables +noinst_PROGRAMS = shptest +shptest_SOURCES = shptest.c +shptest_LDADD = $(top_builddir)/libshp.la + +# Tests +TESTS_ENVIRONMENT = top_builddir=$(abs_top_builddir) +# tests/test1.sh requires ftp://gdal.velocet.ca/pub/outgoing/shape_eg_data.zip +TESTS = tests/test2.sh tests/test3.sh diff --git a/libs/shapelib/Makefile.in b/libs/shapelib/Makefile.in new file mode 100644 index 0000000..39629e8 --- /dev/null +++ b/libs/shapelib/Makefile.in @@ -0,0 +1,1558 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = dbfadd$(EXEEXT) dbfcreate$(EXEEXT) dbfdump$(EXEEXT) \ + shpadd$(EXEEXT) shpcreate$(EXEEXT) shpdump$(EXEEXT) \ + shprewind$(EXEEXT) shptreedump$(EXEEXT) shputils$(EXEEXT) +noinst_PROGRAMS = shptest$(EXEEXT) +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(libshp_la_include_HEADERS) \ + $(am__DIST_COMMON) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_CLEAN_FILES = shapelib.pc +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ + "$(DESTDIR)$(pkgconfigdir)" \ + "$(DESTDIR)$(libshp_la_includedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +libshp_la_LIBADD = +am_libshp_la_OBJECTS = shpopen.lo dbfopen.lo safileio.lo shptree.lo \ + sbnsearch.lo +libshp_la_OBJECTS = $(am_libshp_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libshp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libshp_la_LDFLAGS) $(LDFLAGS) -o $@ +PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) +am_dbfadd_OBJECTS = dbfadd.$(OBJEXT) +dbfadd_OBJECTS = $(am_dbfadd_OBJECTS) +dbfadd_DEPENDENCIES = $(top_builddir)/libshp.la +am_dbfcreate_OBJECTS = dbfcreate.$(OBJEXT) +dbfcreate_OBJECTS = $(am_dbfcreate_OBJECTS) +dbfcreate_DEPENDENCIES = $(top_builddir)/libshp.la +am_dbfdump_OBJECTS = dbfdump.$(OBJEXT) +dbfdump_OBJECTS = $(am_dbfdump_OBJECTS) +dbfdump_DEPENDENCIES = $(top_builddir)/libshp.la +am_shpadd_OBJECTS = shpadd.$(OBJEXT) +shpadd_OBJECTS = $(am_shpadd_OBJECTS) +shpadd_DEPENDENCIES = $(top_builddir)/libshp.la +am_shpcreate_OBJECTS = shpcreate.$(OBJEXT) +shpcreate_OBJECTS = $(am_shpcreate_OBJECTS) +shpcreate_DEPENDENCIES = $(top_builddir)/libshp.la +am_shpdump_OBJECTS = shpdump.$(OBJEXT) +shpdump_OBJECTS = $(am_shpdump_OBJECTS) +shpdump_DEPENDENCIES = $(top_builddir)/libshp.la +am_shprewind_OBJECTS = shprewind.$(OBJEXT) +shprewind_OBJECTS = $(am_shprewind_OBJECTS) +shprewind_DEPENDENCIES = $(top_builddir)/libshp.la +am_shptest_OBJECTS = shptest.$(OBJEXT) +shptest_OBJECTS = $(am_shptest_OBJECTS) +shptest_DEPENDENCIES = $(top_builddir)/libshp.la +am_shptreedump_OBJECTS = shptreedump.$(OBJEXT) +shptreedump_OBJECTS = $(am_shptreedump_OBJECTS) +shptreedump_DEPENDENCIES = $(top_builddir)/libshp.la +am_shputils_OBJECTS = shputils.$(OBJEXT) +shputils_OBJECTS = $(am_shputils_OBJECTS) +shputils_DEPENDENCIES = $(top_builddir)/libshp.la +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libshp_la_SOURCES) $(dbfadd_SOURCES) $(dbfcreate_SOURCES) \ + $(dbfdump_SOURCES) $(shpadd_SOURCES) $(shpcreate_SOURCES) \ + $(shpdump_SOURCES) $(shprewind_SOURCES) $(shptest_SOURCES) \ + $(shptreedump_SOURCES) $(shputils_SOURCES) +DIST_SOURCES = $(libshp_la_SOURCES) $(dbfadd_SOURCES) \ + $(dbfcreate_SOURCES) $(dbfdump_SOURCES) $(shpadd_SOURCES) \ + $(shpcreate_SOURCES) $(shpdump_SOURCES) $(shprewind_SOURCES) \ + $(shptest_SOURCES) $(shptreedump_SOURCES) $(shputils_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +DATA = $(pkgconfig_DATA) +HEADERS = $(libshp_la_include_HEADERS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + cscope check recheck distdir dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +RECHECK_LOGS = $(TEST_LOGS) +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/shapelib.pc.in \ + AUTHORS COPYING ChangeLog INSTALL NEWS README ar-lib compile \ + config.guess config.sub depcomp install-sh ltmain.sh missing \ + test-driver +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +DIST_ARCHIVES = $(distdir).tar.gz $(distdir).zip +GZIP_ENV = --best +DIST_TARGETS = dist-gzip dist-zip +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROJ_CFLAGS = @PROJ_CFLAGS@ +PROJ_LIBS = @PROJ_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPELIB_SO_VERSION = @SHAPELIB_SO_VERSION@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = . contrib +ACLOCAL_AMFLAGS = -I m4 +AUTOMAKE_OPTIONS = dist-zip +@PLATFORM_WIN32_TRUE@no_undefined = -no-undefined + +# Extra files to distribute in the source tarball +EXTRA_DIST = makefile.vc CMakeLists.txt autogen.sh \ + tests/test1.sh tests/test2.sh tests/test3.sh \ + tests/stream1.out tests/stream1.out tests/stream1.out \ + web/maptools.css \ + web/codepage.html \ + web/index.html \ + web/shapelib-tools.html \ + web/shp_api.html \ + web/release.html \ + web/dbf_api.html \ + web/license.html \ + web/manifest.html \ + README.tree README.CMake + + +# pkg-config file +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = shapelib.pc + +# Library +lib_LTLIBRARIES = libshp.la +libshp_la_includedir = $(includedir) +libshp_la_include_HEADERS = shapefil.h +libshp_la_SOURCES = shpopen.c dbfopen.c safileio.c shptree.c sbnsearch.c +libshp_la_LDFLAGS = -version-info $(SHAPELIB_SO_VERSION) $(no_undefined) $(LIBM) +dbfadd_SOURCES = dbfadd.c +dbfadd_LDADD = $(top_builddir)/libshp.la +dbfcreate_SOURCES = dbfcreate.c +dbfcreate_LDADD = $(top_builddir)/libshp.la +dbfdump_SOURCES = dbfdump.c +dbfdump_LDADD = $(top_builddir)/libshp.la +shpadd_SOURCES = shpadd.c +shpadd_LDADD = $(top_builddir)/libshp.la +shpcreate_SOURCES = shpcreate.c +shpcreate_LDADD = $(top_builddir)/libshp.la +shpdump_SOURCES = shpdump.c +shpdump_LDADD = $(top_builddir)/libshp.la +shprewind_SOURCES = shprewind.c +shprewind_LDADD = $(top_builddir)/libshp.la +shptreedump_SOURCES = shptreedump.c +shptreedump_LDADD = $(top_builddir)/libshp.la +shputils_SOURCES = shputils.c +shputils_LDADD = $(top_builddir)/libshp.la +shptest_SOURCES = shptest.c +shptest_LDADD = $(top_builddir)/libshp.la + +# Tests +TESTS_ENVIRONMENT = top_builddir=$(abs_top_builddir) +# tests/test1.sh requires ftp://gdal.velocet.ca/pub/outgoing/shape_eg_data.zip +TESTS = tests/test2.sh tests/test3.sh +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): +shapelib.pc: $(top_builddir)/config.status $(srcdir)/shapelib.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +libshp.la: $(libshp_la_OBJECTS) $(libshp_la_DEPENDENCIES) $(EXTRA_libshp_la_DEPENDENCIES) + $(AM_V_CCLD)$(libshp_la_LINK) -rpath $(libdir) $(libshp_la_OBJECTS) $(libshp_la_LIBADD) $(LIBS) +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +dbfadd$(EXEEXT): $(dbfadd_OBJECTS) $(dbfadd_DEPENDENCIES) $(EXTRA_dbfadd_DEPENDENCIES) + @rm -f dbfadd$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(dbfadd_OBJECTS) $(dbfadd_LDADD) $(LIBS) + +dbfcreate$(EXEEXT): $(dbfcreate_OBJECTS) $(dbfcreate_DEPENDENCIES) $(EXTRA_dbfcreate_DEPENDENCIES) + @rm -f dbfcreate$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(dbfcreate_OBJECTS) $(dbfcreate_LDADD) $(LIBS) + +dbfdump$(EXEEXT): $(dbfdump_OBJECTS) $(dbfdump_DEPENDENCIES) $(EXTRA_dbfdump_DEPENDENCIES) + @rm -f dbfdump$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(dbfdump_OBJECTS) $(dbfdump_LDADD) $(LIBS) + +shpadd$(EXEEXT): $(shpadd_OBJECTS) $(shpadd_DEPENDENCIES) $(EXTRA_shpadd_DEPENDENCIES) + @rm -f shpadd$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shpadd_OBJECTS) $(shpadd_LDADD) $(LIBS) + +shpcreate$(EXEEXT): $(shpcreate_OBJECTS) $(shpcreate_DEPENDENCIES) $(EXTRA_shpcreate_DEPENDENCIES) + @rm -f shpcreate$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shpcreate_OBJECTS) $(shpcreate_LDADD) $(LIBS) + +shpdump$(EXEEXT): $(shpdump_OBJECTS) $(shpdump_DEPENDENCIES) $(EXTRA_shpdump_DEPENDENCIES) + @rm -f shpdump$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shpdump_OBJECTS) $(shpdump_LDADD) $(LIBS) + +shprewind$(EXEEXT): $(shprewind_OBJECTS) $(shprewind_DEPENDENCIES) $(EXTRA_shprewind_DEPENDENCIES) + @rm -f shprewind$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shprewind_OBJECTS) $(shprewind_LDADD) $(LIBS) + +shptest$(EXEEXT): $(shptest_OBJECTS) $(shptest_DEPENDENCIES) $(EXTRA_shptest_DEPENDENCIES) + @rm -f shptest$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shptest_OBJECTS) $(shptest_LDADD) $(LIBS) + +shptreedump$(EXEEXT): $(shptreedump_OBJECTS) $(shptreedump_DEPENDENCIES) $(EXTRA_shptreedump_DEPENDENCIES) + @rm -f shptreedump$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shptreedump_OBJECTS) $(shptreedump_LDADD) $(LIBS) + +shputils$(EXEEXT): $(shputils_OBJECTS) $(shputils_DEPENDENCIES) $(EXTRA_shputils_DEPENDENCIES) + @rm -f shputils$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shputils_OBJECTS) $(shputils_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbfadd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbfcreate.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbfdump.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbfopen.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/safileio.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sbnsearch.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpadd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpcreate.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpdump.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpopen.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shprewind.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shptest.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shptree.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shptreedump.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shputils.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool config.lt +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) +install-libshp_la_includeHEADERS: $(libshp_la_include_HEADERS) + @$(NORMAL_INSTALL) + @list='$(libshp_la_include_HEADERS)'; test -n "$(libshp_la_includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(libshp_la_includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libshp_la_includedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(libshp_la_includedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(libshp_la_includedir)" || exit $$?; \ + done + +uninstall-libshp_la_includeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(libshp_la_include_HEADERS)'; test -n "$(libshp_la_includedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(libshp_la_includedir)'; $(am__uninstall_files_from_dir) + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +tests/test2.sh.log: tests/test2.sh + @p='tests/test2.sh'; \ + b='tests/test2.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tests/test3.sh.log: tests/test3.sh + @p='tests/test3.sh'; \ + b='tests/test3.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__post_remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__post_remove_distdir) +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-recursive +all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA) $(HEADERS) +install-binPROGRAMS: install-libLTLIBRARIES + +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(libshp_la_includedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ + clean-libtool clean-noinstPROGRAMS mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-libshp_la_includeHEADERS \ + install-pkgconfigDATA + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-binPROGRAMS install-libLTLIBRARIES + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-libLTLIBRARIES \ + uninstall-libshp_la_includeHEADERS uninstall-pkgconfigDATA + +.MAKE: $(am__recursive_targets) check-am install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--refresh check check-TESTS check-am clean clean-binPROGRAMS \ + clean-cscope clean-generic clean-libLTLIBRARIES clean-libtool \ + clean-noinstPROGRAMS cscope cscopelist-am ctags ctags-am dist \ + dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ + dist-xz dist-zip distcheck distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags \ + distcleancheck distdir distuninstallcheck dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-libLTLIBRARIES \ + install-libshp_la_includeHEADERS install-man install-pdf \ + install-pdf-am install-pkgconfigDATA install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \ + uninstall uninstall-am uninstall-binPROGRAMS \ + uninstall-libLTLIBRARIES uninstall-libshp_la_includeHEADERS \ + uninstall-pkgconfigDATA + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/libs/shapelib/NEWS b/libs/shapelib/NEWS new file mode 100644 index 0000000..70ba85d --- /dev/null +++ b/libs/shapelib/NEWS @@ -0,0 +1,2 @@ +See ChangeLog + diff --git a/libs/shapelib/README b/libs/shapelib/README new file mode 100644 index 0000000..81af4b1 --- /dev/null +++ b/libs/shapelib/README @@ -0,0 +1,25 @@ + +Building on Unix +---------------- + +1) run ./configure to generate build scripts + Note: type ./configure --help for a list of fine-tuning options + +2) type "make" + +3) type "make check" to perform self-tests + +4) type "make install" to install + + +Building on Windows +------------------- + +If you have run the VC++ VCVARS32.BAT, you should be able to type the +following in a command window to build the code and executables: + +C:> nmake /f makefile.vc + +Otherwise create your own VC++ project. There aren't many files to deal with +here! + diff --git a/libs/shapelib/README.CMake b/libs/shapelib/README.CMake new file mode 100644 index 0000000..de3ff24 --- /dev/null +++ b/libs/shapelib/README.CMake @@ -0,0 +1,63 @@ +The CMakeLists.txt file in the current directory is a complete build +system for shapelib which does everything that the shapelib Makefile +does and Linux and the shapelib makefile.vc file does on Windows with +a lot more flexibility. For example, full testing can be done with +the present CMake-based approach because an optional and configurable +location is used for the downloadable (for example, wget +http://dl.maptools.org/dl/shapelib/shape_eg_data.zip) eg_data tree +that is used for all the "stream1" tests. + +To use this build system on Unix or MinGW/MSYS/Windows: + +(1) (Optional) Download eg_data from the location above. + +(2) Download shapelib-1.3.0.tar.gz from http://download.osgeo.org/shapelib +and unpack it + +(3) Copy the CMakeLists.txt file into the top-level of the unpacked +shapelib-1.3.0 source tree. + +(4) Apply shapelib.patch (which optionally quiets error messages when +shapelib is unable to open shapefiles). First change directory +to the top-level of the shapelib-1.3.0 source tree, then + +patch -p1 < + +(5) Create a separate empty build tree and use it to configure, build, +install and test shapelib. For example (you will need to tailor the +compiler, compile options, install prefix, eg_data location, and source tree location to your own +needs): + +mkdir build_dir +cd build_dir + +# Configure with the compiler and compiler options of your choice. +# N.B. the gcc -fvisibility=hidden option not (yet) supported by shapelib. +env CC=gcc CFLAGS="-O3 -Wuninitialized" \ +cmake \ +-G "Unix Makefiles" \ +-DCMAKE_INSTALL_PREFIX=/home/software/shapelib/install \ +-DEG_DATA:PATH=/home/software/shapefile/eg_data/ \ +../shapelib-1.3.0 >& cmake.out + +# Build and install +make VERBOSE=1 -j4 install >& install.out + +# Test +ctest + +The -DEG_DATA:PATH option is optional, but if you don't specify +the eg_data directory that way the stream1 tests will be dropped. + +Note the above procedure is what you should do on a Unix platform like +Linux where the generator -G "Unix Makefiles" works well. On +MINGW/MSYS the procedure is essentially the same except you should use +the -G "MSYS Makefiles" cmake option instead to specify a good generator +for that platform. + +I have used variants of the above procedure to create, test, and +install shapelib on both the Linux and MinGW/MSYS/Wine platforms. +Furthermore, on both platforms I have built and tested PLplot using +the installed versions created by the above procedure. No issues were +discovered with PLplot example 19 (which demos PLplot map capabilities with +map shapefiles) for these two separate platform tests. diff --git a/libs/shapelib/README.tree b/libs/shapelib/README.tree new file mode 100644 index 0000000..434c648 --- /dev/null +++ b/libs/shapelib/README.tree @@ -0,0 +1,172 @@ +Venkat, + +I have completed the planned Shapefile quadtree mechanism. The additions +to the traditional Shapelib are found in shptree.c (functions supporting +quad tree searching and query). There are also some new prototypes for +the tree stuff in shapefil.h ... including some prototypes for functions +you don't require and hence that I haven't implemented at this time. + +I have also prepared a demonstration program using the API. That is +the ``shpdumptree'' program, with the source code in shpdumptree.c. The +shpdumptree program has two functions. One is to dump an ASCII rendering +of the internal quadtree, and the other is example use of a quad tree +searching function. + +Dumping the Tree +---------------- + +The tree dumping is done as shown below. The "-maxdepth" commandline +switch can be used to control the maximum depth, otherwise it internally +computes a ``reasonable depth'' to use based on the number of structures +in the shapefile. + +warmerda@gdal[207]% shptreedump -maxdepth 6 eg_data/polygon.shp +( SHPTreeNode + Min = (471127.19,4751545.00) + Max = (489292.31,4765610.50) + Shapes(0): + ( SHPTreeNode + Min = (471127.19,4751545.00) + Max = (481118.01,4765610.50) + Shapes(0): + ( SHPTreeNode + Min = (471127.19,4751545.00) + Max = (481118.01,4759281.03) + Shapes(0): + ( SHPTreeNode + Min = (471127.19,4751545.00) + Max = (476622.14,4759281.03) + Shapes(0): + ( SHPTreeNode + Min = (471127.19,4751545.00) + Max = (476622.14,4755799.81) + Shapes(0): + ( SHPTreeNode + Min = (471127.19,4751545.00) + Max = (474149.41,4755799.81) + Shapes(6): 395 397 402 404 405 422 + ) + ( SHPTreeNode + Min = (473599.92,4751545.00) + Max = (476622.14,4755799.81) + Shapes(10): 392 394 403 413 414 417 426 433 434 447 + ) + ) +... + +A structure like the following represents one node in the tree. In +this case it cover the region of 473599.92 < X < 476622.14,and +4751545.0 < Y < 4755799.81. There are ten shapes within this region +who's shapeids are 392, 394 ... 447. This node has no children nodes. + + ( SHPTreeNode + Min = (473599.92,4751545.00) + Max = (476622.14,4755799.81) + Shapes(10): 392 394 403 413 414 417 426 433 434 447 + ) + +The heirarchy of indentation is intended to show the parent, child +relationship between nodes, with the tree being deeper the further to the +right you go. + +The `-v' flag to the program can be used to expand the report to include +the full information about shapes, not just their shapeid. This can result +in a report looking more like this: + + ... + ( SHPTreeNode + Min = (478095.78,4751545.00) + Max = (481118.01,4755799.81) + Shapes(3): + ( Shape + ShapeId = 448 + Min = (479988.09,4753300.00) + Max = (480705.59,4754236.50) + Vertex[0] = (480136.59,4754174.50) + Vertex[1] = (480229.97,4754182.00) + Vertex[2] = (480370.09,4754200.50) + Vertex[3] = (480695.12,4754236.50) + Vertex[4] = (480687.97,4754129.50) + Vertex[5] = (480650.47,4754075.50) + Vertex[6] = (480520.62,4753948.00) + Vertex[7] = (480490.00,4753900.00) + Vertex[8] = (480499.78,4753840.50) + Vertex[9] = (480500.97,4753820.50) + Vertex[10] = (480534.75,4753660.50) + Vertex[11] = (480560.00,4753565.00) + Vertex[12] = (480574.91,4753550.50) + ... + +While it is possible to part the output of the shptreedump program, and +insert it into your database, my intention was that the shptreedump program +would serve as an example of how to pre-order traversal of the quad tree, +and collect the information you will need to insert into your database. +I would then expect you to write a new program based on shptreedump that +calls a C API for your database to insert objects instead of printing them +out. Alternatively there may be an ASCII format for loading tables that +you could modify the program to output. + +Searching +--------- + +The other thing that you can do with the shptreedump program is to +perform a search on the quadtree. For instance the following shows +searching on a small region. + +% shptreedump -search 471127 4751545 476622 4759281 eg_data/polygon.shp +Shape 17: not in area of interest, but fetched. +Shape 31: not in area of interest, but fetched. +Shape 52: not in area of interest, but fetched. +Shape 76: not in area of interest, but fetched. +Shape 82: not in area of interest, but fetched. +Shape 104: not in area of interest, but fetched. +Shape 124: not in area of interest, but fetched. +Shape 134: not in area of interest, but fetched. +Shape 139: not in area of interest, but fetched. +Shape 154: not in area of interest, but fetched. +Shape 175: not in area of interest, but fetched. +Shape 177: not in area of interest, but fetched. +Shape 185: not in area of interest, but fetched. +Shape 192: not in area of interest, but fetched. +Shape 196: appears to be in area of interest. +.... + + +I have included this capability (and the SHPTreeFindLikelyShapes() function) +so that you can see a working example of how to search this quad tree. +Note that searching is a multi-stage affair. + +First a pass is made over the quadtree, collecting the shapeids of all +shapes contained in a quadtree node for which the bounding rectangle overlaps +the search rectangle. This is all accomplished by SHPTreeFindLikelyShapes() +in shptree.c. + +The second phase is to fetch the actual shapes, and verify if their bounding +box falls within the area of interest. This is necessary because the shape +will tend to have a significantly smaller bounding rectangle than the tree +node in which it is found. This can result ``false positives'' on the first +phase search, as indicated by teh ``not in area of interest, but fetched'' +messages above. This stage is done in the SHPTreeNodeSearchAndDump() +function in shptreedump.c. + +A possible third phase is to verify that the actualy line segments in the +shape actually cross the area of interest. I don't both with this as it +is complicated, and assuming that the drawing engine takes care of clipping +it is quite a bit easier to let it fall through. + +Building +-------- + +I have added a makefile.vc to the shapelib distribution. After you have +unpacked the shapefile you should have a shapelib subdirectory. If you +cd to that directory, and enter ``nmake -f makefile.vc'' in a DOS window +you should be able to build everything with VC++ (assuming it is properly +installed and in your path). + +You can also create a project in VC just including the files +shpopen.c, shptree.c and shptreedump.c, building as a Win32 console +application. + +For your convenience I am including prebuild .obj files, and .exe files +in the distribution. + diff --git a/libs/shapelib/aclocal.m4 b/libs/shapelib/aclocal.m4 new file mode 100644 index 0000000..110817d --- /dev/null +++ b/libs/shapelib/aclocal.m4 @@ -0,0 +1,1217 @@ +# generated automatically by aclocal 1.15 -*- Autoconf -*- + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +# Copyright (C) 2002-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.15' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.15], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.15])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# Copyright (C) 2011-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_AR([ACT-IF-FAIL]) +# ------------------------- +# Try to determine the archiver interface, and trigger the ar-lib wrapper +# if it is needed. If the detection of archiver interface fails, run +# ACT-IF-FAIL (default is to abort configure with a proper error message). +AC_DEFUN([AM_PROG_AR], +[AC_BEFORE([$0], [LT_INIT])dnl +AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([ar-lib])dnl +AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false]) +: ${AR=ar} + +AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface], + [AC_LANG_PUSH([C]) + am_cv_ar_interface=ar + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])], + [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([am_ar_try]) + if test "$ac_status" -eq 0; then + am_cv_ar_interface=ar + else + am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([am_ar_try]) + if test "$ac_status" -eq 0; then + am_cv_ar_interface=lib + else + am_cv_ar_interface=unknown + fi + fi + rm -f conftest.lib libconftest.a + ]) + AC_LANG_POP([C])]) + +case $am_cv_ar_interface in +ar) + ;; +lib) + # Microsoft lib, so override with the ar-lib wrapper script. + # FIXME: It is wrong to rewrite AR. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__AR in this case, + # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something + # similar. + AR="$am_aux_dir/ar-lib $AR" + ;; +unknown) + m4_default([$1], + [AC_MSG_ERROR([could not determine $AR interface])]) + ;; +esac +AC_SUBST([AR])dnl +]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each '.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.65])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +# +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([m4/libtool.m4]) +m4_include([m4/ltoptions.m4]) +m4_include([m4/ltsugar.m4]) +m4_include([m4/ltversion.m4]) +m4_include([m4/lt~obsolete.m4]) diff --git a/libs/shapelib/ar-lib b/libs/shapelib/ar-lib new file mode 100755 index 0000000..463b9ec --- /dev/null +++ b/libs/shapelib/ar-lib @@ -0,0 +1,270 @@ +#! /bin/sh +# Wrapper for Microsoft lib.exe + +me=ar-lib +scriptversion=2012-03-01.08; # UTC + +# Copyright (C) 2010-2014 Free Software Foundation, Inc. +# Written by Peter Rosin . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + + +# func_error message +func_error () +{ + echo "$me: $1" 1>&2 + exit 1 +} + +file_conv= + +# func_file_conv build_file +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv in + mingw) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_at_file at_file operation archive +# Iterate over all members in AT_FILE performing OPERATION on ARCHIVE +# for each of them. +# When interpreting the content of the @FILE, do NOT use func_file_conv, +# since the user would need to supply preconverted file names to +# binutils ar, at least for MinGW. +func_at_file () +{ + operation=$2 + archive=$3 + at_file_contents=`cat "$1"` + eval set x "$at_file_contents" + shift + + for member + do + $AR -NOLOGO $operation:"$member" "$archive" || exit $? + done +} + +case $1 in + '') + func_error "no command. Try '$0 --help' for more information." + ;; + -h | --h*) + cat < /dev/null 2>&1 || { + echo "**Error**: You must have \`libtool' installed." + echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/" + echo + exit 1 +} + +(autoreconf --version) < /dev/null > /dev/null 2>&1 || { + echo "**Error**: You must have \`autoreconf' installed." + echo "Download the appropriate package for your distribution," + echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" + echo + exit 1 +} + + +( + cd "$srcdir" + echo "Running autoreconf..." + autoreconf -fiv +) + + +if test x$NOCONFIGURE = x; then + echo Running $srcdir/configure "$@" ... + $srcdir/configure "$@" \ + && echo Now type \`make\' to compile. || exit 1 +else + echo Skipping configure process. +fi diff --git a/libs/shapelib/compile b/libs/shapelib/compile new file mode 100755 index 0000000..a85b723 --- /dev/null +++ b/libs/shapelib/compile @@ -0,0 +1,347 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2012-10-14.11; # UTC + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/libs/shapelib/config.guess b/libs/shapelib/config.guess new file mode 100755 index 0000000..1659250 --- /dev/null +++ b/libs/shapelib/config.guess @@ -0,0 +1,1441 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2015 Free Software Foundation, Inc. + +timestamp='2015-08-20' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# +# Please send patches to . + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2015 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "${UNAME_SYSTEM}" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval $set_cc_for_build + cat <<-EOF > $dummy.c + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + /sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || \ + echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'` + machine=${arch}${endian}-unknown + ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # Determine ABI tags. + case "${UNAME_MACHINE_ARCH}" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"` + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}${abi}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:Sortix:*:*) + echo ${UNAME_MACHINE}-unknown-sortix + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case ${UNAME_PROCESSOR} in + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW64*:*) + echo ${UNAME_MACHINE}-pc-mingw64 + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + *:MSYS*:*) + echo ${UNAME_MACHINE}-pc-msys + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + aarch64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="gnulibc1" ; fi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi + else + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + cris:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + crisv32:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + e2k:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + frv:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + hexagon:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:Linux:*:*) + echo ${UNAME_MACHINE}-pc-linux-${LIBC} + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } + ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-${LIBC} + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-${LIBC} + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-${LIBC} + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; + PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; + *) echo hppa-unknown-linux-${LIBC} ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-${LIBC} + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-${LIBC} + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-${LIBC} + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-${LIBC} + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux-${LIBC} + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + tile*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-${LIBC} + exit ;; + x86_64:Linux:*:*) + echo ${UNAME_MACHINE}-pc-linux-${LIBC} + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + eval $set_cc_for_build + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-?:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk${UNAME_RELEASE} + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo ${UNAME_MACHINE}-unknown-esx + exit ;; +esac + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/libs/shapelib/config.sub b/libs/shapelib/config.sub new file mode 100755 index 0000000..1acc966 --- /dev/null +++ b/libs/shapelib/config.sub @@ -0,0 +1,1813 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2015 Free Software Foundation, Inc. + +timestamp='2015-08-20' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2015 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + android-linux) + os=-linux-android + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze*) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | ba \ + | be32 | be64 \ + | bfin \ + | c4x | c8051 | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | e2k | epiphany \ + | fido | fr30 | frv | ft32 \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | k1om \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 | nios2eb | nios2el \ + | ns16k | ns32k \ + | open8 | or1k | or1knd | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pyramid \ + | riscv32 | riscv64 \ + | rl78 | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | visium \ + | we32k \ + | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + leon|leon[3-9]) + basic_machine=sparc-$basic_machine + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + strongarm | thumb | xscale) + basic_machine=arm-unknown + ;; + xgate) + basic_machine=$basic_machine-unknown + os=-none + ;; + xscaleeb) + basic_machine=armeb-unknown + ;; + + xscaleel) + basic_machine=armel-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | ba-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | e2k-* | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | k1om-* \ + | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa32r6-* | mipsisa32r6el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64r6-* | mipsisa64r6el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipsr5900-* | mipsr5900el-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* | nios2eb-* | nios2el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | or1k*-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pyramid-* \ + | riscv32-* | riscv64-* \ + | rl78-* | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile*-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ + | vax-* \ + | visium-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + asmjs) + basic_machine=asmjs-unknown + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16 | cr16-*) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + leon-*|leon[3-9]-*) + basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze*) + basic_machine=microblaze-xilinx + ;; + mingw64) + basic_machine=x86_64-pc + os=-mingw64 + ;; + mingw32) + basic_machine=i686-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + moxiebox) + basic_machine=moxie-unknown + os=-moxiebox + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + msys) + basic_machine=i686-pc + os=-msys + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + nacl) + basic_machine=le32-unknown + os=-nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + neo-tandem) + basic_machine=neo-tandem + ;; + nse-tandem) + basic_machine=nse-tandem + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc | ppcbe) basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tile*) + basic_machine=$basic_machine-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* | -plan9* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* | -cloudabi* | -sortix* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -bitrig* | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -nacl*) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + c8051-*) + os=-elf + ;; + hexagon-*) + os=-elf + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/libs/shapelib/configure b/libs/shapelib/configure new file mode 100755 index 0000000..0ceb379 --- /dev/null +++ b/libs/shapelib/configure @@ -0,0 +1,19184 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for shapelib 1.4.1. +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='shapelib' +PACKAGE_TARNAME='shapelib' +PACKAGE_VERSION='1.4.1' +PACKAGE_STRING='shapelib 1.4.1' +PACKAGE_BUGREPORT='' +PACKAGE_URL='' + +ac_unique_file="shapefil.h" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +PLATFORM_WIN32_FALSE +PLATFORM_WIN32_TRUE +LIBM +PROJ_LIBS +PROJ_CFLAGS +CXXCPP +CPP +LT_SYS_LIBRARY_PATH +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +DLLTOOL +OBJDUMP +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +EGREP +GREP +SED +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +LIBTOOL +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +SHAPELIB_SO_VERSION +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +ac_ct_AR +AR +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +runstatedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_dependency_tracking +enable_shared +enable_static +with_pic +enable_fast_install +with_aix_soname +with_gnu_ld +with_sysroot +enable_libtool_lock +with_proj_cflags +with_proj_libs +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CXX +CXXFLAGS +CCC +LT_SYS_LIBRARY_PATH +CPP +CXXCPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir runstatedir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures shapelib 1.4.1 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/shapelib] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of shapelib 1.4.1:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use + both] + --with-aix-soname=aix|svr4|both + shared library versioning (aka "SONAME") variant to + provide on AIX, [default=aix]. + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-sysroot[=DIR] Search for dependent libraries within DIR (or the + compiler's sysroot if not specified). + --with-proj-cflags CFLAGS for the PROJ.4 headers + --with-proj-libs LIBS for the PROJ.4 libraries + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CXX C++ compiler command + CXXFLAGS C++ compiler flags + LT_SYS_LIBRARY_PATH + User-defined run-time library search path. + CPP C preprocessor + CXXCPP C++ preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +shapelib configure 1.4.1 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_cxx_try_cpp LINENO +# ------------------------ +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_cpp + +# ac_fn_cxx_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_link +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by shapelib $as_me 1.4.1, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + +am__api_version='1.15' + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='shapelib' + VERSION='1.4.1' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=0;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar lib "link -lib" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar lib "link -lib" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5 +$as_echo_n "checking the archiver ($AR) interface... " >&6; } +if ${am_cv_ar_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + am_cv_ar_interface=ar + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int some_variable = 0; +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 + (eval $am_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + am_cv_ar_interface=ar + else + am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 + (eval $am_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + am_cv_ar_interface=lib + else + am_cv_ar_interface=unknown + fi + fi + rm -f conftest.lib libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5 +$as_echo "$am_cv_ar_interface" >&6; } + +case $am_cv_ar_interface in +ar) + ;; +lib) + # Microsoft lib, so override with the ar-lib wrapper script. + # FIXME: It is wrong to rewrite AR. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__AR in this case, + # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something + # similar. + AR="$am_aux_dir/ar-lib $AR" + ;; +unknown) + as_fn_error $? "could not determine $AR interface" "$LINENO" 5 + ;; +esac + + +SHAPELIB_SO_VERSION=2:2:0 + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.6' +macro_revision='2.4.6' + + + + + + + + + + + + + +ltmain=$ac_aux_dir/ltmain.sh + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case $ECHO in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n "$lt_cv_sys_max_cmd_len"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test yes != "$GCC"; then + reload_cmds=false + fi + ;; + darwin*) + if test yes = "$GCC"; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +$as_echo "$with_sysroot" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +$as_echo_n "checking for a working dd... " >&6; } +if ${ac_cv_path_lt_DD+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +if test -z "$lt_DD"; then + ac_path_lt_DD_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in dd; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_lt_DD" || continue +if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi + $ac_path_lt_DD_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_lt_DD"; then + : + fi +else + ac_cv_path_lt_DD=$lt_DD +fi + +rm -f conftest.i conftest2.i conftest.out +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +$as_echo "$ac_cv_path_lt_DD" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +$as_echo_n "checking how to truncate binary pipes... " >&6; } +if ${lt_cv_truncate_bin+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +$as_echo "$lt_cv_truncate_bin" >&6; } + + + + + + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[012][,.]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + +func_stripname_cnf () +{ + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;; + esac +} # func_stripname_cnf + + + + + +# Set options + + + + enable_dlopen=no + + + enable_win32_dll=no + + + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + # Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_static=yes +fi + + + + + + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + pic_mode=default +fi + + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[5-9]*,yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +$as_echo_n "checking which variant of shared library versioning to provide... " >&6; } + +# Check whether --with-aix-soname was given. +if test "${with_aix_soname+set}" = set; then : + withval=$with_aix_soname; case $withval in + aix|svr4|both) + ;; + *) + as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname +else + if ${lt_cv_with_aix_soname+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_with_aix_soname=aix +fi + + with_aix_soname=$lt_cv_with_aix_soname +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +$as_echo "$with_aix_soname" >&6; } + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/${ac_tool_prefix}file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC=$CC +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test yes = "$GCC"; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + lt_prog_compiler_pic='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works"; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works"; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test no = "$hard_links"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + export_dynamic_flag_spec='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='$wl--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + export_dynamic_flag_spec='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test no = "$ld_shlibs"; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct=no + hardcode_direct_absolute=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' $wl-bernotok' + allow_undefined_flag=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test yes = "$GCC"; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test yes = "$lt_cv_prog_compiler__b"; then + archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test yes = "$lt_cv_irix_exported_symbol"; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + link_all_deplibs=no + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs=yes + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + else + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + osf3*) + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='$wl-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='$wl-z,text' + allow_undefined_flag='$wl-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='$wl-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test no = "$ld_shlibs" && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([A-Za-z]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test yes = "$hardcode_automatic"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && + test no != "$hardcode_minus_L"; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test relink = "$hardcode_action" || + test yes = "$inherit_rpath"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen=shl_load +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen=dlopen +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report what library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +CC=$lt_save_CC + + if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if ${ac_cv_prog_CXXCPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +else + _lt_caught_CXX_error=yes +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +reload_flag_CXX=$reload_flag +reload_cmds_CXX=$reload_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + compiler_CXX=$CC + func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test yes = "$with_gnu_ld"; then + archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='$wl' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct_CXX=no + hardcode_direct_absolute_CXX=no + ;; + esac + + if test yes = "$GXX"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec_CXX='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + always_export_symbols_CXX=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + no_undefined_flag_CXX='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' $wl-bernotok' + allow_undefined_flag_CXX=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + fi + archive_cmds_need_lc_CXX=yes + archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_CXX=' ' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=yes + file_list_spec_CXX='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' + enable_shared_with_static_runtimes_CXX=yes + # Don't use ranlib + old_postinstall_cmds_CXX='chmod 644 $oldlib' + postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + export_dynamic_flag_spec_CXX='$wl--export-all-symbols' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec_CXX='' + fi + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + if test yes != "$lt_cv_apple_cc_single_mod"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + fi + + else + ld_shlibs_CXX=no + fi + + ;; + + os2*) + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_minus_L_CXX=yes + allow_undefined_flag_CXX=unsupported + shrext_cmds=.dll + archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes_CXX=yes + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + haiku*) + archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs_CXX=yes + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='$wl-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + export_dynamic_flag_spec_CXX='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + hardcode_libdir_separator_CXX=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5].* | *pgcpp\ [1-5].*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + old_archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object_CXX=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + ld_shlibs_CXX=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='$wl-E' + whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + ld_shlibs_CXX=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' + archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + ;; + *) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + ;; + esac + + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + no_undefined_flag_CXX=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='$wl-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_CXX='$wl-z,text' + allow_undefined_flag_CXX='$wl-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-R,$libdir' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ + '"$old_archive_cmds_CXX" + reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ + '"$reload_cmds_CXX" + ;; + *) + archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } + test no = "$ld_shlibs_CXX" && can_build_shared=no + + GCC_CXX=$GXX + LD_CXX=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF + + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX=$prev$p + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX=$prev$p + else + postdeps_CXX="${postdeps_CXX} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX=$p + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX=$p + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + + + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + lt_prog_compiler_pic_CXX='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static_CXX='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } +lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then + : +else + lt_prog_compiler_static_CXX= +fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test no = "$hard_links"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs_CXX=no + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test no = "$ld_shlibs_CXX" && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_CXX=no + else + lt_cv_archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } + archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec_CXX='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test yes = "$hardcode_automatic_CXX"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct_CXX" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" && + test no != "$hardcode_minus_L_CXX"; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +$as_echo "$hardcode_action_CXX" >&6; } + +if test relink = "$hardcode_action_CXX" || + test yes = "$inherit_rpath_CXX"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test yes != "$_lt_caught_CXX_error" + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + + +# Check whether --with-proj-cflags was given. +if test "${with_proj_cflags+set}" = set; then : + withval=$with_proj_cflags; if test "$withval" != ""; then PROJ_CFLAGS="$withval"; else PROJ_CFLAGS=""; fi +else + PROJ_CFLAGS='-DPROJ4' +fi + + + + +# Check whether --with-proj-libs was given. +if test "${with_proj_libs+set}" = set; then : + withval=$with_proj_libs; PROJ_LIBS="$withval" +else + PROJ_LIBS='-lproj' +fi + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for floor in -lm" >&5 +$as_echo_n "checking for floor in -lm... " >&6; } +if ${ac_cv_lib_m_floor+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char floor (); +int +main () +{ +return floor (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_m_floor=yes +else + ac_cv_lib_m_floor=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_floor" >&5 +$as_echo "$ac_cv_lib_m_floor" >&6; } +if test "x$ac_cv_lib_m_floor" = xyes; then : + LIBM=-lm +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for some Win32 platform" >&5 +$as_echo_n "checking for some Win32 platform... " >&6; } +case "$host" in + *-*-mingw*|*-*-cygwin*) + platform_win32=yes + ;; + *) + platform_win32=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $platform_win32" >&5 +$as_echo "$platform_win32" >&6; } + if test "$platform_win32" = "yes"; then + PLATFORM_WIN32_TRUE= + PLATFORM_WIN32_FALSE='#' +else + PLATFORM_WIN32_TRUE='#' + PLATFORM_WIN32_FALSE= +fi + + +echo +echo "Configuration summary for $PACKAGE $VERSION:" +echo " - Host: ${host}" +echo " - PROJ flags: $PROJ_CFLAGS $PROJ_LIBS" +echo + +ac_config_files="$ac_config_files Makefile contrib/Makefile shapelib.pc" + + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +ac_script=' +:mline +/\\$/{ + N + s,\\\n,, + b mline +} +t clear +:clear +s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g +t quote +s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g +t quote +b any +:quote +s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g +s/\[/\\&/g +s/\]/\\&/g +s/\$/$$/g +H +:any +${ + g + s/^\n// + s/\n/ /g + p +} +' +DEFS=`sed -n "$ac_script" confdefs.h` + + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${PLATFORM_WIN32_TRUE}" && test -z "${PLATFORM_WIN32_FALSE}"; then + as_fn_error $? "conditional \"PLATFORM_WIN32\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by shapelib $as_me 1.4.1, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + +Configuration files: +$config_files + +Configuration commands: +$config_commands + +Report bugs to the package provider." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +shapelib config.status 1.4.1 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h | --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' +configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' +predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' +predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' +postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' +reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' +reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +OBJDUMP \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +DLLTOOL \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_import \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +lt_cv_nm_interface \ +nm_file_list_spec \ +lt_cv_truncate_bin \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +reload_flag_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_static_CXX \ +lt_cv_prog_compiler_c_o_CXX \ +export_dynamic_flag_spec_CXX \ +whole_archive_flag_spec_CXX \ +compiler_needs_object_CXX \ +with_gnu_ld_CXX \ +allow_undefined_flag_CXX \ +no_undefined_flag_CXX \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_separator_CXX \ +exclude_expsyms_CXX \ +include_expsyms_CXX \ +file_list_spec_CXX \ +compiler_lib_search_dirs_CXX \ +predep_objects_CXX \ +postdep_objects_CXX \ +predeps_CXX \ +postdeps_CXX \ +compiler_lib_search_path_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +configure_time_dlsearch_path \ +configure_time_lt_sys_library_path \ +reload_cmds_CXX \ +old_archive_cmds_CXX \ +old_archive_from_new_cmds_CXX \ +old_archive_from_expsyms_cmds_CXX \ +archive_cmds_CXX \ +archive_expsym_cmds_CXX \ +module_cmds_CXX \ +module_expsym_cmds_CXX \ +export_symbols_cmds_CXX \ +prelink_cmds_CXX \ +postlink_cmds_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' + +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile' + + + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "contrib/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/Makefile" ;; + "shapelib.pc") CONFIG_FILES="$CONFIG_FILES shapelib.pc" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + + +eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +# The names of the tagged configurations supported by this script. +available_tags='CXX ' + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shared archive member basename,for filename based shared library versioning on AIX. +shared_archive_member_spec=$shared_archive_member_spec + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# An object symbol dumper. +OBJDUMP=$lt_OBJDUMP + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm into a list of symbols to manually relocate. +global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# The name lister interface. +nm_interface=$lt_lt_cv_nm_interface + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and where our libraries should be installed. +lt_sysroot=$lt_sysroot + +# Command to truncate a binary pipe. +lt_truncate_bin=$lt_lt_cv_truncate_bin + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain=$ac_aux_dir/ltmain.sh + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_CXX +reload_cmds=$lt_reload_cmds_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/libs/shapelib/configure.ac b/libs/shapelib/configure.ac new file mode 100644 index 0000000..7ec86d5 --- /dev/null +++ b/libs/shapelib/configure.ac @@ -0,0 +1,70 @@ +dnl Process this file with autoconf to produce a configure script. + +m4_define(shapelib_version_major, 1) +m4_define(shapelib_version_minor, 4) +m4_define(shapelib_version_micro, 1) + +AC_PREREQ(2.62) +AC_INIT(shapelib, shapelib_version_major.shapelib_version_minor.shapelib_version_micro) +AC_CONFIG_MACRO_DIR(m4) +AC_CONFIG_SRCDIR(shapefil.h) + +AM_INIT_AUTOMAKE([-Wall]) + +AM_SILENT_RULES([yes]) + +m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) + +dnl See http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html +AC_SUBST([SHAPELIB_SO_VERSION], [2:2:0]) + +AC_PROG_CC +AC_PROG_CXX +AM_PROG_CC_C_O +AC_LANG([C]) +AC_LANG([C++]) + +dnl ************************** Libtool initialization ************************* +LT_INIT + +dnl ********************************* Modules ********************************* +AC_ARG_WITH([proj-cflags], + [AS_HELP_STRING([--with-proj-cflags], [CFLAGS for the PROJ.4 headers])], + [if test "$withval" != ""; then PROJ_CFLAGS="$withval"; else PROJ_CFLAGS=""; fi], + [PROJ_CFLAGS='-DPROJ4']) +AC_SUBST([PROJ_CFLAGS]) + +AC_ARG_WITH([proj-libs], + [AS_HELP_STRING([--with-proj-libs], [LIBS for the PROJ.4 libraries])], + [PROJ_LIBS="$withval"], + [PROJ_LIBS='-lproj']) +AC_SUBST([PROJ_LIBS]) + +dnl ****************************** Detect libm ******************************* + +AC_CHECK_LIB(m,floor,LIBM=-lm) +AC_SUBST([LIBM]) + +dnl ****************************** Detect Win32 ******************************* +AC_MSG_CHECKING([for some Win32 platform]) +case "$host" in + *-*-mingw*|*-*-cygwin*) + platform_win32=yes + ;; + *) + platform_win32=no + ;; +esac +AC_MSG_RESULT([$platform_win32]) +AM_CONDITIONAL(PLATFORM_WIN32, test "$platform_win32" = "yes") + +dnl ********************************* Summary ********************************* +echo +echo "Configuration summary for $PACKAGE $VERSION:" +echo " - Host: ${host}" +echo " - PROJ flags: $PROJ_CFLAGS $PROJ_LIBS" +echo + +AC_CONFIG_FILES([Makefile contrib/Makefile shapelib.pc]) + +AC_OUTPUT diff --git a/libs/shapelib/contrib/Makefile.am b/libs/shapelib/contrib/Makefile.am new file mode 100644 index 0000000..d9fc8c3 --- /dev/null +++ b/libs/shapelib/contrib/Makefile.am @@ -0,0 +1,59 @@ +CONTRIB_CFLAGS = -I$(top_srcdir) -DDEBUG -DDEBUG2 + +# Extra files to distribute in the source tarball +EXTRA_DIST = makefile.vc tests/shpproj.sh doc/Shape_PointInPoly_README.txt doc/shpproj.txt doc/shpsort.txt ShapeFileII.pas + +# Installed executables +bin_PROGRAMS = dbfcat dbfinfo shpcat shpdxf shpfix shpsort Shape_PointInPoly shpcentrd shpdata shpinfo shpproj shpwkb + +dbfcat_SOURCES = dbfcat.c +dbfcat_CPPFLAGS = $(CONTRIB_CFLAGS) +dbfcat_LDADD = $(top_builddir)/libshp.la + +dbfinfo_SOURCES = dbfinfo.c +dbfinfo_CPPFLAGS = $(CONTRIB_CFLAGS) +dbfinfo_LDADD = $(top_builddir)/libshp.la + +shpcat_SOURCES = shpcat.c +shpcat_CPPFLAGS = $(CONTRIB_CFLAGS) +shpcat_LDADD = $(top_builddir)/libshp.la + +shpdxf_SOURCES = shpdxf.c +shpdxf_CPPFLAGS = $(CONTRIB_CFLAGS) +shpdxf_LDADD = $(top_builddir)/libshp.la + +shpfix_SOURCES = shpfix.c +shpfix_CPPFLAGS = $(CONTRIB_CFLAGS) +shpfix_LDADD = $(top_builddir)/libshp.la + +shpsort_SOURCES = shpsort.c +shpsort_CPPFLAGS = $(CONTRIB_CFLAGS) +shpsort_LDADD = $(top_builddir)/libshp.la -lm + +Shape_PointInPoly_SOURCES = Shape_PointInPoly.cpp +Shape_PointInPoly_CPPFLAGS = $(CONTRIB_CFLAGS) +Shape_PointInPoly_LDADD = $(top_builddir)/libshp.la + +shpcentrd_SOURCES = shpcentrd.c shpgeo.c shpgeo.h +shpcentrd_CPPFLAGS = $(CONTRIB_CFLAGS) $(PROJ_CFLAGS) +shpcentrd_LDADD = $(top_builddir)/libshp.la $(PROJ_LIBS) -lm + +shpdata_SOURCES = shpdata.c shpgeo.c shpgeo.h +shpdata_CPPFLAGS = $(CONTRIB_CFLAGS) $(PROJ_CFLAGS) +shpdata_LDADD = $(top_builddir)/libshp.la $(PROJ_LIBS) -lm + +shpinfo_SOURCES = shpinfo.c shpgeo.c shpgeo.h +shpinfo_CPPFLAGS = $(CONTRIB_CFLAGS) $(PROJ_CFLAGS) +shpinfo_LDADD = $(top_builddir)/libshp.la $(PROJ_LIBS) -lm + +shpproj_SOURCES = shpproj.c shpgeo.c shpgeo.h +shpproj_CPPFLAGS = $(CONTRIB_CFLAGS) $(PROJ_CFLAGS) +shpproj_LDADD = $(top_builddir)/libshp.la $(PROJ_LIBS) -lm + +shpwkb_SOURCES = shpwkb.c shpgeo.c shpgeo.h +shpwkb_CPPFLAGS = $(CONTRIB_CFLAGS) $(PROJ_CFLAGS) +shpwkb_LDADD = $(top_builddir)/libshp.la $(PROJ_LIBS) -lm + +# Tests +TESTS_ENVIRONMENT = top_builddir=$(abs_top_builddir) +TESTS = tests/shpproj.sh diff --git a/libs/shapelib/contrib/Makefile.in b/libs/shapelib/contrib/Makefile.in new file mode 100644 index 0000000..a037d40 --- /dev/null +++ b/libs/shapelib/contrib/Makefile.in @@ -0,0 +1,1437 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +bin_PROGRAMS = dbfcat$(EXEEXT) dbfinfo$(EXEEXT) shpcat$(EXEEXT) \ + shpdxf$(EXEEXT) shpfix$(EXEEXT) shpsort$(EXEEXT) \ + Shape_PointInPoly$(EXEEXT) shpcentrd$(EXEEXT) shpdata$(EXEEXT) \ + shpinfo$(EXEEXT) shpproj$(EXEEXT) shpwkb$(EXEEXT) +subdir = contrib +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" +PROGRAMS = $(bin_PROGRAMS) +am_Shape_PointInPoly_OBJECTS = \ + Shape_PointInPoly-Shape_PointInPoly.$(OBJEXT) +Shape_PointInPoly_OBJECTS = $(am_Shape_PointInPoly_OBJECTS) +Shape_PointInPoly_DEPENDENCIES = $(top_builddir)/libshp.la +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +am_dbfcat_OBJECTS = dbfcat-dbfcat.$(OBJEXT) +dbfcat_OBJECTS = $(am_dbfcat_OBJECTS) +dbfcat_DEPENDENCIES = $(top_builddir)/libshp.la +am_dbfinfo_OBJECTS = dbfinfo-dbfinfo.$(OBJEXT) +dbfinfo_OBJECTS = $(am_dbfinfo_OBJECTS) +dbfinfo_DEPENDENCIES = $(top_builddir)/libshp.la +am_shpcat_OBJECTS = shpcat-shpcat.$(OBJEXT) +shpcat_OBJECTS = $(am_shpcat_OBJECTS) +shpcat_DEPENDENCIES = $(top_builddir)/libshp.la +am_shpcentrd_OBJECTS = shpcentrd-shpcentrd.$(OBJEXT) \ + shpcentrd-shpgeo.$(OBJEXT) +shpcentrd_OBJECTS = $(am_shpcentrd_OBJECTS) +am__DEPENDENCIES_1 = +shpcentrd_DEPENDENCIES = $(top_builddir)/libshp.la \ + $(am__DEPENDENCIES_1) +am_shpdata_OBJECTS = shpdata-shpdata.$(OBJEXT) \ + shpdata-shpgeo.$(OBJEXT) +shpdata_OBJECTS = $(am_shpdata_OBJECTS) +shpdata_DEPENDENCIES = $(top_builddir)/libshp.la $(am__DEPENDENCIES_1) +am_shpdxf_OBJECTS = shpdxf-shpdxf.$(OBJEXT) +shpdxf_OBJECTS = $(am_shpdxf_OBJECTS) +shpdxf_DEPENDENCIES = $(top_builddir)/libshp.la +am_shpfix_OBJECTS = shpfix-shpfix.$(OBJEXT) +shpfix_OBJECTS = $(am_shpfix_OBJECTS) +shpfix_DEPENDENCIES = $(top_builddir)/libshp.la +am_shpinfo_OBJECTS = shpinfo-shpinfo.$(OBJEXT) \ + shpinfo-shpgeo.$(OBJEXT) +shpinfo_OBJECTS = $(am_shpinfo_OBJECTS) +shpinfo_DEPENDENCIES = $(top_builddir)/libshp.la $(am__DEPENDENCIES_1) +am_shpproj_OBJECTS = shpproj-shpproj.$(OBJEXT) \ + shpproj-shpgeo.$(OBJEXT) +shpproj_OBJECTS = $(am_shpproj_OBJECTS) +shpproj_DEPENDENCIES = $(top_builddir)/libshp.la $(am__DEPENDENCIES_1) +am_shpsort_OBJECTS = shpsort-shpsort.$(OBJEXT) +shpsort_OBJECTS = $(am_shpsort_OBJECTS) +shpsort_DEPENDENCIES = $(top_builddir)/libshp.la +am_shpwkb_OBJECTS = shpwkb-shpwkb.$(OBJEXT) shpwkb-shpgeo.$(OBJEXT) +shpwkb_OBJECTS = $(am_shpwkb_OBJECTS) +shpwkb_DEPENDENCIES = $(top_builddir)/libshp.la $(am__DEPENDENCIES_1) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(Shape_PointInPoly_SOURCES) $(dbfcat_SOURCES) \ + $(dbfinfo_SOURCES) $(shpcat_SOURCES) $(shpcentrd_SOURCES) \ + $(shpdata_SOURCES) $(shpdxf_SOURCES) $(shpfix_SOURCES) \ + $(shpinfo_SOURCES) $(shpproj_SOURCES) $(shpsort_SOURCES) \ + $(shpwkb_SOURCES) +DIST_SOURCES = $(Shape_PointInPoly_SOURCES) $(dbfcat_SOURCES) \ + $(dbfinfo_SOURCES) $(shpcat_SOURCES) $(shpcentrd_SOURCES) \ + $(shpdata_SOURCES) $(shpdxf_SOURCES) $(shpfix_SOURCES) \ + $(shpinfo_SOURCES) $(shpproj_SOURCES) $(shpsort_SOURCES) \ + $(shpwkb_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ + $(top_srcdir)/test-driver +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PROJ_CFLAGS = @PROJ_CFLAGS@ +PROJ_LIBS = @PROJ_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHAPELIB_SO_VERSION = @SHAPELIB_SO_VERSION@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +CONTRIB_CFLAGS = -I$(top_srcdir) -DDEBUG -DDEBUG2 + +# Extra files to distribute in the source tarball +EXTRA_DIST = makefile.vc tests/shpproj.sh doc/Shape_PointInPoly_README.txt doc/shpproj.txt doc/shpsort.txt ShapeFileII.pas +dbfcat_SOURCES = dbfcat.c +dbfcat_CPPFLAGS = $(CONTRIB_CFLAGS) +dbfcat_LDADD = $(top_builddir)/libshp.la +dbfinfo_SOURCES = dbfinfo.c +dbfinfo_CPPFLAGS = $(CONTRIB_CFLAGS) +dbfinfo_LDADD = $(top_builddir)/libshp.la +shpcat_SOURCES = shpcat.c +shpcat_CPPFLAGS = $(CONTRIB_CFLAGS) +shpcat_LDADD = $(top_builddir)/libshp.la +shpdxf_SOURCES = shpdxf.c +shpdxf_CPPFLAGS = $(CONTRIB_CFLAGS) +shpdxf_LDADD = $(top_builddir)/libshp.la +shpfix_SOURCES = shpfix.c +shpfix_CPPFLAGS = $(CONTRIB_CFLAGS) +shpfix_LDADD = $(top_builddir)/libshp.la +shpsort_SOURCES = shpsort.c +shpsort_CPPFLAGS = $(CONTRIB_CFLAGS) +shpsort_LDADD = $(top_builddir)/libshp.la -lm +Shape_PointInPoly_SOURCES = Shape_PointInPoly.cpp +Shape_PointInPoly_CPPFLAGS = $(CONTRIB_CFLAGS) +Shape_PointInPoly_LDADD = $(top_builddir)/libshp.la +shpcentrd_SOURCES = shpcentrd.c shpgeo.c shpgeo.h +shpcentrd_CPPFLAGS = $(CONTRIB_CFLAGS) $(PROJ_CFLAGS) +shpcentrd_LDADD = $(top_builddir)/libshp.la $(PROJ_LIBS) -lm +shpdata_SOURCES = shpdata.c shpgeo.c shpgeo.h +shpdata_CPPFLAGS = $(CONTRIB_CFLAGS) $(PROJ_CFLAGS) +shpdata_LDADD = $(top_builddir)/libshp.la $(PROJ_LIBS) -lm +shpinfo_SOURCES = shpinfo.c shpgeo.c shpgeo.h +shpinfo_CPPFLAGS = $(CONTRIB_CFLAGS) $(PROJ_CFLAGS) +shpinfo_LDADD = $(top_builddir)/libshp.la $(PROJ_LIBS) -lm +shpproj_SOURCES = shpproj.c shpgeo.c shpgeo.h +shpproj_CPPFLAGS = $(CONTRIB_CFLAGS) $(PROJ_CFLAGS) +shpproj_LDADD = $(top_builddir)/libshp.la $(PROJ_LIBS) -lm +shpwkb_SOURCES = shpwkb.c shpgeo.c shpgeo.h +shpwkb_CPPFLAGS = $(CONTRIB_CFLAGS) $(PROJ_CFLAGS) +shpwkb_LDADD = $(top_builddir)/libshp.la $(PROJ_LIBS) -lm + +# Tests +TESTS_ENVIRONMENT = top_builddir=$(abs_top_builddir) +TESTS = tests/shpproj.sh +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .cpp .lo .log .o .obj .test .test$(EXEEXT) .trs +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu contrib/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu contrib/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +Shape_PointInPoly$(EXEEXT): $(Shape_PointInPoly_OBJECTS) $(Shape_PointInPoly_DEPENDENCIES) $(EXTRA_Shape_PointInPoly_DEPENDENCIES) + @rm -f Shape_PointInPoly$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(Shape_PointInPoly_OBJECTS) $(Shape_PointInPoly_LDADD) $(LIBS) + +dbfcat$(EXEEXT): $(dbfcat_OBJECTS) $(dbfcat_DEPENDENCIES) $(EXTRA_dbfcat_DEPENDENCIES) + @rm -f dbfcat$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(dbfcat_OBJECTS) $(dbfcat_LDADD) $(LIBS) + +dbfinfo$(EXEEXT): $(dbfinfo_OBJECTS) $(dbfinfo_DEPENDENCIES) $(EXTRA_dbfinfo_DEPENDENCIES) + @rm -f dbfinfo$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(dbfinfo_OBJECTS) $(dbfinfo_LDADD) $(LIBS) + +shpcat$(EXEEXT): $(shpcat_OBJECTS) $(shpcat_DEPENDENCIES) $(EXTRA_shpcat_DEPENDENCIES) + @rm -f shpcat$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shpcat_OBJECTS) $(shpcat_LDADD) $(LIBS) + +shpcentrd$(EXEEXT): $(shpcentrd_OBJECTS) $(shpcentrd_DEPENDENCIES) $(EXTRA_shpcentrd_DEPENDENCIES) + @rm -f shpcentrd$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shpcentrd_OBJECTS) $(shpcentrd_LDADD) $(LIBS) + +shpdata$(EXEEXT): $(shpdata_OBJECTS) $(shpdata_DEPENDENCIES) $(EXTRA_shpdata_DEPENDENCIES) + @rm -f shpdata$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shpdata_OBJECTS) $(shpdata_LDADD) $(LIBS) + +shpdxf$(EXEEXT): $(shpdxf_OBJECTS) $(shpdxf_DEPENDENCIES) $(EXTRA_shpdxf_DEPENDENCIES) + @rm -f shpdxf$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shpdxf_OBJECTS) $(shpdxf_LDADD) $(LIBS) + +shpfix$(EXEEXT): $(shpfix_OBJECTS) $(shpfix_DEPENDENCIES) $(EXTRA_shpfix_DEPENDENCIES) + @rm -f shpfix$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shpfix_OBJECTS) $(shpfix_LDADD) $(LIBS) + +shpinfo$(EXEEXT): $(shpinfo_OBJECTS) $(shpinfo_DEPENDENCIES) $(EXTRA_shpinfo_DEPENDENCIES) + @rm -f shpinfo$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shpinfo_OBJECTS) $(shpinfo_LDADD) $(LIBS) + +shpproj$(EXEEXT): $(shpproj_OBJECTS) $(shpproj_DEPENDENCIES) $(EXTRA_shpproj_DEPENDENCIES) + @rm -f shpproj$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shpproj_OBJECTS) $(shpproj_LDADD) $(LIBS) + +shpsort$(EXEEXT): $(shpsort_OBJECTS) $(shpsort_DEPENDENCIES) $(EXTRA_shpsort_DEPENDENCIES) + @rm -f shpsort$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shpsort_OBJECTS) $(shpsort_LDADD) $(LIBS) + +shpwkb$(EXEEXT): $(shpwkb_OBJECTS) $(shpwkb_DEPENDENCIES) $(EXTRA_shpwkb_DEPENDENCIES) + @rm -f shpwkb$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(shpwkb_OBJECTS) $(shpwkb_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Shape_PointInPoly-Shape_PointInPoly.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbfcat-dbfcat.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbfinfo-dbfinfo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpcat-shpcat.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpcentrd-shpcentrd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpcentrd-shpgeo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpdata-shpdata.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpdata-shpgeo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpdxf-shpdxf.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpfix-shpfix.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpinfo-shpgeo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpinfo-shpinfo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpproj-shpgeo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpproj-shpproj.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpsort-shpsort.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpwkb-shpgeo.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shpwkb-shpwkb.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +dbfcat-dbfcat.o: dbfcat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbfcat_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dbfcat-dbfcat.o -MD -MP -MF $(DEPDIR)/dbfcat-dbfcat.Tpo -c -o dbfcat-dbfcat.o `test -f 'dbfcat.c' || echo '$(srcdir)/'`dbfcat.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dbfcat-dbfcat.Tpo $(DEPDIR)/dbfcat-dbfcat.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dbfcat.c' object='dbfcat-dbfcat.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbfcat_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dbfcat-dbfcat.o `test -f 'dbfcat.c' || echo '$(srcdir)/'`dbfcat.c + +dbfcat-dbfcat.obj: dbfcat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbfcat_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dbfcat-dbfcat.obj -MD -MP -MF $(DEPDIR)/dbfcat-dbfcat.Tpo -c -o dbfcat-dbfcat.obj `if test -f 'dbfcat.c'; then $(CYGPATH_W) 'dbfcat.c'; else $(CYGPATH_W) '$(srcdir)/dbfcat.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dbfcat-dbfcat.Tpo $(DEPDIR)/dbfcat-dbfcat.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dbfcat.c' object='dbfcat-dbfcat.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbfcat_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dbfcat-dbfcat.obj `if test -f 'dbfcat.c'; then $(CYGPATH_W) 'dbfcat.c'; else $(CYGPATH_W) '$(srcdir)/dbfcat.c'; fi` + +dbfinfo-dbfinfo.o: dbfinfo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbfinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dbfinfo-dbfinfo.o -MD -MP -MF $(DEPDIR)/dbfinfo-dbfinfo.Tpo -c -o dbfinfo-dbfinfo.o `test -f 'dbfinfo.c' || echo '$(srcdir)/'`dbfinfo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dbfinfo-dbfinfo.Tpo $(DEPDIR)/dbfinfo-dbfinfo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dbfinfo.c' object='dbfinfo-dbfinfo.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbfinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dbfinfo-dbfinfo.o `test -f 'dbfinfo.c' || echo '$(srcdir)/'`dbfinfo.c + +dbfinfo-dbfinfo.obj: dbfinfo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbfinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT dbfinfo-dbfinfo.obj -MD -MP -MF $(DEPDIR)/dbfinfo-dbfinfo.Tpo -c -o dbfinfo-dbfinfo.obj `if test -f 'dbfinfo.c'; then $(CYGPATH_W) 'dbfinfo.c'; else $(CYGPATH_W) '$(srcdir)/dbfinfo.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dbfinfo-dbfinfo.Tpo $(DEPDIR)/dbfinfo-dbfinfo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dbfinfo.c' object='dbfinfo-dbfinfo.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(dbfinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o dbfinfo-dbfinfo.obj `if test -f 'dbfinfo.c'; then $(CYGPATH_W) 'dbfinfo.c'; else $(CYGPATH_W) '$(srcdir)/dbfinfo.c'; fi` + +shpcat-shpcat.o: shpcat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpcat_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpcat-shpcat.o -MD -MP -MF $(DEPDIR)/shpcat-shpcat.Tpo -c -o shpcat-shpcat.o `test -f 'shpcat.c' || echo '$(srcdir)/'`shpcat.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpcat-shpcat.Tpo $(DEPDIR)/shpcat-shpcat.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpcat.c' object='shpcat-shpcat.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpcat_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpcat-shpcat.o `test -f 'shpcat.c' || echo '$(srcdir)/'`shpcat.c + +shpcat-shpcat.obj: shpcat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpcat_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpcat-shpcat.obj -MD -MP -MF $(DEPDIR)/shpcat-shpcat.Tpo -c -o shpcat-shpcat.obj `if test -f 'shpcat.c'; then $(CYGPATH_W) 'shpcat.c'; else $(CYGPATH_W) '$(srcdir)/shpcat.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpcat-shpcat.Tpo $(DEPDIR)/shpcat-shpcat.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpcat.c' object='shpcat-shpcat.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpcat_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpcat-shpcat.obj `if test -f 'shpcat.c'; then $(CYGPATH_W) 'shpcat.c'; else $(CYGPATH_W) '$(srcdir)/shpcat.c'; fi` + +shpcentrd-shpcentrd.o: shpcentrd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpcentrd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpcentrd-shpcentrd.o -MD -MP -MF $(DEPDIR)/shpcentrd-shpcentrd.Tpo -c -o shpcentrd-shpcentrd.o `test -f 'shpcentrd.c' || echo '$(srcdir)/'`shpcentrd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpcentrd-shpcentrd.Tpo $(DEPDIR)/shpcentrd-shpcentrd.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpcentrd.c' object='shpcentrd-shpcentrd.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpcentrd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpcentrd-shpcentrd.o `test -f 'shpcentrd.c' || echo '$(srcdir)/'`shpcentrd.c + +shpcentrd-shpcentrd.obj: shpcentrd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpcentrd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpcentrd-shpcentrd.obj -MD -MP -MF $(DEPDIR)/shpcentrd-shpcentrd.Tpo -c -o shpcentrd-shpcentrd.obj `if test -f 'shpcentrd.c'; then $(CYGPATH_W) 'shpcentrd.c'; else $(CYGPATH_W) '$(srcdir)/shpcentrd.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpcentrd-shpcentrd.Tpo $(DEPDIR)/shpcentrd-shpcentrd.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpcentrd.c' object='shpcentrd-shpcentrd.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpcentrd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpcentrd-shpcentrd.obj `if test -f 'shpcentrd.c'; then $(CYGPATH_W) 'shpcentrd.c'; else $(CYGPATH_W) '$(srcdir)/shpcentrd.c'; fi` + +shpcentrd-shpgeo.o: shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpcentrd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpcentrd-shpgeo.o -MD -MP -MF $(DEPDIR)/shpcentrd-shpgeo.Tpo -c -o shpcentrd-shpgeo.o `test -f 'shpgeo.c' || echo '$(srcdir)/'`shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpcentrd-shpgeo.Tpo $(DEPDIR)/shpcentrd-shpgeo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpgeo.c' object='shpcentrd-shpgeo.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpcentrd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpcentrd-shpgeo.o `test -f 'shpgeo.c' || echo '$(srcdir)/'`shpgeo.c + +shpcentrd-shpgeo.obj: shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpcentrd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpcentrd-shpgeo.obj -MD -MP -MF $(DEPDIR)/shpcentrd-shpgeo.Tpo -c -o shpcentrd-shpgeo.obj `if test -f 'shpgeo.c'; then $(CYGPATH_W) 'shpgeo.c'; else $(CYGPATH_W) '$(srcdir)/shpgeo.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpcentrd-shpgeo.Tpo $(DEPDIR)/shpcentrd-shpgeo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpgeo.c' object='shpcentrd-shpgeo.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpcentrd_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpcentrd-shpgeo.obj `if test -f 'shpgeo.c'; then $(CYGPATH_W) 'shpgeo.c'; else $(CYGPATH_W) '$(srcdir)/shpgeo.c'; fi` + +shpdata-shpdata.o: shpdata.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpdata_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpdata-shpdata.o -MD -MP -MF $(DEPDIR)/shpdata-shpdata.Tpo -c -o shpdata-shpdata.o `test -f 'shpdata.c' || echo '$(srcdir)/'`shpdata.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpdata-shpdata.Tpo $(DEPDIR)/shpdata-shpdata.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpdata.c' object='shpdata-shpdata.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpdata_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpdata-shpdata.o `test -f 'shpdata.c' || echo '$(srcdir)/'`shpdata.c + +shpdata-shpdata.obj: shpdata.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpdata_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpdata-shpdata.obj -MD -MP -MF $(DEPDIR)/shpdata-shpdata.Tpo -c -o shpdata-shpdata.obj `if test -f 'shpdata.c'; then $(CYGPATH_W) 'shpdata.c'; else $(CYGPATH_W) '$(srcdir)/shpdata.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpdata-shpdata.Tpo $(DEPDIR)/shpdata-shpdata.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpdata.c' object='shpdata-shpdata.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpdata_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpdata-shpdata.obj `if test -f 'shpdata.c'; then $(CYGPATH_W) 'shpdata.c'; else $(CYGPATH_W) '$(srcdir)/shpdata.c'; fi` + +shpdata-shpgeo.o: shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpdata_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpdata-shpgeo.o -MD -MP -MF $(DEPDIR)/shpdata-shpgeo.Tpo -c -o shpdata-shpgeo.o `test -f 'shpgeo.c' || echo '$(srcdir)/'`shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpdata-shpgeo.Tpo $(DEPDIR)/shpdata-shpgeo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpgeo.c' object='shpdata-shpgeo.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpdata_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpdata-shpgeo.o `test -f 'shpgeo.c' || echo '$(srcdir)/'`shpgeo.c + +shpdata-shpgeo.obj: shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpdata_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpdata-shpgeo.obj -MD -MP -MF $(DEPDIR)/shpdata-shpgeo.Tpo -c -o shpdata-shpgeo.obj `if test -f 'shpgeo.c'; then $(CYGPATH_W) 'shpgeo.c'; else $(CYGPATH_W) '$(srcdir)/shpgeo.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpdata-shpgeo.Tpo $(DEPDIR)/shpdata-shpgeo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpgeo.c' object='shpdata-shpgeo.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpdata_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpdata-shpgeo.obj `if test -f 'shpgeo.c'; then $(CYGPATH_W) 'shpgeo.c'; else $(CYGPATH_W) '$(srcdir)/shpgeo.c'; fi` + +shpdxf-shpdxf.o: shpdxf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpdxf_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpdxf-shpdxf.o -MD -MP -MF $(DEPDIR)/shpdxf-shpdxf.Tpo -c -o shpdxf-shpdxf.o `test -f 'shpdxf.c' || echo '$(srcdir)/'`shpdxf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpdxf-shpdxf.Tpo $(DEPDIR)/shpdxf-shpdxf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpdxf.c' object='shpdxf-shpdxf.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpdxf_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpdxf-shpdxf.o `test -f 'shpdxf.c' || echo '$(srcdir)/'`shpdxf.c + +shpdxf-shpdxf.obj: shpdxf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpdxf_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpdxf-shpdxf.obj -MD -MP -MF $(DEPDIR)/shpdxf-shpdxf.Tpo -c -o shpdxf-shpdxf.obj `if test -f 'shpdxf.c'; then $(CYGPATH_W) 'shpdxf.c'; else $(CYGPATH_W) '$(srcdir)/shpdxf.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpdxf-shpdxf.Tpo $(DEPDIR)/shpdxf-shpdxf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpdxf.c' object='shpdxf-shpdxf.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpdxf_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpdxf-shpdxf.obj `if test -f 'shpdxf.c'; then $(CYGPATH_W) 'shpdxf.c'; else $(CYGPATH_W) '$(srcdir)/shpdxf.c'; fi` + +shpfix-shpfix.o: shpfix.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpfix_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpfix-shpfix.o -MD -MP -MF $(DEPDIR)/shpfix-shpfix.Tpo -c -o shpfix-shpfix.o `test -f 'shpfix.c' || echo '$(srcdir)/'`shpfix.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpfix-shpfix.Tpo $(DEPDIR)/shpfix-shpfix.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpfix.c' object='shpfix-shpfix.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpfix_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpfix-shpfix.o `test -f 'shpfix.c' || echo '$(srcdir)/'`shpfix.c + +shpfix-shpfix.obj: shpfix.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpfix_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpfix-shpfix.obj -MD -MP -MF $(DEPDIR)/shpfix-shpfix.Tpo -c -o shpfix-shpfix.obj `if test -f 'shpfix.c'; then $(CYGPATH_W) 'shpfix.c'; else $(CYGPATH_W) '$(srcdir)/shpfix.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpfix-shpfix.Tpo $(DEPDIR)/shpfix-shpfix.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpfix.c' object='shpfix-shpfix.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpfix_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpfix-shpfix.obj `if test -f 'shpfix.c'; then $(CYGPATH_W) 'shpfix.c'; else $(CYGPATH_W) '$(srcdir)/shpfix.c'; fi` + +shpinfo-shpinfo.o: shpinfo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpinfo-shpinfo.o -MD -MP -MF $(DEPDIR)/shpinfo-shpinfo.Tpo -c -o shpinfo-shpinfo.o `test -f 'shpinfo.c' || echo '$(srcdir)/'`shpinfo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpinfo-shpinfo.Tpo $(DEPDIR)/shpinfo-shpinfo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpinfo.c' object='shpinfo-shpinfo.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpinfo-shpinfo.o `test -f 'shpinfo.c' || echo '$(srcdir)/'`shpinfo.c + +shpinfo-shpinfo.obj: shpinfo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpinfo-shpinfo.obj -MD -MP -MF $(DEPDIR)/shpinfo-shpinfo.Tpo -c -o shpinfo-shpinfo.obj `if test -f 'shpinfo.c'; then $(CYGPATH_W) 'shpinfo.c'; else $(CYGPATH_W) '$(srcdir)/shpinfo.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpinfo-shpinfo.Tpo $(DEPDIR)/shpinfo-shpinfo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpinfo.c' object='shpinfo-shpinfo.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpinfo-shpinfo.obj `if test -f 'shpinfo.c'; then $(CYGPATH_W) 'shpinfo.c'; else $(CYGPATH_W) '$(srcdir)/shpinfo.c'; fi` + +shpinfo-shpgeo.o: shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpinfo-shpgeo.o -MD -MP -MF $(DEPDIR)/shpinfo-shpgeo.Tpo -c -o shpinfo-shpgeo.o `test -f 'shpgeo.c' || echo '$(srcdir)/'`shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpinfo-shpgeo.Tpo $(DEPDIR)/shpinfo-shpgeo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpgeo.c' object='shpinfo-shpgeo.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpinfo-shpgeo.o `test -f 'shpgeo.c' || echo '$(srcdir)/'`shpgeo.c + +shpinfo-shpgeo.obj: shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpinfo-shpgeo.obj -MD -MP -MF $(DEPDIR)/shpinfo-shpgeo.Tpo -c -o shpinfo-shpgeo.obj `if test -f 'shpgeo.c'; then $(CYGPATH_W) 'shpgeo.c'; else $(CYGPATH_W) '$(srcdir)/shpgeo.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpinfo-shpgeo.Tpo $(DEPDIR)/shpinfo-shpgeo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpgeo.c' object='shpinfo-shpgeo.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpinfo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpinfo-shpgeo.obj `if test -f 'shpgeo.c'; then $(CYGPATH_W) 'shpgeo.c'; else $(CYGPATH_W) '$(srcdir)/shpgeo.c'; fi` + +shpproj-shpproj.o: shpproj.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpproj_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpproj-shpproj.o -MD -MP -MF $(DEPDIR)/shpproj-shpproj.Tpo -c -o shpproj-shpproj.o `test -f 'shpproj.c' || echo '$(srcdir)/'`shpproj.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpproj-shpproj.Tpo $(DEPDIR)/shpproj-shpproj.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpproj.c' object='shpproj-shpproj.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpproj_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpproj-shpproj.o `test -f 'shpproj.c' || echo '$(srcdir)/'`shpproj.c + +shpproj-shpproj.obj: shpproj.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpproj_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpproj-shpproj.obj -MD -MP -MF $(DEPDIR)/shpproj-shpproj.Tpo -c -o shpproj-shpproj.obj `if test -f 'shpproj.c'; then $(CYGPATH_W) 'shpproj.c'; else $(CYGPATH_W) '$(srcdir)/shpproj.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpproj-shpproj.Tpo $(DEPDIR)/shpproj-shpproj.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpproj.c' object='shpproj-shpproj.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpproj_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpproj-shpproj.obj `if test -f 'shpproj.c'; then $(CYGPATH_W) 'shpproj.c'; else $(CYGPATH_W) '$(srcdir)/shpproj.c'; fi` + +shpproj-shpgeo.o: shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpproj_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpproj-shpgeo.o -MD -MP -MF $(DEPDIR)/shpproj-shpgeo.Tpo -c -o shpproj-shpgeo.o `test -f 'shpgeo.c' || echo '$(srcdir)/'`shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpproj-shpgeo.Tpo $(DEPDIR)/shpproj-shpgeo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpgeo.c' object='shpproj-shpgeo.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpproj_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpproj-shpgeo.o `test -f 'shpgeo.c' || echo '$(srcdir)/'`shpgeo.c + +shpproj-shpgeo.obj: shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpproj_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpproj-shpgeo.obj -MD -MP -MF $(DEPDIR)/shpproj-shpgeo.Tpo -c -o shpproj-shpgeo.obj `if test -f 'shpgeo.c'; then $(CYGPATH_W) 'shpgeo.c'; else $(CYGPATH_W) '$(srcdir)/shpgeo.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpproj-shpgeo.Tpo $(DEPDIR)/shpproj-shpgeo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpgeo.c' object='shpproj-shpgeo.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpproj_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpproj-shpgeo.obj `if test -f 'shpgeo.c'; then $(CYGPATH_W) 'shpgeo.c'; else $(CYGPATH_W) '$(srcdir)/shpgeo.c'; fi` + +shpsort-shpsort.o: shpsort.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpsort_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpsort-shpsort.o -MD -MP -MF $(DEPDIR)/shpsort-shpsort.Tpo -c -o shpsort-shpsort.o `test -f 'shpsort.c' || echo '$(srcdir)/'`shpsort.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpsort-shpsort.Tpo $(DEPDIR)/shpsort-shpsort.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpsort.c' object='shpsort-shpsort.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpsort_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpsort-shpsort.o `test -f 'shpsort.c' || echo '$(srcdir)/'`shpsort.c + +shpsort-shpsort.obj: shpsort.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpsort_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpsort-shpsort.obj -MD -MP -MF $(DEPDIR)/shpsort-shpsort.Tpo -c -o shpsort-shpsort.obj `if test -f 'shpsort.c'; then $(CYGPATH_W) 'shpsort.c'; else $(CYGPATH_W) '$(srcdir)/shpsort.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpsort-shpsort.Tpo $(DEPDIR)/shpsort-shpsort.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpsort.c' object='shpsort-shpsort.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpsort_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpsort-shpsort.obj `if test -f 'shpsort.c'; then $(CYGPATH_W) 'shpsort.c'; else $(CYGPATH_W) '$(srcdir)/shpsort.c'; fi` + +shpwkb-shpwkb.o: shpwkb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpwkb_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpwkb-shpwkb.o -MD -MP -MF $(DEPDIR)/shpwkb-shpwkb.Tpo -c -o shpwkb-shpwkb.o `test -f 'shpwkb.c' || echo '$(srcdir)/'`shpwkb.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpwkb-shpwkb.Tpo $(DEPDIR)/shpwkb-shpwkb.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpwkb.c' object='shpwkb-shpwkb.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpwkb_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpwkb-shpwkb.o `test -f 'shpwkb.c' || echo '$(srcdir)/'`shpwkb.c + +shpwkb-shpwkb.obj: shpwkb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpwkb_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpwkb-shpwkb.obj -MD -MP -MF $(DEPDIR)/shpwkb-shpwkb.Tpo -c -o shpwkb-shpwkb.obj `if test -f 'shpwkb.c'; then $(CYGPATH_W) 'shpwkb.c'; else $(CYGPATH_W) '$(srcdir)/shpwkb.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpwkb-shpwkb.Tpo $(DEPDIR)/shpwkb-shpwkb.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpwkb.c' object='shpwkb-shpwkb.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpwkb_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpwkb-shpwkb.obj `if test -f 'shpwkb.c'; then $(CYGPATH_W) 'shpwkb.c'; else $(CYGPATH_W) '$(srcdir)/shpwkb.c'; fi` + +shpwkb-shpgeo.o: shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpwkb_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpwkb-shpgeo.o -MD -MP -MF $(DEPDIR)/shpwkb-shpgeo.Tpo -c -o shpwkb-shpgeo.o `test -f 'shpgeo.c' || echo '$(srcdir)/'`shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpwkb-shpgeo.Tpo $(DEPDIR)/shpwkb-shpgeo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpgeo.c' object='shpwkb-shpgeo.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpwkb_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpwkb-shpgeo.o `test -f 'shpgeo.c' || echo '$(srcdir)/'`shpgeo.c + +shpwkb-shpgeo.obj: shpgeo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpwkb_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT shpwkb-shpgeo.obj -MD -MP -MF $(DEPDIR)/shpwkb-shpgeo.Tpo -c -o shpwkb-shpgeo.obj `if test -f 'shpgeo.c'; then $(CYGPATH_W) 'shpgeo.c'; else $(CYGPATH_W) '$(srcdir)/shpgeo.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/shpwkb-shpgeo.Tpo $(DEPDIR)/shpwkb-shpgeo.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='shpgeo.c' object='shpwkb-shpgeo.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(shpwkb_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o shpwkb-shpgeo.obj `if test -f 'shpgeo.c'; then $(CYGPATH_W) 'shpgeo.c'; else $(CYGPATH_W) '$(srcdir)/shpgeo.c'; fi` + +.cpp.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +Shape_PointInPoly-Shape_PointInPoly.o: Shape_PointInPoly.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Shape_PointInPoly_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Shape_PointInPoly-Shape_PointInPoly.o -MD -MP -MF $(DEPDIR)/Shape_PointInPoly-Shape_PointInPoly.Tpo -c -o Shape_PointInPoly-Shape_PointInPoly.o `test -f 'Shape_PointInPoly.cpp' || echo '$(srcdir)/'`Shape_PointInPoly.cpp +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Shape_PointInPoly-Shape_PointInPoly.Tpo $(DEPDIR)/Shape_PointInPoly-Shape_PointInPoly.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Shape_PointInPoly.cpp' object='Shape_PointInPoly-Shape_PointInPoly.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Shape_PointInPoly_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Shape_PointInPoly-Shape_PointInPoly.o `test -f 'Shape_PointInPoly.cpp' || echo '$(srcdir)/'`Shape_PointInPoly.cpp + +Shape_PointInPoly-Shape_PointInPoly.obj: Shape_PointInPoly.cpp +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Shape_PointInPoly_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT Shape_PointInPoly-Shape_PointInPoly.obj -MD -MP -MF $(DEPDIR)/Shape_PointInPoly-Shape_PointInPoly.Tpo -c -o Shape_PointInPoly-Shape_PointInPoly.obj `if test -f 'Shape_PointInPoly.cpp'; then $(CYGPATH_W) 'Shape_PointInPoly.cpp'; else $(CYGPATH_W) '$(srcdir)/Shape_PointInPoly.cpp'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/Shape_PointInPoly-Shape_PointInPoly.Tpo $(DEPDIR)/Shape_PointInPoly-Shape_PointInPoly.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Shape_PointInPoly.cpp' object='Shape_PointInPoly-Shape_PointInPoly.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(Shape_PointInPoly_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o Shape_PointInPoly-Shape_PointInPoly.obj `if test -f 'Shape_PointInPoly.cpp'; then $(CYGPATH_W) 'Shape_PointInPoly.cpp'; else $(CYGPATH_W) '$(srcdir)/Shape_PointInPoly.cpp'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +tests/shpproj.sh.log: tests/shpproj.sh + @p='tests/shpproj.sh'; \ + b='tests/shpproj.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS + +.MAKE: check-am install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ + clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + recheck tags tags-am uninstall uninstall-am \ + uninstall-binPROGRAMS + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/libs/shapelib/contrib/ShapeFileII.pas b/libs/shapelib/contrib/ShapeFileII.pas new file mode 100644 index 0000000..b7d0b7f --- /dev/null +++ b/libs/shapelib/contrib/ShapeFileII.pas @@ -0,0 +1,239 @@ +{ +/****************************************************************************** + * $Id: ShapeFileII.pas,v 1.4 2016-12-05 12:44:07 erouault Exp $ + * + * Project: Shapelib + * Purpose: Delphi Pascal interface to Shapelib. + * Author: Kevin Meyer (Kevin@CyberTracker.co.za) + * + ****************************************************************************** + * Copyright (c) 2002, Keven Meyer (Kevin@CyberTracker.co.za) + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * $Log: ShapeFileII.pas,v $ + * Revision 1.4 2016-12-05 12:44:07 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.3 2003-05-14 20:04:51 warmerda + * Changed fpSHP and fpSHX to integer at suggestion of Ivan Lucena. + * + * Revision 1.2 2002/01/21 14:09:26 warmerda + * Fixed name. + * + * Revision 1.1 2002/01/17 14:30:37 warmerda + * New + * + */ +} +unit ShapeFileII; + +interface +//uses { uses clause } +// ; +{ Set compiler to pack on byte boundaries only } +{$ALIGN OFF} +{$OVERFLOWCHECKS OFF} +{$J-} +const + SHPT_NULL = 0; + SHPT_POINT = 1; + SHPT_ARC = 3; + SHPT_POLYGON = 5; + SHPT_MULTIPOINT = 8; + SHPT_POINTZ = 11; + SHPT_ARCZ = 13; + SHPT_POLYGONZ = 15; + SHPT_MULTIPOINTZ = 18; + SHPT_POINTM = 21; + SHPT_ARCM = 23; + SHPT_POLYGONM = 25; + SHPT_MULTIPOINTM = 28; + SHPT_MULTIPATCH = 31; + XBASE_FLDHDR_SZ = 32; + szAccessBRW = 'rb+'; + +// *********************** SHP support ************************ + +type +SHPObject = record + nSHPType, + nShapeId, + nParts : LongWord; + panPartStart, + panPartType : array of LongWord; + nVertices : LongWord; + padfX, padfY, padfZ, padfM : array of double; + dfXMin, dfYMin, dfZMin, dfMMin : double; + dfXMax, dfYMax, dfZMax, dfMMax : double; +end; +SHPObjectHandle = ^SHPObject; + +SHPBoundsArr = double; + +SHPInfo = record + fpSHP, + fpSHX : integer; + + nShapeType, + nFileSize, + nRecords, + nMaxRecords : LongWord; + panRecOffset, + panRecSize : array of LongWord; + adBoundsMin, adBoundsMax : SHPBoundsArr; + bUpdated : LongWord; +end; +SHPHandle = ^SHPInfo; + +// *********************** DBF support ************************ + +DBFInfo = record + fp : FILE; + nRecords, + nRecordLength, + nHeaderLength, + nFields : LongWord; + + panFieldOffset, + panFieldSize, + panFieldDecimals : array of LongWord; + + pachFieldType : LongWord; + pszHeader : PChar; + nCurrentRecord, + bCurrentRecordModified : LongWord; + pszCurrentRecord : PChar; + + bNoHeader, + bUpdated : LongWord; +end; +DBFHandle = ^DBFInfo; + +DBFFieldType = (DBFTString, DBFTInteger, DBFTDouble, DBFTInvalid) ; + +// *********************** SHP func declarations ************************ + +{$ALIGN ON} + +function SHPOpen(pszShapeFile, pszAccess : PChar) : SHPHandle;cdecl; +procedure SHPGetInfo(hSHP : SHPHandle; var pnEntities, pnShapeType : LongWord; var padfMinBoud, padfMaxBound : SHPBoundsArr);cdecl; +procedure SHPClose(hSHP : SHPHandle);cdecl; +function SHPReadObject(hSHP : SHPHandle; iShape : LongWord): SHPObjectHandle;cdecl; +function SHPCreate(pszShapeFile : PChar; nShapeType : LongWord):SHPHandle;cdecl; +function SHPWriteObject(hSHP : SHPHandle; iShape : LongWord; psObject : SHPObjectHandle): LongWord;cdecl; +function SHPCreateSimpleObject(nSHPType, nVertices : LongWord; var padfX, padfY, padfZ : double):SHPObjectHandle;cdecl; +procedure SHPDestroy(psObject : SHPObjectHandle);cdecl; + +procedure SHPComputeExtents(psObject : SHPObjectHandle);cdecl; +function SHPCreateObject(nSHPType, iShape, nParts : LongWord; var panPartStart, panPartType : LongWord; nVertices : LongWord; var padfX, padfY, padfZ, padfM : SHPBoundsArr): SHPObjectHandle;cdecl; + +function SHPTypeStr(pnShapeType : LongWord): string; + +// *********************** DBF func declarations ************************ + +function DBFOpen(pszDBFFile, pszAccess : PChar): DBFHandle;cdecl; +function DBFCreate(pszDBFFile : PChar): DBFHandle ;cdecl; +function DBFGetFieldCount(hDBF : DBFHandle) : LongWord ;cdecl; +function DBFGetRecordCount(hDBF : DBFHandle) : LongWord;cdecl; +function DBFGetFieldIndex(hDBF: DBFHandle; pszFieldName : PChar): LongWord;cdecl; +function DBFGetFieldInfo(hDBF : DBFHandle; iField : LongWord; pszFieldName : PChar; + var pnWidth, pnDecimals : LongWord): DBFFieldType;cdecl; +function DBFAddField(hDBF : DBFHandle; pszFieldName : PChar; + eType : DBFFieldType; nWidth, nDecimals : LongWord): LongWord;cdecl; + +function DBFReadIntegerAttribute(hDBF : DBFHandle;iShape, iField : LongWord ): LongWord;cdecl; +function DBFReadDoubleAttribute(hDBF : DBFHandle; iShape, iField : LongWord ):double;cdecl; +function DBFReadStringAttribute(hDBF : DBFHandle; iShape, iField : LongWord ) : pchar;cdecl; +function DBFIsAttributeNULL(hDBF : DBFHandle; iShape, iField : LongWord ): LongWord;cdecl; +function DBFWriteIntegerAttribute(hDBF : DBFHandle;iShape, iField, nFieldValue : LongWord): LongWord;cdecl; +function DBFWriteDoubleAttribute(hDBF : DBFHandle;iShape, iField : LongWord; + dFieldValue : double): LongWord ;cdecl; +function DBFWriteStringAttribute(hDBF : DBFHandle;iShape, iField : LongWord; + pszFieldValue : PChar): LongWord ;cdecl; +function DBFWriteNULLAttribute(hDBF : DBFHandle; iShape, iField : LongWord ) : LongWord;cdecl; +procedure DBFClose(hDBF : DBFHandle);cdecl; +function DBFGetNativeFieldType(hDBF : DBFHandle; iField : LongWord) : Char;cdecl; + +// *********************** SHP implementation ************************ +implementation +// ***************************************************************************** +function SHPCreateSimpleObject(nSHPType, nVertices : LongWord; var padfX, padfY, padfZ : double):SHPObjectHandle;external 'shapelib.dll' name 'SHPCreateSimpleObject'; +function SHPOpen(pszShapeFile, pszAccess : PChar) : SHPHandle; external 'shapelib.dll' name 'SHPOpen'; +procedure SHPGetInfo(hSHP : SHPHandle; var pnEntities, pnShapeType : LongWord; var padfMinBoud, padfMaxBound : SHPBoundsArr);external 'shapelib.dll' name 'SHPGetInfo'; +procedure SHPClose(hSHP : SHPHandle);external 'shapelib.dll' name 'SHPClose'; +function SHPReadObject(hSHP : SHPHandle; iShape : LongWord) : SHPObjectHandle;external 'shapelib.dll' name 'SHPReadObject'; +function SHPCreate(pszShapeFile : PChar; nShapeType : LongWord):SHPHandle;external 'shapelib.dll' name 'SHPCreate'; +function SHPWriteObject(hSHP : SHPHandle; iShape : LongWord; psObject : SHPObjectHandle): LongWord;cdecl;external 'shapelib.dll' name 'SHPWriteObject'; +procedure SHPDestroy(psObject : SHPObjectHandle);external 'shapelib.dll' name 'SHPDestroyObject'; +procedure SHPComputeExtents(psObject : SHPObjectHandle);external 'shapelib.dll' name 'SHPComputeExtents'; +function SHPCreateObject(nSHPType, iShape, nParts : LongWord; var panPartStart, panPartType : LongWord; nVertices : LongWord; var padfX, padfY, padfZ, padfM : SHPBoundsArr): SHPObjectHandle;external 'shapelib.dll' name 'SHPCreateObject'; +// ***************************************************************************** +function SHPTypeStr(pnShapeType : LongWord): string; +begin + case pnShapeType of + SHPT_NULL : result := 'NULL'; + SHPT_POINT : result := 'POINT'; + SHPT_ARC : result := 'ARC'; + SHPT_POLYGON : result := 'POLYGON'; + SHPT_MULTIPOINT : result := 'MULTIPOINT'; + SHPT_POINTZ : result := 'POINTZ'; + SHPT_ARCZ : result := 'ARCZ'; + SHPT_POLYGONZ : result := 'POLYGONZ'; + SHPT_MULTIPOINTZ : result := 'MULTIPOINTZ'; + SHPT_POINTM : result := 'POINTM'; + SHPT_ARCM : result := 'ARCM'; + SHPT_POLYGONM : result := 'POLYGONM'; + SHPT_MULTIPOINTM : result := 'MULTIPOINTM'; + SHPT_MULTIPATCH : result := 'MULTIPATCH'; + else + result := '--unknown--'; + end; +end; +// ***************************************************************************** +// ***************************************************************************** +function DBFOpen(pszDBFFile, pszAccess : PChar): DBFHandle;external 'shapelib.dll'; +function DBFCreate(pszDBFFile : PChar): DBFHandle ;external 'shapelib.dll'; +function DBFGetFieldCount(hDBF : DBFHandle) : LongWord ;external 'shapelib.dll'; +function DBFGetRecordCount(hDBF : DBFHandle) : LongWord;external 'shapelib.dll'; +function DBFGetFieldIndex(hDBF: DBFHandle; pszFieldName : PChar): LongWord;external 'shapelib.dll'; +function DBFGetFieldInfo(hDBF : DBFHandle; iField : LongWord; pszFieldName : PChar; var pnWidth, pnDecimals : LongWord): DBFFieldType;external 'shapelib.dll'; +function DBFAddField(hDBF : DBFHandle; pszFieldName : PChar; eType : DBFFieldType; nWidth, nDecimals : LongWord): LongWord;external 'shapelib.dll'; +function DBFReadIntegerAttribute(hDBF : DBFHandle;iShape, iField : LongWord ): LongWord;external 'shapelib.dll'; +function DBFReadDoubleAttribute(hDBF : DBFHandle; iShape, iField : LongWord ):double;external 'shapelib.dll'; +function DBFReadStringAttribute(hDBF : DBFHandle; iShape, iField : LongWord ) : pchar;external 'shapelib.dll'; +function DBFIsAttributeNULL(hDBF : DBFHandle; iShape, iField : LongWord ): LongWord;external 'shapelib.dll'; +function DBFWriteIntegerAttribute(hDBF : DBFHandle;iShape, iField, nFieldValue : LongWord): LongWord;external 'shapelib.dll'; +function DBFWriteDoubleAttribute(hDBF : DBFHandle;iShape, iField : LongWord; dFieldValue : double): LongWord ;external 'shapelib.dll'; +function DBFWriteStringAttribute(hDBF : DBFHandle;iShape, iField : LongWord; pszFieldValue : PChar): LongWord ;external 'shapelib.dll'; +function DBFWriteNULLAttribute(hDBF : DBFHandle; iShape, iField : LongWord ) : LongWord;external 'shapelib.dll'; +procedure DBFClose(hDBF : DBFHandle);external 'shapelib.dll'; +function DBFGetNativeFieldType(hDBF : DBFHandle; iField : LongWord) : Char;external 'shapelib.dll'; +// ***************************************************************************** + +end. diff --git a/libs/shapelib/contrib/Shape_PointInPoly.cpp b/libs/shapelib/contrib/Shape_PointInPoly.cpp new file mode 100644 index 0000000..010fa26 --- /dev/null +++ b/libs/shapelib/contrib/Shape_PointInPoly.cpp @@ -0,0 +1,243 @@ +/****************************************************************************** + * $Id: Shape_PointInPoly.cpp,v 1.2 2016-12-05 12:44:07 erouault Exp $ + * + * Project: Shapelib + * Purpose: Commandline program to generate points-in-polygons from a + * shapefile as a shapefile. + * Author: Marko Podgorsek, d-mon@siol.net + * + ****************************************************************************** + * Copyright (c) 2004, Marko Podgorsek, d-mon@siol.net + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * $Log: Shape_PointInPoly.cpp,v $ + * Revision 1.2 2016-12-05 12:44:07 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.1 2004-01-09 16:47:57 fwarmerdam + * New + * + */ + +static char rcsid[] = + "$Id: Shape_PointInPoly.cpp,v 1.2 2016-12-05 12:44:07 erouault Exp $"; + +#include +#include +#include +#include + +#define MAXINTERSECTIONPOINTS 255 + +enum loopDir { + kExterior, + kInterior, + kError +}; + +struct DPoint2d +{ + DPoint2d() + { + x = y = 0.0; + }; + DPoint2d(double x, double y) + { + this->x = x; + this->y = y; + }; + double x,y; +}; + +struct IntersectPoint +{ + IntersectPoint(void) + { + x = y = 0.0; + boundry_nmb = 0; + loopdirection = kError; + }; + double x,y; + int boundry_nmb; + loopDir loopdirection; +}; + +loopDir LoopDirection(DPoint2d *vertices, int vertsize) +{ + int i; + double sum = 0.0; + for(i=0;i0) + return kInterior; + else + return kExterior; +} + +DPoint2d CreatePointInPoly(SHPObject *psShape, int quality) +{ + int i, j, k, end, vert, pointpos; + double part, dx, xmin, xmax, ymin, ymax, y, x3, x4, y3, y4, len, maxlen = 0; + DPoint2d *vertices; + loopDir direction; + IntersectPoint mp1, mp2, point1, point2, points[MAXINTERSECTIONPOINTS]; + + xmin = psShape->dfXMin; + ymin = psShape->dfYMin; + xmax = psShape->dfXMax; + ymax = psShape->dfYMax; + part = (ymax-ymin)/(quality+1); + dx = xmax-xmin; + for(i=0;inParts;j++) + { + if(j==psShape->nParts-1) + end = psShape->nVertices; + else + end = psShape->panPartStart[j+1]; + vertices = new DPoint2d [end-psShape->panPartStart[j]]; + for(k=psShape->panPartStart[j],vert=0;kpadfX[k]; + vertices[vert++].y = psShape->padfY[k]; + } + direction = LoopDirection(vertices, vert); + for(k=0;k= y && y4 < y) || (y3 <= y && y4 > y)) //I check >= only once, because if it's not checked now (y3) it will be in the next iteration (which is y4 now) + { + point1.boundry_nmb = j; + point1.loopdirection = direction; + x3 = vertices[k].x; + x4 = vertices[k+1].x; + if(y3==y) + { + point1.y = y3; + point1.x = x3; + if(direction == kInterior) //add point 2 times if the direction is interior, so that the final count of points is even + { + points[pointpos++]=point1; + } + } + else + { + point1.x = xmin+(((((x4-x3)*(y-y3))-((y4-y3)*(xmin-x3)))/((y4-y3)*dx))*dx); //striped down calculation of intersection of 2 lines + point1.y = y; + } + points[pointpos++]=point1; + } + } + delete [] vertices; + } + + for(j=1;j0;k--) + { + if(points[k].x < points[k-1].x) + { + point1 = points[k]; + points[k] = points[k-1]; + points[k-1] = point1; + } + else + { + break; + } + } + } + + for(j=0;j= maxlen) + { + maxlen = len; + mp1 = point1; + mp2 = point2; + } + } + } + } + + return DPoint2d((mp1.x+mp2.x)*0.5, (mp1.y+mp2.y)*0.5); +} + +int main(int argc, char* argv[]) +{ + if(argc != 3) + { + printf("Usage: %s shpfile_path quality\n", argv[0]); + return 1; + } + + int i, nEntities, quality; + SHPHandle hSHP; + SHPObject *psShape; + DPoint2d pt; + quality = atoi(argv[2]); + hSHP = SHPOpen(argv[1], "rb"); + SHPGetInfo(hSHP, &nEntities, NULL, NULL, NULL); + + printf("PointInPoly v1.0, by Marko Podgorsek\n----------------\n"); + for( i = 0; i < nEntities; i++ ) + { + psShape = SHPReadObject( hSHP, i ); + if(psShape->nSHPType == SHPT_POLYGON) + { + pt = CreatePointInPoly(psShape, quality); + printf("%d: x=%f y=%f\n",i, pt.x,pt.y); + } + SHPDestroyObject( psShape ); + } + + SHPClose(hSHP); + + return 0; +} + diff --git a/libs/shapelib/contrib/dbfcat.c b/libs/shapelib/contrib/dbfcat.c new file mode 100644 index 0000000..2c4eb9f --- /dev/null +++ b/libs/shapelib/contrib/dbfcat.c @@ -0,0 +1,166 @@ +/* + * Copyright (c) 1995 Frank Warmerdam + * + * This code is in the public domain. + * + * $Log: dbfcat.c,v $ + * Revision 1.2 2011-07-24 03:17:46 fwarmerdam + * include string.h and stdlib.h where needed in contrib (#2146) + * + * Revision 1.1 1999-05-26 02:56:31 candrsn + * updates to shpdxf, dbfinfo, port from Shapelib 1.1.5 of dbfcat and shpinfo + * + * Revision 1.3 1995/10/21 03:15:01 warmerda + * Changed to use binary file access. + * + * Revision 1.2 1995/08/04 03:16:22 warmerda + * Added header. + * + */ + +static char rcsid[] = + "$Id: dbfcat.c,v 1.2 2011-07-24 03:17:46 fwarmerdam Exp $"; + +#include +#include +#include "shapefil.h" + +int main( int argc, char ** argv ) + +{ + DBFHandle hDBF; + int *panWidth, i, iRecord; + char szFormat[32], szField[1024]; + char cTitle[32], nTitle[32]; + int nWidth, nDecimals; + int cnWidth, cnDecimals; + DBFHandle cDBF; + DBFFieldType hType,cType; + int ci, ciRecord; + char tfile[160]; + int hflds, j, cflds; + int verbose = 0; + int force = 0; + int mismatch = 0; + int matches = 0; + char fld_m[256]; + int shift = 0; + char type_names[4][15] = {"integer", "string", "double", "double"}; + + if( argc < 3 ) + { + printf( "dbfcat [-v] [-f] from_DBFfile to_DBFfile\n" ); + exit( 1 ); + } + + + if ( strcmp ("-v", argv[1] ) == 0 ) { shift = 1; verbose = 1; } + if ( strcmp ("-f", argv[1 + shift] ) == 0 ) { shift ++; force = 1; } + if ( strcmp ("-v", argv[1 + shift] ) == 0 ) { shift ++; verbose = 1; } + strcpy (tfile, argv[1 + shift]); + strcat (tfile, ".dbf"); + hDBF = DBFOpen( tfile, "rb" ); + if( hDBF == NULL ) + { + printf( "DBFOpen(%s.dbf,\"r\") failed for From_DBF.\n", tfile ); + exit( 2 ); + } + + strcpy (tfile, argv[2 + shift]); + strcat (tfile, ".dbf"); + + cDBF = DBFOpen( tfile, "rb+" ); + if( cDBF == NULL ) + { + printf( "DBFOpen(%s.dbf,\"rb+\") failed for To_DBF.\n", tfile ); + exit( 2 ); + } + + + if( DBFGetFieldCount(hDBF) == 0 ) + { + printf( "There are no fields in this table!\n" ); + exit( 3 ); + } + + hflds = DBFGetFieldCount(hDBF); + cflds = DBFGetFieldCount(cDBF); + + matches = 0; + for( i = 0; i < hflds; i++ ) + { + char szTitle[18]; + char cname[18]; + int j; + hType = DBFGetFieldInfo( hDBF, i, szTitle, &nWidth, &nDecimals ); + fld_m[i] = -1; + for ( j = 0; j < cflds; j ++ ) + { + cType = DBFGetFieldInfo( cDBF, j, cname, &cnWidth, &cnDecimals ); + if ( strcmp (cname, szTitle) == 0 ) + { + if ( hType != cType ) + { printf ("Incompatible fields %s(%s) != %s(%s),\n", + type_names[hType],nTitle,type_names[cType],cTitle); + mismatch = 1; + } + fld_m[i] = j; + if ( verbose ) + { printf("%s %s(%d,%d) <- %s %s(%d,%d)\n", cname, type_names[cType], + cnWidth, cnDecimals, + szTitle, type_names[hType], nWidth, nDecimals); } + j = cflds; + matches = 1; + } + } + } + + if ( (matches == 0 ) && !force ) { + printf ("ERROR: No field names match for tables, cannot proceed\n use -f to force processing using blank records\n"); + exit(-1); } + if ( mismatch && !force ) { + printf ("ERROR: field type mismatch cannot proceed\n use -f to force processing using attempted conversions\n"); + exit(-1); } + + for( iRecord = 0; iRecord < DBFGetRecordCount(hDBF); iRecord++ ) + { + ciRecord = DBFGetRecordCount( cDBF ); + for ( i = 0; i < hflds;i ++ ) + { + double cf; + ci = fld_m[i]; + if ( ci != -1 ) + { + cType = DBFGetFieldInfo( cDBF, ci, cTitle, &cnWidth, &cnDecimals ); + hType = DBFGetFieldInfo( hDBF, i, nTitle, &nWidth, &nDecimals ); + + switch( cType ) + { + case FTString: + DBFWriteStringAttribute(cDBF, ciRecord, ci, + (char *) DBFReadStringAttribute( hDBF, iRecord, i ) ); + break; + + case FTInteger: + DBFWriteIntegerAttribute(cDBF, ciRecord, ci, + (int) DBFReadIntegerAttribute( hDBF, iRecord, i ) ); + break; + + case FTDouble: +/* cf = DBFReadDoubleAttribute( hDBF, iRecord, i ); + printf ("%s <- %s (%f)\n", cTitle, nTitle, cf); +*/ + DBFWriteDoubleAttribute(cDBF, ciRecord, ci, + (double) DBFReadDoubleAttribute( hDBF, iRecord, i ) ); + break; + } + } + } /* fields names match */ + } + + if ( verbose ) { printf (" %d records appended \n\n", iRecord); } + DBFClose( hDBF ); + DBFClose( cDBF ); + + return( 0 ); +} diff --git a/libs/shapelib/contrib/dbfinfo.c b/libs/shapelib/contrib/dbfinfo.c new file mode 100644 index 0000000..6916dd5 --- /dev/null +++ b/libs/shapelib/contrib/dbfinfo.c @@ -0,0 +1,111 @@ +/* + * Copyright (c) 1999 Carl Anderson + * + * This code is in the public domain. + * + * This code is based in part on the earlier work of Frank Warmerdam + * + * requires shapelib 1.2 + * gcc dbfinfo dbfopen.o dbfinfo + * + * + * $Log: dbfinfo.c,v $ + * Revision 1.4 2016-12-05 12:44:07 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.3 2011-07-24 03:17:46 fwarmerdam + * include string.h and stdlib.h where needed in contrib (#2146) + * + * Revision 1.2 1999-05-26 02:56:31 candrsn + * updates to shpdxf, dbfinfo, port from Shapelib 1.1.5 of dbfcat and shpinfo + * + * + */ + +#include +#include +#include "shapefil.h" + +int main( int argc, char ** argv ) + +{ + DBFHandle hDBF; + int *panWidth, i, iRecord; + char szFormat[32], szField[1024]; + char ftype[32], cTitle[32], nTitle[32]; + int nWidth, nDecimals; + int cnWidth, cnDecimals; + DBFHandle cDBF; + DBFFieldType hType,cType; + int ci, ciRecord; + +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( argc != 2 ) + { + printf( "dbfinfo xbase_file\n" ); + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Open the file. */ +/* -------------------------------------------------------------------- */ + hDBF = DBFOpen( argv[1], "rb" ); + if( hDBF == NULL ) + { + printf( "DBFOpen(%s,\"r\") failed.\n", argv[1] ); + exit( 2 ); + } + + printf ("Info for %s\n",argv[1]); + +/* -------------------------------------------------------------------- */ +/* If there is no data in this file let the user know. */ +/* -------------------------------------------------------------------- */ + i = DBFGetFieldCount(hDBF); + printf ("%d Columns, %d Records in file\n",i,DBFGetRecordCount(hDBF)); + +/* -------------------------------------------------------------------- */ +/* Compute offsets to use when printing each of the field */ +/* values. We make each field as wide as the field title+1, or */ +/* the field value + 1. */ +/* -------------------------------------------------------------------- */ + panWidth = (int *) malloc( DBFGetFieldCount( hDBF ) * sizeof(int) ); + + for( i = 0; i < DBFGetFieldCount(hDBF); i++ ) + { + char szTitle[12]; + DBFFieldType eType; + + switch ( DBFGetFieldInfo( hDBF, i, szTitle, &nWidth, &nDecimals )) { + case FTString: + strcpy (ftype, "string");; + break; + + case FTInteger: + strcpy (ftype, "integer"); + break; + + case FTDouble: + strcpy (ftype, "float"); + break; + + case FTInvalid: + strcpy (ftype, "invalid/unsupported"); + break; + + default: + strcpy (ftype, "unknown"); + break; + } + printf ("%15.15s\t%15s (%d,%d)\n",szTitle, ftype, nWidth, nDecimals); + + } + + DBFClose( hDBF ); + + return( 0 ); +} diff --git a/libs/shapelib/contrib/doc/Shape_PointInPoly_README.txt b/libs/shapelib/contrib/doc/Shape_PointInPoly_README.txt new file mode 100644 index 0000000..ed4ff8e --- /dev/null +++ b/libs/shapelib/contrib/doc/Shape_PointInPoly_README.txt @@ -0,0 +1,59 @@ +=============================================================================== +Project: Shape_PoinInPoly +Purpose: Sample and the function for calculatin a point in a polygon + (complex,compound - it doesn't matter). Can be used for labeling. +Author: Copyright (c) 2004, Marko Podgorsek, d-mon@siol.net +=============================================================================== +Requires: shapelib 1.2 (http://shapelib.maptools.org/) +Tested and created on platform: + Windows 2000 Professional + Visual Studio .NET 7.0 + P4 2.4 GHz + 1GB RAM + +I just found out about the ShapeLib, GDAL and OGR and I must say that they're +all great projects. +I belive I'll use some of those libraries in the future. Right now I'm using +only shapelib. +The thing that led me to the http://wwww.maptools.org was the need of finding +the point in poly...but as I found out that even OGR didn't support it. So +there I was. I was forced to make my own function. Well, it was fun. I learned +a lot. +I wrote this function for the Autodesk Autocad 2004 MPolygon, because there was +no function to do this in the Object Arx SDK (the Acad programming SDK). Well, +it will be in the 2005 release...but, still. There is a function in the +Autodesk Map 2004 version...in the menu. +Not useful when you need the coordinates, not the point on the screen... +So when the Acad version was done I was thinking of doing it on the Shape files, +too. A little bit of changing the structures and variable +types (so they're not using Object Arx) and I was done. +And here it is....Contribution from me to the ShapeLib world :)...and maybe even +OGR (a little bit of changing there). + +Some statistics: +For about 69000 polygons in Autocad picture (.dwg files) +Autodesk Map 2004 was creating centroids (the menu command) about 45s (1 scan +line) +My function, with 3 scan lines took about 5s. And I was drawing the dots on the +picture... + +------------------------------------------------------------------------------- +DPoint2d CreatePointInPoly(SHPObject *psShape, int quality) + +The second parameter quality tell the function just how many rays shall it use +to get the point. +quality = 3 works very well, but anything below 5 is good. +This doesn't mean that the execution will slow down, but it just finds a good +point. That's all. + +The qality shows on the compound objects (multiple poligons with more than one +exterior loop) - if not enough rays, then there may be no centroid. +Or the U shaped thin polygon, only the bootom (below the y center line) is fat. +Autodesk Map with one scan line will create the centroid on one of the thin +parts, because it only uses the y center line. If you have more rays, one will +surely pass the fat area and centroid will be created there. + +------------------------------------------------------------------------------- +Anyone using this function: +Just send me an e-mail, so I'll see if I did anything good for the public. +And you can send me e-mail with questions also. diff --git a/libs/shapelib/contrib/doc/shpproj.txt b/libs/shapelib/contrib/doc/shpproj.txt new file mode 100644 index 0000000..d289562 --- /dev/null +++ b/libs/shapelib/contrib/doc/shpproj.txt @@ -0,0 +1,71 @@ + + +shpproj + + + +using the projection tools proj and invproj +we have implemented a shapefile projection utility + +shpproj shp_file new_shp ( -i=in_proj_file | -i="in_params" | -i=geographic ) ( -o=out_info_file | -o="out_params" | -o=geographic ) + +INPUT + Input can come from one of three sources. A projection parameter file, + directly through parameters or geographic. If the shapefile has an associated + prj file, name the same as the shapefile but ending in ".prj" it will be used + by default ignoring all other parameters. If input is omitted it defaults to + geographic, unless the default prj file exists.. + +OUTPUT + Output can come from one of three sources. A projection parameter file, + directly through parameters or geographic. If output is omitted it defaults + to geographic. + +PROJECTION PARAMETER FILE + This file MUST end with the extension ".prj". It has the form of one + projection parameter per line. Parameters can be in any order. + +PROJECTION PARAMETERS + Are the same as used by proj and invproj. + use proj -lP to see available projections + proj -lu to see available units + proj -le to see available ellipsoid + + +USAGE + +the following example projects file rowtest to row3, moving data from Stateplane NAD83 zone 1002 to utm zone 16 in meters + +shpproj rowtest row -i="init=nad83:1002 units=us-ft" -o="proj=utm zone=16 units=m" + +shpproj rowtest row3 -o="proj=utm zone=18 units=m" -i="zone=16 proj=utm units=us-ft" + +shpproj rowtest row3 -o="proj=utm zone=18 units=m" + +shpproj rowtest row3 -i=myfile.prj -o=geographic +shpproj rowtest row3 -is=myfile.prj + + +Datums +Stateplane data can be accessed by the init function + init=nad83:1003 +which is of the form + datum:FIPSzone + +To move from NAD27 to NAD83 or otherwise the shpproj utility moves to +geographic coordinates and the back to the desired datum. proj can handle +direct datum to datum conversions but it is umimplemented here. + +for a complete listing of FIPSZones by datum read nad/nad.lst in the PROJ4 +library + + +CAUTION + +It is possible to get very poor results for projection values when using +coordinates VERY far away from the intended scope of the projection. + +An example of a poor projection choice would be to move from nad83:1002 +(Georgia West) for data in California into utm. The resulting data will be +much less accurate than if it had started as geographic. + diff --git a/libs/shapelib/contrib/doc/shpsort.txt b/libs/shapelib/contrib/doc/shpsort.txt new file mode 100644 index 0000000..7e40348 --- /dev/null +++ b/libs/shapelib/contrib/doc/shpsort.txt @@ -0,0 +1,44 @@ +============================= ABOUT =========================================== + +The program "shpsort" is a standalone program for sorting shapefiles +on one or more fields (including the pseudofield "SHAPE") and outputing +the results. People may find it useful for forcing drawing order. + +============================= AUTHOR ========================================== + +Eric G. Miller +California Department of Fish and Game +2004-06-30 + +============================= USAGE =========================================== + +shpsort {SORT_ORDER;SORT_ORDER...} + +============================= DETAILS ========================================= + +INFILE The input shapefile + +OUTFILE The output shapefile + +SORT_FIELD Any attribute field of the shapefile, including "SHAPE" + +SORT_ORDER Specify "ASCENDING" or "DESCENDING" for each SORT_FIELD. + This field is optional, and is assumed to be ASCENDING + unless the exact word "DESCENDING" is specified (case + matters). + + When sorting on the "SHAPE" the records are sorted as follows: + + * Null shapes are treated as any other null field and will + sort to the top in ASCENDING mode. A warning is issued + for each null shape encountered. + * POINT, POINTM, POINTZ, MULTIPOINT, MULTIPOINTM, MULTIPOINTZ + and MULTIPATCH are all sorted by the maximum "Y" value of + their envelopes (not particularly useful). + * POLYLINE, POLYLINEZ and POLYLINEM are sorted by total 2d + shape length. + * POLYGON, POLYGONZ and POLYGONM are sorted by the 2d shape + area. Shapes are assumed to be in canonical ordering, so that + the area of interior rings (if any) is subtracted from the + area of exterior rings. + diff --git a/libs/shapelib/contrib/makefile.vc b/libs/shapelib/contrib/makefile.vc new file mode 100644 index 0000000..f376f64 --- /dev/null +++ b/libs/shapelib/contrib/makefile.vc @@ -0,0 +1,34 @@ + +CFLAGS = /Ox /MD /nologo /I.. /IC:\OSGeo4W\include \ + /D_LITTLE_ENDIAN -DPROJ4 + +LINKARGS = ..\shapelib_i.lib C:\OSGeo4W\lib\proj_i.lib + +default: all + +all: shpcat.exe shpcentrd.exe shpdxf.exe shpinfo.exe shpproj.exe + +shpcat.exe: shpcat.obj shpgeo.obj + $(CC) $(CFLAGS) shpcat.obj $(LINKARGS) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +shpcentrd.exe: shpcentrd.obj shpgeo.obj + $(CC) $(CFLAGS) shpcentrd.obj shpgeo.obj $(LINKARGS) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +shpproj.exe: shpproj.obj shpgeo.obj + $(CC) $(CFLAGS) shpproj.obj shpgeo.obj $(LINKARGS) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +shpdxf.exe: shpdxf.obj shpgeo.obj + $(CC) $(CFLAGS) shpdxf.obj $(LINKARGS) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +shpinfo.exe: shpinfo.obj shpgeo.obj + $(CC) $(CFLAGS) shpinfo.obj $(LINKARGS) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +clean: + -del *.obj + -del *.exe + -del *.manifest diff --git a/libs/shapelib/contrib/shpcat.c b/libs/shapelib/contrib/shpcat.c new file mode 100644 index 0000000..d4c32df --- /dev/null +++ b/libs/shapelib/contrib/shpcat.c @@ -0,0 +1,100 @@ +/****************************************************************************** + * Copyright (c) 1999, Carl Anderson + * + * This code is based in part on the earlier work of Frank Warmerdam + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * shpcat + * + * gcc shpcat.c ../shpopen.o -o shpcat + * + * Utility program to concatenate two shapefiles + * Must be used in concert with dbfcat + * + */ + +#include +#include +#include "shapefil.h" + +int dbfcat_main( int argc, char ** argv ); + +int main( int argc, char ** argv ) + +{ + SHPHandle hSHP, cSHP; + int nShapeType, i, nEntities, nShpInFile; + SHPObject *shape; + +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( argc != 3 ) + { + printf( "shpcat from_shpfile to_shpfile\n" ); + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Open the passed shapefile. */ +/* -------------------------------------------------------------------- */ + hSHP = SHPOpen( argv[1], "rb" ); + + if( hSHP == NULL ) + { + printf( "Unable to open:%s\n", argv[1] ); + exit( 1 ); + } + + SHPGetInfo( hSHP, &nEntities, &nShapeType, NULL, NULL ); + fprintf(stderr,"Opened From File %s, with %d shapes\n",argv[1],nEntities); + +/* -------------------------------------------------------------------- */ +/* Open the passed shapefile. */ +/* -------------------------------------------------------------------- */ + cSHP = SHPOpen( argv[2], "rb+" ); + + if( cSHP == NULL ) + { + printf( "Unable to open:%s\n", argv[2] ); + exit( 1 ); + } + + SHPGetInfo( cSHP, &nShpInFile, NULL, NULL, NULL ); + fprintf(stderr,"Opened to file %s with %d shapes, ready to add %d\n", + argv[2],nShpInFile,nEntities); + +/* -------------------------------------------------------------------- */ +/* Skim over the list of shapes, printing all the vertices. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < nEntities; i++ ) + { + shape = SHPReadObject( hSHP, i ); + SHPWriteObject( cSHP, -1, shape ); + SHPDestroyObject ( shape ); + + } + + SHPClose( hSHP ); + SHPClose( cSHP ); + + exit( 0 ); +} diff --git a/libs/shapelib/contrib/shpcentrd.c b/libs/shapelib/contrib/shpcentrd.c new file mode 100644 index 0000000..8156b9e --- /dev/null +++ b/libs/shapelib/contrib/shpcentrd.c @@ -0,0 +1,159 @@ +/****************************************************************************** + * Copyright (c) 1999, Carl Anderson + * + * this code is based in part on the earlier work of Frank Warmerdam + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * shpcentrd.c - compute XY centroid for complex shapes + * and create a new SHPT_PT file of then + * specifically undo compound objects but not complex ones + * + * + * $Log: shpcentrd.c,v $ + * Revision 1.3 2011-07-24 03:17:46 fwarmerdam + * include string.h and stdlib.h where needed in contrib (#2146) + * + * Revision 1.2 1999-05-26 02:56:31 candrsn + * updates to shpdxf, dbfinfo, port from Shapelib 1.1.5 of dbfcat and shpinfo + * + * + * + */ + + +/* the centroid is defined as + * + * Cx = sum (x dArea ) / Total Area + * and + * Cy = sum (y dArea ) / Total Area + */ + +#include +#include +#include "shapefil.h" +#include "shpgeo.h" + +int main( int argc, char ** argv ) + +{ + SHPHandle old_SHP, new_SHP; + DBFHandle old_DBF, new_DBF; + int nShapeType, nEntities, nVertices, nParts, *panParts, i, iPart; + double *padVertices, adBounds[4]; + const char *pszPlus; + DBFFieldType idfld_type; + int idfld, nflds; + char kv[257] = ""; + char idfldName[120] = ""; + char fldName[120] = ""; + char shpFileName[120] = ""; + char dbfFileName[120] = ""; + double apeture[4]; + char *DBFRow = NULL; + int Cpan[2] = { 0,0 }; + int byRing = 1; + PT Centrd; + SHPObject *psCShape, *cent_pt; + + + if( argc < 3 ) + { + printf( "shpcentrd shp_file new_shp_file\n" ); + exit( 1 ); + } + + old_SHP = SHPOpen (argv[1], "rb" ); + old_DBF = DBFOpen (argv[1], "rb"); + if( old_SHP == NULL || old_DBF == NULL ) + { + printf( "Unable to open old files:%s\n", argv[1] ); + exit( 1 ); + } + + SHPGetInfo( old_SHP, &nEntities, &nShapeType, NULL, NULL ); + new_SHP = SHPCreate ( argv[2], SHPT_POINT ); + + new_DBF = DBFCloneEmpty (old_DBF, argv[2]); + if( new_SHP == NULL || new_DBF == NULL ) + { + printf( "Unable to create new files:%s\n", argv[2] ); + exit( 1 ); + } + + DBFRow = (char *) malloc ( (old_DBF->nRecordLength) + 15 ); + + +#ifdef DEBUG + printf ("ShpCentrd using shpgeo \n"); +#endif + + for( i = 0; i < nEntities; i++ ) + { + int res ; + + psCShape = SHPReadObject( old_SHP, i ); + + if ( byRing == 1 ) { + int ring; + for ( ring = 0; ring < psCShape->nParts; ring ++ ) { + SHPObject *psO; + psO = SHPClone ( psCShape, ring, ring + 1 ); + + Centrd = SHPCentrd_2d ( psO ); + + cent_pt = SHPCreateSimpleObject ( SHPT_POINT, 1, + (double*) &(Centrd.x), (double*) &(Centrd.y), NULL ); + + SHPWriteObject ( new_SHP, -1, cent_pt ); + + memcpy ( DBFRow, DBFReadTuple ( old_DBF, i ), + old_DBF->nRecordLength ); + DBFWriteTuple ( new_DBF, new_DBF->nRecords, DBFRow ); + + SHPDestroyObject ( cent_pt ); + + SHPDestroyObject ( psO ); + } + + } + else { + + Centrd = SHPCentrd_2d ( psCShape ); + + cent_pt = SHPCreateSimpleObject ( SHPT_POINT, 1, + (double*) &(Centrd.x), (double*) &(Centrd.y), NULL ); + + SHPWriteObject ( new_SHP, -1, cent_pt ); + + memcpy ( DBFRow, DBFReadTuple ( old_DBF, i ), + old_DBF->nRecordLength ); + DBFWriteTuple ( new_DBF, new_DBF->nRecords, DBFRow ); + + SHPDestroyObject ( cent_pt ); + } + } + + SHPClose( old_SHP ); + SHPClose( new_SHP ); + DBFClose( old_DBF ); + DBFClose( new_DBF ); + printf ("\n"); +} diff --git a/libs/shapelib/contrib/shpdata.c b/libs/shapelib/contrib/shpdata.c new file mode 100644 index 0000000..6ab6013 --- /dev/null +++ b/libs/shapelib/contrib/shpdata.c @@ -0,0 +1,134 @@ +/****************************************************************************** + * Copyright (c) 1999, Carl Anderson + * + * this code is based in part on the earlier work of Frank Warmerdam + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * shpdata.c - utility program for testing elements of the libraries + * + * + * $Log: shpdata.c,v $ + * Revision 1.3 2016-12-05 12:44:07 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.2 1999-05-26 02:56:31 candrsn + * updates to shpdxf, dbfinfo, port from Shapelib 1.1.5 of dbfcat and shpinfo + * + * + * + */ + +#include +#include "shapefil.h" +#include "shpgeo.h" + +int main( int argc, char ** argv ) + +{ + SHPHandle old_SHP, new_SHP; + DBFHandle old_DBF, new_DBF; + int nShapeType, nEntities, nVertices, nParts, *panParts, i, iPart; + double *padVertices, adBounds[4]; + const char *pszPlus; + DBFFieldType idfld_type; + int idfld, nflds; + char kv[257] = ""; + char idfldName[120] = ""; + char fldName[120] = ""; + char shpFileName[120] = ""; + char dbfFileName[120] = ""; + char *DBFRow = NULL; + int Cpan[2] = { 0,0 }; + int byRing = 1; + PT oCentrd, ringCentrd; + SHPObject *psCShape, *cent_pt; + double oArea = 0.0, oLen = 0.0; + + if( argc < 2 ) + { + printf( "shpdata shp_file \n" ); + exit( 1 ); + } + + old_SHP = SHPOpen (argv[1], "rb" ); + old_DBF = DBFOpen (argv[1], "rb"); + if( old_SHP == NULL || old_DBF == NULL ) + { + printf( "Unable to open old files:%s\n", argv[1] ); + exit( 1 ); + } + + SHPGetInfo( old_SHP, &nEntities, &nShapeType, NULL, NULL ); + for( i = 0; i < nEntities; i++ ) + { + int res ; + + psCShape = SHPReadObject( old_SHP, i ); + + if ( byRing == 1 ) { + int ring, prevStart, ringDir; + double ringArea; + + prevStart = psCShape->nVertices; + for ( ring = (psCShape->nParts - 1); ring >= 0; ring-- ) { + SHPObject *psO; + int j, numVtx, rStart; + + rStart = psCShape->panPartStart[ring]; + if ( ring == (psCShape->nParts -1) ) + { numVtx = psCShape->nVertices - rStart; } + else + { numVtx = psCShape->panPartStart[ring+1] - rStart; } + + printf ("(shpdata) Ring(%d) (%d for %d) \n", ring, rStart, numVtx); + psO = SHPClone ( psCShape, ring, ring + 1 ); + + ringDir = SHPRingDir_2d ( psO, 0 ); + ringArea = RingArea_2d (psO->nVertices,(double*) psO->padfX, + (double*) psO->padfY); + RingCentroid_2d ( psO->nVertices, (double*) psO->padfX, + (double*) psO->padfY, &ringCentrd, &ringArea); + + + printf ("(shpdata) Ring %d, %f Area %d dir \n", + ring, ringArea, ringDir ); + + SHPDestroyObject ( psO ); + printf ("(shpdata) End Ring \n"); + } /* (ring) [0,nParts */ + + } /* by ring */ + + oArea = SHPArea_2d ( psCShape ); + oLen = SHPLength_2d ( psCShape ); + oCentrd = SHPCentrd_2d ( psCShape ); + printf ("(shpdata) Part (%d) %f Area %f length, C (%f,%f)\n", + i, oArea, oLen, oCentrd.x, oCentrd.y ); + } + + SHPClose( old_SHP ); + + DBFClose( old_DBF ); + + printf ("\n"); +} diff --git a/libs/shapelib/contrib/shpdxf.c b/libs/shapelib/contrib/shpdxf.c new file mode 100644 index 0000000..c4e7cf2 --- /dev/null +++ b/libs/shapelib/contrib/shpdxf.c @@ -0,0 +1,340 @@ +/****************************************************************************** + * Copyright (c) 1999, Carl Anderson + * + * This code is based in part on the earlier work of Frank Warmerdam + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * shp2dxf.c + * + * derived from a ESRI Avenue Script + * and DXF specification from AutoCad 3 (yes 1984) + * + * modifications Carl Andrson 11/96 + * modifications Carl Andrson 3/97 + * + * converted to C code 12/98 + * + * requires shapelib 1.2 + * gcc shpdxf.c shpopen.o dbfopen.o -o shpdxf + * + */ + +#include +#include +#include "shapefil.h" + +#define FLOAT_PREC "%16.5f\r\n" + +void dxf_hdr (x1,y1,x2,y2,df) +double x1,y1,x2,y2; +FILE *df; +{ +/* Create HEADER section */ + + fprintf( df, " 0\r\n"); + fprintf( df, "SECTION\r\n"); + fprintf( df, " 2\r\n" ); + fprintf( df, "HEADER\r\n" ); + fprintf( df, " 9\r\n" ); + fprintf( df, "$EXTMAX\r\n" ); + fprintf( df, " 10\r\n" ); + fprintf( df, FLOAT_PREC, x2 ); + fprintf( df, " 20\r\n" ); + fprintf( df, FLOAT_PREC, y2 ); + fprintf( df, " 9\r\n" ); + fprintf( df, "$EXTMIN\r\n" ); + fprintf( df, " 10\r\n" ); + fprintf( df, FLOAT_PREC, x1 ); + fprintf( df, " 20\r\n" ); + fprintf( df, FLOAT_PREC, y1 ); + fprintf( df, " 9\r\n" ); + fprintf( df, "$LUPREC\r\n" ); + fprintf( df, " 70\r\n" ); + fprintf( df, " 14\r\n" ); + fprintf( df, " 0\r\n" ); + fprintf( df, "ENDSEC\r\n" ); + +/* ' Create TABLES section */ + + fprintf( df, " 0\r\n" ); + fprintf( df, "SECTION\r\n" ); + fprintf( df, " 2\r\n" ); + fprintf( df, "TABLES\r\n" ); +/* ' Table 1 - set up line type */ + fprintf( df, " 0\r\n" ); + fprintf( df, "TABLE\r\n" ); + fprintf( df, " 2\r\n" ); + fprintf( df, "LTYPE\r\n" ); + fprintf( df, " 70\r\n" ); + fprintf( df, "2\r\n" ); +/* ' Entry 1 of Table 1 */ + fprintf( df, " 0\r\n" ); + fprintf( df, "LTYPE\r\n" ); + fprintf( df, " 2\r\n" ); + fprintf( df, "CONTINUOUS\r\n" ); + fprintf( df, " 70\r\n" ); + fprintf( df, "64\r\n" ); + fprintf( df, " 3\r\n" ); + fprintf( df, "Solid line\r\n" ); + fprintf( df, " 72\r\n" ); + fprintf( df, "65\r\n" ); + fprintf( df, " 73\r\n" ); + fprintf( df, "0\r\n" ); + fprintf( df, " 40\r\n" ); + fprintf( df, "0.0\r\n" ); + fprintf( df, " 0\r\n" ); + fprintf( df, "ENDTAB\r\n" ); + /* End of TABLES section */ + fprintf( df, " 0\r\n" ); + fprintf( df, "ENDSEC\r\n" ); + + /* Create BLOCKS section */ + + fprintf( df, " 0\r\n" ); + fprintf( df, "SECTION\r\n" ); + fprintf( df, " 2\r\n" ); + fprintf( df, "BLOCKS\r\n" ); + fprintf( df, " 0\r\n" ); + fprintf( df, "ENDSEC\r\n" ); + fprintf( df, " 0\r\n" ); + fprintf( df, "SECTION\r\n" ); + fprintf( df, " 2\r\n" ); + fprintf( df, "ENTITIES\r\n" ); + +} + + +void +dxf_ent_preamble (dxf_type, id, df) +int dxf_type; +char *id; +FILE *df; +{ + + fprintf( df, " 0\r\n" ); + + switch (dxf_type) { + case SHPT_POLYGON: + case SHPT_ARC: fprintf (df, "POLYLINE\r\n"); + break; + default: fprintf(df, "POINT\r\n"); + } + + fprintf( df, " 8\r\n"); + fprintf( df, "%s\r\n", id ); + switch ( dxf_type ) { + case SHPT_ARC: + fprintf( df, " 6\r\n" ); + fprintf( df, "CONTINUOUS\r\n" ); + fprintf( df, " 66\r\n" ); + fprintf( df, "1\r\n" ); + break; + case SHPT_POLYGON: + fprintf( df, " 6\r\n" ); + fprintf( df, "CONTINUOUS\r\n" ); + fprintf( df, " 66\r\n" ); + fprintf( df, "1\r\n" ); + fprintf( df, " 70\r\n"); + fprintf (df, "1\r\n"); + default: break; + } + +} + +void +dxf_ent (id, x, y, z, dxf_type, df) +char *id; +double x,y,z; +int dxf_type; +FILE *df; +{ + if ((dxf_type == SHPT_ARC) || ( dxf_type == SHPT_POLYGON)) { + fprintf( df, " 0\r\n"); + fprintf( df, "VERTEX\r\n"); + fprintf( df, " 8\r\n"); + fprintf( df, "%s\r\n", id); + } + fprintf( df, " 10\r\n" ); + fprintf( df, FLOAT_PREC, x ); + fprintf( df, " 20\r\n" ); + fprintf( df, FLOAT_PREC, y ); + fprintf( df, " 30\r\n" ); + if ( z != 0 ) + fprintf( df, FLOAT_PREC, z ); + else + fprintf( df, "0.0\r\n" ); +} + + +void +dxf_ent_postamble (dxf_type, df) +int dxf_type; +FILE *df; +{ + if ((dxf_type == SHPT_ARC) || ( dxf_type == SHPT_POLYGON)) + fprintf( df, " 0\r\nSEQEND\r\n 8\r\n0\r\n"); +} + + +int +main (int argc, char **argv) + +{ + char shpFileName[80] = "", dbfFileName[80] = ""; + char dxfFileName[80] = ""; + char idfldName[15]; + char zfldName[6] = "ELEV"; + char fldName[15]; + char id[255]; + double elev; + int parts, *panParts, nParts, nVertices; + FILE *dxf; + SHPHandle shp; + DBFHandle dbf; + DBFFieldType idfld_type; + double adfBoundsMin[4], adfBoundsMax[4]; + int vrtx, shp_type, shp_numrec, zfld, idfld, nflds, recNum, part; + unsigned int MaxElem = -1; + + if ( argc < 2 ) { + printf ("usage: shpdxf shapefile {idfield}\r\n"); + exit (-1); + } + + strcpy (shpFileName,argv[1]); + strncpy (dbfFileName, shpFileName, strlen(shpFileName)-3); + strcat (dbfFileName,"dbf"); + + strncpy (dxfFileName, shpFileName,strlen(shpFileName)-3); + strcat( dxfFileName, "dxf"); + + shp = SHPOpen (shpFileName, "rb"); + dbf = DBFOpen (dbfFileName, "rb"); + dxf = fopen( dxfFileName, "w"); + + printf("Starting conversion %s(%s) -> %s\r\n", + shpFileName,dbfFileName,dxfFileName); + + SHPGetInfo (shp, &shp_numrec, &shp_type, adfBoundsMin, adfBoundsMax ); + printf ("file has %d objects\r\n", shp_numrec); + dxf_hdr(adfBoundsMin[0], adfBoundsMin[1], adfBoundsMax[0], adfBoundsMax[1], + dxf); + +/* Before proceeding, allow the user to specify the ID field to use or default to the record number.... */ + + if ( argc > 3 ) MaxElem = atoi(argv[3]); + + nflds = DBFGetFieldCount(dbf); + if ( argc > 2 ) { + strcpy (idfldName, argv[2]); + for ( idfld=0; idfld < nflds; idfld++ ) { + idfld_type = DBFGetFieldInfo( dbf, idfld, fldName, NULL, NULL); + if (!strcmp (idfldName, fldName )) + break; + } + if ( idfld >= nflds ) { + printf ("Id field %s not found, using default\r\n",idfldName); + idfld = -1; + } else + printf ("proceeding with field %s for LayerNames\r\n",fldName); + } + else + idfld = -1; + + for ( zfld=0; zfld < nflds; zfld++ ) { + DBFGetFieldInfo( dbf, zfld, fldName, NULL, NULL); + if (!strcmp (zfldName, fldName )) + break; + } + if ( zfld >= nflds ) + zfld = -1; +// printf ("proceeding with id = %d, elevation = %d\r\n",idfld, zfld); + +/* Proceed to process data..... */ + + for ( recNum = 0; (recNum < shp_numrec) && (recNum < MaxElem); recNum++) { + + SHPObject *shape; + + if ( idfld >= 0 ) + switch (idfld_type) { + case FTString: sprintf (id, "lvl_%s",DBFReadStringAttribute ( dbf, recNum, idfld )); + break; + default: sprintf(id, "%-20.0lf", DBFReadDoubleAttribute (dbf, recNum, idfld)); + } + else + sprintf (id,"lvl_%-20d",(recNum +1 )); + + + if ( zfld >= 0 ) + elev = 0; + else + elev = DBFReadDoubleAttribute ( dbf, recNum, zfld ); + +#ifdef DEBUG + printf("\r\nworking on obj %d", recNum); +#endif + + shape = SHPReadObject( shp, recNum ); + + nVertices = shape->nVertices; + nParts = shape->nParts; + panParts = shape->panPartStart; + part = 0; + for (vrtx=0; vrtx < nVertices; vrtx ++ ) { +#ifdef DEBUG + printf("\rworking on part %d, vertex %d", part,vrtx); +#endif + if ( panParts[part] == vrtx ) { +#ifdef DEBUG + printf ("object preamble\r\n"); +#endif + dxf_ent_preamble (shp_type, id, dxf); + } + + dxf_ent (id, shape->padfX[vrtx], shape->padfY[vrtx], + elev, shp_type, dxf); + + if ((panParts[part] == (vrtx + 1))|| (vrtx == (nVertices -1)) ) { + dxf_ent_postamble (shp_type, dxf); + part ++; + } + } + SHPDestroyObject( shape ); + } + +/* close out DXF file */ + fprintf( dxf, "0\r\n" ); + fprintf( dxf, "ENDSEC\r\n" ); + fprintf( dxf, "0\r\n" ); + fprintf( dxf, "EOF\r\n" ); + + + SHPClose (shp); + DBFClose (dbf); + fclose (dxf); +} + + + + + + diff --git a/libs/shapelib/contrib/shpfix.c b/libs/shapelib/contrib/shpfix.c new file mode 100644 index 0000000..1ed73a3 --- /dev/null +++ b/libs/shapelib/contrib/shpfix.c @@ -0,0 +1,110 @@ +/****************************************************************************** + * Copyright (c) 1999, Carl Anderson + * + * This code is based in part on the earlier work of Frank Warmerdam + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * shpfix + * + * + * gcc -c shpfix.c shpopen.c -o shpfix + * + * Utility program to fix nulls and inconsistencies in Shapefiles + * as happens from time to time + * + * Simply load and rewrite each record, parameter fixrex allow user to null + * a particularly nasty record if needed + * + */ + +#include +#include +#include "shapefil.h" + +int main( int argc, char ** argv ) + +{ + SHPHandle hSHP, cSHP; + int nShapeType, cShapeType, nEntities, i; + double adBounds[4]; + SHPObject *shape; + int fix_rec; + +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( argc <= 3 ) + { + printf( "shpfix shpfile new_file \n" ); + exit( 1 ); + } + + fix_rec = atoi (argv[3]); + fix_rec --; + +/* -------------------------------------------------------------------- */ +/* Open the passed shapefile. */ +/* -------------------------------------------------------------------- */ + hSHP = SHPOpen( argv[1], "rb+" ); + + if( hSHP == NULL ) + { + printf( "Unable to open:%s\n", argv[1] ); + exit( 1 ); + } + + SHPGetInfo( hSHP, &nEntities, &nShapeType, NULL, NULL ); + + +/* -------------------------------------------------------------------- */ +/* Open the passed shapefile. */ +/* -------------------------------------------------------------------- */ + cSHP = SHPCreate( argv[2], nShapeType ); + + if( cSHP == NULL ) + { + printf( "Unable to open:%s\n", argv[2] ); + exit( 1 ); + } + + SHPGetInfo( cSHP, NULL, &cShapeType, &(adBounds[0]), &(adBounds[2]) ); + + +/* -------------------------------------------------------------------- */ +/* Skim over the list of shapes, printing all the vertices. */ +/* -------------------------------------------------------------------- */ + + for( i = 0; i < nEntities; i++ ) + { + + shape = SHPReadObject( hSHP, i ); + if ( i == fix_rec ) + { shape->nParts = 0; + shape->nVertices = 0; + } + SHPWriteObject( cSHP, -1, shape ); + SHPDestroyObject ( shape ); + + } + + + SHPClose ( hSHP ); + SHPClose ( cSHP ); +} diff --git a/libs/shapelib/contrib/shpgeo.c b/libs/shapelib/contrib/shpgeo.c new file mode 100644 index 0000000..3b04b3a --- /dev/null +++ b/libs/shapelib/contrib/shpgeo.c @@ -0,0 +1,1631 @@ +/****************************************************************************** + * Copyright (c) 1999, Carl Anderson + * + * This code is based in part on the earlier work of Frank Warmerdam + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * requires shapelib 1.2 + * gcc shpproj shpopen.o dbfopen.o -lm -lproj -o shpproj + * + * this may require linking with the PROJ4 projection library available from + * + * http://www.remotesensing.org/proj + * + * use -DPROJ4 to compile in Projection support + * + * $Log: shpgeo.c,v $ + * Revision 1.16 2017-07-10 18:01:35 erouault + * * contrib/shpgeo.c: fix compilation on _MSC_VER < 1800 regarding lack + * of NAN macro. + * + * Revision 1.15 2016-12-06 21:13:33 erouault + * * configure.ac: change soname to 2:1:0 to be in sync with Debian soname. + * http://bugzilla.maptools.org/show_bug.cgi?id=2628 + * Patch by Bas Couwenberg + * + * * contrib/doc/Shape_PointInPoly_README.txt, contrib/shpgeo.c: typo fixes. + * http://bugzilla.maptools.org/show_bug.cgi?id=2629 + * Patch by Bas Couwenberg + * + * * web/*: use a local .css file to avoid a privacy breach issue reported + * by the lintian QA tool. + * http://bugzilla.maptools.org/show_bug.cgi?id=2630 + * Patch by Bas Couwenberg + * + * + * Contributed by Sandro Mani: https://github.com/manisandro/shapelib/tree/autotools + * + * Revision 1.14 2016-12-05 12:44:07 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.13 2011-07-24 03:17:46 fwarmerdam + * include string.h and stdlib.h where needed in contrib (#2146) + * + * Revision 1.12 2007-09-03 23:17:46 fwarmerdam + * fix SHPDimension() function + * + * Revision 1.11 2006/11/06 20:45:58 fwarmerdam + * Fixed SHPProject. + * + * Revision 1.10 2006/11/06 20:44:58 fwarmerdam + * SHPProject() uses pj_transform now + * + * Revision 1.9 2006/01/25 15:33:50 fwarmerdam + * fixed ppsC assignment maptools bug 1263 + * + * Revision 1.8 2002/01/15 14:36:56 warmerda + * upgrade to use proj_api.h + * + * Revision 1.7 2002/01/11 15:22:04 warmerda + * fix many warnings. Lots of this code is cruft. + * + * Revision 1.6 2001/08/30 13:42:31 warmerda + * avoid use of auto initialization of PT for VC++ + * + * Revision 1.5 2000/04/26 13:24:06 warmerda + * made projUV handling safer + * + * Revision 1.4 2000/04/26 13:17:15 warmerda + * check if projUV or UV + * + * Revision 1.3 2000/03/17 14:15:16 warmerda + * Don't try to use system nan.h ... doesn't always exist. + * + * Revision 1.2 1999/05/26 02:56:31 candrsn + * updates to shpdxf, dbfinfo, port from Shapelib 1.1.5 of dbfcat and shpinfo + * + */ + +#include +#include +#include +#include "shapefil.h" + +#include "shpgeo.h" + +#if defined(_MSC_VER) && _MSC_VER < 1800 +#include +#define INFINITY (DBL_MAX + DBL_MAX) +#define NAN (INFINITY - INFINITY) +#endif + + + /* I'm using some shorthand throughout this file + * R+ is a Clockwise Ring and is the positive portion of an object + * R- is a CounterClockwise Ring and is a hole in a R+ + * A complex object is one having at least one R- + * A compound object is one having more than one R+ + * A simple object has one and only one element (R+ or R-) + * + * The closed ring constraint is for polygons and assumed here + * Arcs or LineStrings I am calling Rings (generically open or closed) + * Point types are vertices or lists of vertices but not Rings + * + * SHPT_POLYGON, SHPT_POLYGONZ, SHPT_POLYGONM and SHPT_MULTIPATCH + * can have SHPObjects that are compound as well as complex + * + * SHP_POINT and its Z and M derivatives are strictly simple + * MULTI_POINT, SHPT_ARC and their derivatives may be simple or compound + * + */ + + +/* ************************************************************************** + * asFileName + * + * utility function, toss part of filename after last dot + * + * **************************************************************************/ +char * asFileName ( const char *fil, char *ext ) { + char pszBasename[120]; + static char pszFullname[120]; + int i; +/* -------------------------------------------------------------------- */ +/* Compute the base (layer) name. If there is any extension */ +/* on the passed in filename we will strip it off. */ +/* -------------------------------------------------------------------- */ +// pszFullname = (char*) malloc(( strlen(fil)+5 )); +// pszBasename = (char *) malloc(strlen(fil)+5); + strcpy( pszBasename, fil ); + for( i = strlen(pszBasename)-1; + i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' + && pszBasename[i] != '\\'; + i-- ) {} + + if( pszBasename[i] == '.' ) + pszBasename[i] = '\0'; + +/* -------------------------------------------------------------------- */ +/* Note that files pulled from */ +/* a PC to Unix with upper case filenames won't work! */ +/* -------------------------------------------------------------------- */ +// pszFullname = (char *) malloc(strlen(pszBasename) + 5); + sprintf( pszFullname, "%s.%s", pszBasename, ext ); + + return ( pszFullname ); +} + + +/************************************************************************/ +/* SfRealloc() */ +/* */ +/* A realloc cover function that will access a NULL pointer as */ +/* a valid input. */ +/************************************************************************/ +/* copied directly from shpopen.c -- maybe expose this in shapefil.h */ +static void * SfRealloc( void * pMem, int nNewSize ) + +{ + if( pMem == NULL ) + return( (void *) malloc(nNewSize) ); + else + return( (void *) realloc(pMem,nNewSize) ); +} + + +/* ************************************************************************** + * SHPPRoject + * + * Project points using projection handles, for use with PROJ4.3 + * + * act as a wrapper to protect against library changes in PROJ + * + * **************************************************************************/ +int SHPProject ( SHPObject *psCShape, projPJ inproj, projPJ outproj ) { +#ifdef PROJ4 + + int j; + + if ( pj_is_latlong(inproj) ) { + for(j=0; j < psCShape->nVertices; j++) { + psCShape->padfX[j] *= DEG_TO_RAD; + psCShape->padfY[j] *= DEG_TO_RAD; + } + } + + pj_transform(inproj, outproj, psCShape->nVertices, 0, psCShape->padfX, + psCShape->padfY, NULL); + + if ( pj_is_latlong(outproj) ) { + for(j=0; j < psCShape->nVertices; j++) { + psCShape->padfX[j] *= RAD_TO_DEG; + psCShape->padfY[j] *= RAD_TO_DEG; + } + } + + /* Recompute new Extents of projected Object */ + SHPComputeExtents ( psCShape ); +#endif + + return ( 1 ); +} + + +/* ************************************************************************** + * SHPSetProjection + * + * establish a projection handle for use with PROJ4.3 + * + * act as a wrapper to protect against library changes in PROJ + * + * **************************************************************************/ +projPJ SHPSetProjection ( int param_cnt, char **params ) { +#ifdef PROJ4 + projPJ *p = NULL; + + if ( param_cnt > 0 && params[0] ) + { + p = pj_init ( param_cnt, params ); + } + else + { + char* params_local[] = { "+proj=longlat", NULL }; + p = pj_init ( 1, params_local ); + } + + return ( p ); +#else + return ( NULL ); +#endif +} + + +/* ************************************************************************** + * SHPFreeProjection + * + * release a projection handle for use with PROJ4.3 + * + * act as a wrapper to protect against library changes in PROJ + * + * **************************************************************************/ +int SHPFreeProjection ( projPJ p) { +#ifdef PROJ4 + if ( p ) + pj_free ( p ); +#endif + return ( 1 ); +} + + +/* ************************************************************************** + * SHPOGisType + * + * Convert Both ways from and to OGIS Geometry Types + * + * **************************************************************************/ +int SHPOGisType ( int GeomType, int toOGis) { + + if ( toOGis == 0 ) /* connect OGis -> SHP types */ + switch (GeomType) { + case (OGIST_POINT): return ( SHPT_POINT ); break; + case (OGIST_LINESTRING): return ( SHPT_ARC ); break; + case (OGIST_POLYGON): return ( SHPT_POLYGON ); break; + case (OGIST_MULTIPOINT): return ( SHPT_MULTIPOINT ); break; + case (OGIST_MULTILINE): return ( SHPT_ARC ); break; + case (OGIST_MULTIPOLYGON): return ( SHPT_POLYGON ); break; + } + else /* ok so its SHP->OGis types */ + switch (GeomType) { + case (SHPT_POINT): return ( OGIST_POINT ); break; + case (SHPT_POINTM): return ( OGIST_POINT ); break; + case (SHPT_POINTZ): return ( OGIST_POINT ); break; + case (SHPT_ARC): return ( OGIST_LINESTRING );break; + case (SHPT_ARCZ): return ( OGIST_LINESTRING );break; + case (SHPT_ARCM): return ( OGIST_LINESTRING );break; + case (SHPT_POLYGON): return ( OGIST_MULTIPOLYGON );break; + case (SHPT_POLYGONZ): return ( OGIST_MULTIPOLYGON );break; + case (SHPT_POLYGONM): return ( OGIST_MULTIPOLYGON );break; + case (SHPT_MULTIPOINT): return ( OGIST_MULTIPOINT );break; + case (SHPT_MULTIPOINTZ): return ( OGIST_MULTIPOINT );break; + case (SHPT_MULTIPOINTM): return ( OGIST_MULTIPOINT );break; + case (SHPT_MULTIPATCH): return ( OGIST_GEOMCOLL ); break; + } + + return 0; +} + + +/* ************************************************************************** + * SHPReadSHPStream + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +int SHPReadSHPStream ( SHPObject *psCShape, char *stream_obj) { + +int obj_storage; +int my_order, need_swap =0, GeoType ; +int use_Z = 0; +int use_M = 0; + + need_swap = stream_obj[0]; + my_order = 1; + my_order = ((char*) (&my_order))[0]; + need_swap = need_swap & my_order; + + if ( need_swap ) + swapW (stream_obj, (void*) &GeoType, sizeof (GeoType) ); + else + memcpy (stream_obj, &GeoType, sizeof (GeoType) ); + + + if ( need_swap ) { + + } else { + memcpy (stream_obj, &(psCShape->nSHPType), sizeof (psCShape->nSHPType) ); + memcpy (stream_obj, &(psCShape->nShapeId), sizeof (psCShape->nShapeId) ); + memcpy (stream_obj, &(psCShape->nVertices), sizeof (psCShape->nVertices) ); + memcpy (stream_obj, &(psCShape->nParts), sizeof (psCShape->nParts) ); + memcpy (stream_obj, &(psCShape->dfXMin), sizeof (psCShape->dfXMin) ); + memcpy (stream_obj, &(psCShape->dfYMin), sizeof (psCShape->dfYMin) ); + memcpy (stream_obj, &(psCShape->dfXMax), sizeof (psCShape->dfXMax) ); + memcpy (stream_obj, &(psCShape->dfYMax), sizeof (psCShape->dfYMax) ); + if ( use_Z ) { + memcpy (stream_obj, &(psCShape->dfZMin), sizeof (psCShape->dfZMin) ); + memcpy (stream_obj, &(psCShape->dfZMax), sizeof (psCShape->dfZMax) ); + } + + memcpy (stream_obj, psCShape->panPartStart, psCShape->nParts * sizeof (int) ); + memcpy (stream_obj, psCShape->panPartType, psCShape->nParts * sizeof (int) ); + +/* get X and Y coordinate arrarys */ + memcpy (stream_obj, psCShape->padfX, psCShape->nVertices * 2 * sizeof (double) ); + +/* get Z coordinate array if used */ + if ( use_Z ) + memcpy (stream_obj, psCShape->padfZ, psCShape->nVertices * 2 * sizeof (double) ); +/* get Measure coordinate array if used */ + if ( use_M ) + memcpy (stream_obj, psCShape->padfM, psCShape->nVertices * 2 * sizeof (double) ); + } /* end put data without swap */ + + return (0); +} + + +/* ************************************************************************** + * SHPWriteSHPStream + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +int SHPWriteSHPStream ( WKBStreamObj *stream_obj, SHPObject *psCShape ) { + +/*int obj_storage = 0;*/ +int need_swap = 0, my_order, GeoType; +int use_Z = 0; +int use_M = 0; + + need_swap = 1; + need_swap = ((char*) (&need_swap))[0]; + + /*realloc (stream_obj, obj_storage );*/ + + if ( need_swap ) { + + } else { + memcpy (stream_obj, psCShape, 4 * sizeof (int) ); + memcpy (stream_obj, psCShape, 4 * sizeof (double) ); + if ( use_Z ) + memcpy (stream_obj, psCShape, 2 * sizeof (double) ); + if ( use_M ) + memcpy (stream_obj, psCShape, 2 * sizeof (double) ); + + memcpy (stream_obj, psCShape, psCShape->nParts * 2 * sizeof (int) ); + memcpy (stream_obj, psCShape, psCShape->nVertices * 2 * sizeof (double) ); + if ( use_Z ) + memcpy (stream_obj, psCShape, psCShape->nVertices * 2 * sizeof (double) ); + if ( use_M ) + memcpy (stream_obj, psCShape, psCShape->nVertices * 2 * sizeof (double) ); + } + + return (0); +} + + +/* ************************************************************************** + * WKBStreamWrite + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +int WKBStreamWrite ( WKBStreamObj* wso, void* this, int tcount, int tsize ) { + + if ( wso->NeedSwap ) + SwapG ( &(wso->wStream[wso->StreamPos]), this, tcount, tsize ); + else + memcpy ( &(wso->wStream[wso->StreamPos]), this, tsize * tcount ); + + wso->StreamPos += tsize; + + return 0; +} + + + +/* ************************************************************************** + * WKBStreamRead + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +int WKBStreamRead ( WKBStreamObj* wso, void* this, int tcount, int tsize ) { + + if ( wso->NeedSwap ) + SwapG ( this, &(wso->wStream[wso->StreamPos]), tcount, tsize ); + else + memcpy ( this, &(wso->wStream[wso->StreamPos]), tsize * tcount ); + + wso->StreamPos += tsize; + + return 0; +} + + + +/* ************************************************************************** + * SHPReadOGisWKB + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +SHPObject* SHPReadOGisWKB ( WKBStreamObj *stream_obj) { + SHPObject *psCShape; + char WKB_order; + int need_swap = 0, my_order, GeoType = 0; + int use_Z = 0, use_M = 0; + int nSHPType, thisDim; + + WKBStreamRead ( stream_obj, &WKB_order, 1, sizeof(char)); + my_order = 1; + my_order = ((char*) (&my_order))[0]; + stream_obj->NeedSwap = !(WKB_order & my_order); + + /* convert OGis Types to SHP types */ + nSHPType = SHPOGisType ( GeoType, 0 ); + + WKBStreamRead ( stream_obj, &GeoType, 1, sizeof(int)); + + thisDim = SHPDimension ( nSHPType ); + + if ( thisDim && SHPD_AREA ) + { psCShape = SHPReadOGisPolygon ( stream_obj ); } + else { + if ( thisDim && SHPD_LINE ) + { psCShape = SHPReadOGisLine ( stream_obj ); } + else { + if ( thisDim && SHPD_POINT ) + { psCShape = SHPReadOGisPoint ( stream_obj ); } + } + } + + + return (0); +} + + + +/* ************************************************************************** + * SHPWriteOGisWKB + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +int SHPWriteOGisWKB ( WKBStreamObj* stream_obj, SHPObject *psCShape ) { + + int need_swap = 0, my_order, GeoType, thisDim; + int use_Z = 0, use_M = 0; + char LSB = 1; + /* indicate that this WKB is in LSB Order */ + + /* OGis WKB can handle either byte order, but if I get to choose I'd + /* rather have it predicatable system-to-system */ + + if ( stream_obj ) { + if ( stream_obj->wStream ) + free ( stream_obj->wStream ); + } else + { stream_obj = calloc ( 3, sizeof (int ) ); } + + /* object size needs to be 9 bytes for the wrapper, and for each polygon */ + /* another 9 bytes all plus twice the total number of vertices */ + /* times the sizeof (double) and just pad with 10 more chars for fun */ + stream_obj->wStream = calloc (1, (9 * (psCShape->nParts + 1)) + + ( sizeof(double) * 2 * psCShape->nVertices ) + 10 ); + + #ifdef DEBUG2 + printf (" I just allocated %d bytes to wkbObj \n", + (int)(sizeof (int) + sizeof (int) + sizeof(int) + + ( sizeof(int) * psCShape->nParts + 1 ) + + ( sizeof(double) * 2 * psCShape->nVertices ) + 10) ); + #endif + + my_order = 1; + my_order = ((char*) (&my_order))[0]; + /* Need to swap if this system is not LSB (Intel Order) */ + stream_obj->NeedSwap = ( my_order != LSB ); + + stream_obj->StreamPos = 0; + + + #ifdef DEBUG2 + printf ("this system is (%d) LSB recorded as needSwap %d\n",my_order, stream_obj->NeedSwap); + #endif + + WKBStreamWrite ( stream_obj, & LSB, 1, sizeof(char) ); + + #ifdef DEBUG2 + printf ("this system in LSB \n"); + #endif + + + /* convert SHP Types to OGis types */ + GeoType = SHPOGisType ( psCShape->nSHPType, 1 ); + WKBStreamWrite ( stream_obj, &GeoType, 1, sizeof(int) ); + + thisDim = SHPDimension ( psCShape->nSHPType ); + + if ( thisDim && SHPD_AREA ) + { SHPWriteOGisPolygon ( stream_obj, psCShape ); } + else { + if ( thisDim && SHPD_LINE ) + { SHPWriteOGisLine ( stream_obj, psCShape ); } + else { + if ( thisDim && SHPD_POINT ) + { SHPWriteOGisPoint ( stream_obj, psCShape ); } + } + } + +#ifdef DEBUG2 + printf("(SHPWriteOGisWKB) outta here when stream pos is %d \n", stream_obj->StreamPos); +#endif + return (0); +} + + +/* ************************************************************************** + * SHPWriteOGisPolygon + * + * for this pass code to more generic OGis MultiPolygon Type + * later add support for OGis Polygon Type + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +int SHPWriteOGisPolygon ( WKBStreamObj *stream_obj, SHPObject *psCShape ) { + SHPObject **ppsC; + SHPObject *psC; + int rPart, ring, rVertices, cpart, cParts, nextring, i, j; + char Flag = 1; + int GeoType = OGIST_POLYGON; + + /* cant have more than nParts complex objects in this object */ + ppsC = calloc ( psCShape->nParts, sizeof(int) ); + + + nextring = 0; + cParts=0; + while ( nextring >= 0 ) { + ppsC[cParts] = SHPUnCompound ( psCShape, &nextring ); + cParts++; + } + +#ifdef DEBUG2 + printf ("(SHPWriteOGisPolygon) Uncompounded into %d parts \n", cParts); +#endif + + WKBStreamWrite ( stream_obj, &cParts, 1, sizeof(int) ); + + for ( cpart = 0; cpart < cParts; cpart++) { + + WKBStreamWrite ( stream_obj, & Flag, 1, sizeof(char) ); + WKBStreamWrite ( stream_obj, & GeoType, 1, sizeof(int) ); + + psC = (SHPObject*) ppsC[cpart]; + WKBStreamWrite ( stream_obj, &(psC->nParts), 1, sizeof(int) ); + + for ( ring = 0; (ring < (psC->nParts)) && (psC->nParts > 0); ring ++) { + if ( ring < (psC->nParts-2) ) + { rVertices = psC->panPartStart[ring+1] - psC->panPartStart[ring]; } + else + { rVertices = psC->nVertices - psC->panPartStart[ring]; } +#ifdef DEBUG2 + printf ("(SHPWriteOGisPolygon) scanning part %d, ring %d %d vtxs \n", + cpart, ring, rVertices); +#endif + rPart = psC->panPartStart[ring]; + WKBStreamWrite ( stream_obj, &rVertices, 1, sizeof(int) ); + for ( j=rPart; j < (rPart + rVertices); j++ ) { + WKBStreamWrite ( stream_obj, &(psC->padfX[j]), 1, sizeof(double) ); + WKBStreamWrite ( stream_obj, &(psC->padfY[j]), 1, sizeof(double) ); + } /* for each vertex */ + } /* for each ring */ + } /* for each complex part */ + +#ifdef DEBUG2 + printf ("(SHPWriteOGisPolygon) outta here \n"); +#endif + return (1); +} + + +/* ************************************************************************** + * SHPWriteOGisLine + * + * for this pass code to more generic OGis MultiXXXXXXX Type + * later add support for OGis LineString Type + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +int SHPWriteOGisLine ( WKBStreamObj *stream_obj, SHPObject *psCShape ) { + + return ( SHPWriteOGisPolygon( stream_obj, psCShape )); +} + + +/* ************************************************************************** + * SHPWriteOGisPoint + * + * for this pass code to more generic OGis MultiPoint Type + * later add support for OGis Point Type + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +int SHPWriteOGisPoint ( WKBStreamObj *stream_obj, SHPObject *psCShape ) { + int j; + + WKBStreamWrite ( stream_obj, &(psCShape->nVertices), 1, sizeof(int) ); + + for ( j=0; j < psCShape->nVertices; j++ ) { + WKBStreamWrite ( stream_obj, &(psCShape->padfX[j]), 1, sizeof(double) ); + WKBStreamWrite ( stream_obj, &(psCShape->padfY[j]), 1, sizeof(double) ); + } /* for each vertex */ + + return (1); +} + + + +/* ************************************************************************** + * SHPReadOGisPolygon + * + * for this pass code to more generic OGis MultiPolygon Type + * later add support for OGis Polygon Type + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +SHPObject* SHPReadOGisPolygon ( WKBStreamObj *stream_obj ) { + SHPObject **ppsC; + SHPObject *psC; + int rPart, ring, rVertices, cpart, cParts, nextring, i, j; + int totParts, totVertices, pRings, nParts; + + psC = SHPCreateObject ( SHPT_POLYGON, -1, 0, NULL, NULL, 0, + NULL, NULL, NULL, NULL ); + /* initialize a blank SHPObject */ + + WKBStreamRead ( stream_obj, &cParts, 1, sizeof(char) ); + + totParts = cParts; + totVertices = 0; + + SfRealloc ( psC->panPartStart, cParts * sizeof(int)); + SfRealloc ( psC->panPartType, cParts * sizeof(int)); + + for ( cpart = 0; cpart < cParts; cpart++) { + WKBStreamRead ( stream_obj, &nParts, 1, sizeof(int) ); + pRings = nParts; + /* pRings is the number of rings prior to the Ring loop below */ + + if ( nParts > 1 ) { + totParts += nParts - 1; + SfRealloc ( psC->panPartStart, totParts * sizeof(int)); + SfRealloc ( psC->panPartType, totParts * sizeof(int)); + } + + rPart = 0; + for ( ring = 0; ring < (nParts - 1); ring ++) { + WKBStreamRead ( stream_obj, &rVertices, 1, sizeof(int) ); + totVertices += rVertices; + + psC->panPartStart[ring+pRings] = rPart; + if ( ring == 0 ) + { psC->panPartType[ring + pRings] = SHPP_OUTERRING; } + else + { psC->panPartType[ring + pRings] = SHPP_INNERRING; } + + SfRealloc ( psC->padfX, totVertices * sizeof (double)); + SfRealloc ( psC->padfY, totVertices * sizeof (double)); + + for ( j=rPart; j < (rPart + rVertices); j++ ) { + WKBStreamRead ( stream_obj, &(psC->padfX[j]), 1, sizeof(double) ); + WKBStreamRead ( stream_obj, &(psC->padfY[j]), 1, sizeof(double) ); + } /* for each vertex */ + rPart += rVertices; + + } /* for each ring */ + + } /* for each complex part */ + + return ( psC ); + +} + + +/* ************************************************************************** + * SHPReadOGisLine + * + * for this pass code to more generic OGis MultiLineString Type + * later add support for OGis LineString Type + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +SHPObject* SHPReadOGisLine ( WKBStreamObj *stream_obj ) { + SHPObject **ppsC; + SHPObject *psC; + int rPart, ring, rVertices, cpart, cParts, nextring, i, j; + int totParts, totVertices, pRings, nParts; + + psC = SHPCreateObject ( SHPT_ARC, -1, 0, NULL, NULL, 0, + NULL, NULL, NULL, NULL ); + /* initialize a blank SHPObject */ + + WKBStreamRead ( stream_obj, &cParts, 1, sizeof(int) ); + + totParts = cParts; + totVertices = 0; + + SfRealloc ( psC->panPartStart, cParts * sizeof(int)); + SfRealloc ( psC->panPartType, cParts * sizeof(int)); + + for ( cpart = 0; cpart < cParts; cpart++) { + WKBStreamRead ( stream_obj, &nParts, 1, sizeof(int) ); + pRings = totParts; + /* pRings is the number of rings prior to the Ring loop below */ + + if ( nParts > 1 ) { + totParts += nParts - 1; + SfRealloc ( psC->panPartStart, totParts * sizeof(int)); + SfRealloc ( psC->panPartType, totParts * sizeof(int)); + } + + rPart = 0; + for ( ring = 0; ring < (nParts - 1); ring ++) { + WKBStreamRead ( stream_obj, &rVertices, 1, sizeof(int) ); + totVertices += rVertices; + + psC->panPartStart[ring+pRings] = rPart; + if ( ring == 0 ) + { psC->panPartType[ring + pRings] = SHPP_OUTERRING; } + else + { psC->panPartType[ring + pRings] = SHPP_INNERRING; } + + SfRealloc ( psC->padfX, totVertices * sizeof (double)); + SfRealloc ( psC->padfY, totVertices * sizeof (double)); + + for ( j=rPart; j < (rPart + rVertices); j++ ) { + WKBStreamRead ( stream_obj, &(psC->padfX[j]), 1, sizeof(double) ); + WKBStreamRead ( stream_obj, &(psC->padfY[j]), 1, sizeof(double) ); + } /* for each vertex */ + rPart += rVertices; + + } /* for each ring */ + + } /* for each complex part */ + + return ( psC ); +} + + +/* ************************************************************************** + * SHPReadOGisPoint + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +SHPObject* SHPReadOGisPoint ( WKBStreamObj *stream_obj ) { + SHPObject *psC; + int nVertices, j; + + psC = SHPCreateObject ( SHPT_MULTIPOINT, -1, 0, NULL, NULL, 0, + NULL, NULL, NULL, NULL ); + /* initialize a blank SHPObject */ + + WKBStreamRead ( stream_obj, &nVertices, 1, sizeof(int) ); + + SfRealloc ( psC->padfX, nVertices * sizeof (double)); + SfRealloc ( psC->padfY, nVertices * sizeof (double)); + + for ( j=0; j < nVertices; j++ ) { + WKBStreamRead ( stream_obj, &(psC->padfX[j]), 1, sizeof(double) ); + WKBStreamRead ( stream_obj, &(psC->padfY[j]), 1, sizeof(double) ); + } /* for each vertex */ + + return ( psC ); +} + + + + +/* ************************************************************************** + * RingReadOGisWKB + * + * this accepts OGisLineStrings which are basic building blocks + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +int RingReadOgisWKB ( SHPObject *psCShape, char *stream_obj) { + return 0; +} + + +/* ************************************************************************** + * RingWriteOGisWKB + * + * this emits OGisLineStrings which are basic building blocks + * + * Encapsulate entire SHPObject for use with Postgresql + * + * **************************************************************************/ +int RingWriteOgisWKB ( SHPObject *psCShape, char *stream_obj) { + + return 0; +} + + +/* ************************************************************************** + * SHPDimension + * + * Return the Dimensionality of the SHPObject + * a handy utility function + * + * **************************************************************************/ +int SHPDimension ( int SHPType ) { + int dimension; + + dimension = 0; + + switch ( SHPType ) { + case SHPT_POINT : dimension = SHPD_POINT; break; + case SHPT_ARC : dimension = SHPD_LINE; break; + case SHPT_POLYGON : dimension = SHPD_AREA; break; + case SHPT_MULTIPOINT : dimension = SHPD_POINT; break; + case SHPT_POINTZ : dimension = SHPD_POINT | SHPD_Z; break; + case SHPT_ARCZ : dimension = SHPD_LINE | SHPD_Z; break; + case SHPT_POLYGONZ : dimension = SHPD_AREA | SHPD_Z; break; + case SHPT_MULTIPOINTZ : dimension = SHPD_POINT | SHPD_Z; break; + case SHPT_POINTM : dimension = SHPD_POINT | SHPD_MEASURE; break; + case SHPT_ARCM : dimension = SHPD_LINE | SHPD_MEASURE; break; + case SHPT_POLYGONM : dimension = SHPD_AREA | SHPD_MEASURE; break; + case SHPT_MULTIPOINTM : dimension = SHPD_POINT | SHPD_MEASURE; break; + case SHPT_MULTIPATCH : dimension = SHPD_AREA; break; + } + + return ( dimension ); +} + + +/* ************************************************************************** + * SHPPointinPoly_2d + * + * Return a Point inside an R+ of a potentially + * complex/compound SHPObject suitable for labelling + * return only one point even if if is a compound object + * + * reject non area SHP Types + * + * **************************************************************************/ +PT SHPPointinPoly_2d ( SHPObject *psCShape ) { + PT *sPT, rPT; + + if ( !(SHPDimension (psCShape->nSHPType) & SHPD_AREA) ) + { + rPT.x = NAN; + rPT.y = NAN; + return rPT; + } + + sPT = SHPPointsinPoly_2d ( psCShape ); + + if ( sPT ) { + rPT.x = sPT[0].x; + rPT.y = sPT[0].y; + } else { + rPT.x = NAN; + rPT.y = NAN; + } + return ( rPT ); +} + + +/* ************************************************************************** + * SHPPointsinPoly_2d + * + * Return a Point inside each R+ of a potentially + * complex/compound SHPObject suitable for labelling + * return one point for each R+ even if it is a compound object + * + * reject non area SHP Types + * + * **************************************************************************/ +PT* SHPPointsinPoly_2d ( SHPObject *psCShape ) { + PT *PIP = NULL; + int cRing; + SHPObject *psO, *psInt, *CLine; + double *CLx, *CLy; + int *CLstt, *CLst, nPIP, ring, rMpart, ring_vtx, ring_nVertices; + double rLen, rLenMax; + + if ( !(SHPDimension (psCShape->nSHPType) & SHPD_AREA) ) + return ( NULL ); + + while ( psO = SHPUnCompound (psCShape, &cRing)) { + CLx = calloc ( 4, sizeof(double)); + CLy = calloc ( 4, sizeof(double)); + CLst = calloc ( 2, sizeof(int)); + CLstt = calloc ( 2, sizeof(int)); + + /* a horizontal & vertical compound line though the middle of the */ + /* extents */ + CLx [0] = psO->dfXMin; + CLy [0] = (psO->dfYMin + psO->dfYMax ) * 0.5; + CLx [1] = psO->dfXMax; + CLy [1] = (psO->dfYMin + psO->dfYMax ) * 0.5; + + CLx [2] = (psO->dfXMin + psO->dfXMax ) * 0.5; + CLy [2] = psO->dfYMin; + CLx [3] = (psO->dfXMin + psO->dfXMax ) * 0.5; + CLy [3] = psO->dfYMax; + + CLst[0] = 0; CLst[1] = 2; + CLstt[0] = SHPP_RING; CLstt[1] = SHPP_RING; + + CLine = SHPCreateObject ( SHPT_POINT, -1, 2, CLst, CLstt, 4, + CLx, CLy, NULL, NULL ); + + /* with the H & V centrline compound object, intersect it with the OBJ */ + psInt = SHPIntersect_2d ( CLine, psO ); + /* return SHP type is lowest common dimensionality of the input types */ + + + /* find the longest linestring returned by the intersection */ + ring_vtx = psInt->nVertices ; + for ( ring = (psInt->nParts - 1); ring >= 0; ring-- ) { + ring_nVertices = ring_vtx - psInt->panPartStart[ring]; + + rLen += RingLength_2d ( ring_nVertices, + (double*) &(psInt->padfX [psInt->panPartStart[ring]]), + (double*) &(psInt->padfY [psInt->panPartStart[ring]]) ); + + if ( rLen > rLenMax ) + { rLenMax = rLen; + rMpart = psInt->panPartStart[ring]; + } + ring_vtx = psInt->panPartStart[ring]; + } + + /* add the centerpoint of the longest ARC of the intersection to the */ + /* PIP list */ + nPIP ++; + SfRealloc ( PIP, sizeof(double) * 2 * nPIP); + PIP[nPIP].x = (psInt ->padfX [rMpart] + psInt ->padfX [rMpart]) * 0.5; + PIP[nPIP].y = (psInt ->padfY [rMpart] + psInt ->padfY [rMpart]) * 0.5; + + SHPDestroyObject ( psO ); + SHPDestroyObject ( CLine ); + + /* does SHPCreateobject use preallocated memory or does it copy the */ + /* contents. To be safe conditionally release CLx, CLy, CLst, CLstt */ + if ( CLx ) free ( CLx ); + if ( CLy ) free ( CLy ); + if ( CLst ) free ( CLst ); + if ( CLstt ) free ( CLstt ); + } + + return ( PIP ); +} + + +/* ************************************************************************** + * SHPCentrd_2d + * + * Return the single mathematical / geometric centroid of a potentially + * complex/compound SHPObject + * + * reject non area SHP Types + * + * **************************************************************************/ +PT SHPCentrd_2d ( SHPObject *psCShape ) { + int ring, ringPrev, ring_nVertices, rStart; + double Area, ringArea; + PT ringCentrd, C; + + + if ( !(SHPDimension (psCShape->nSHPType) & SHPD_AREA) ) + { + C.x = NAN; + C.y = NAN; + return C; + } + +#ifdef DEBUG + printf ("for Object with %d vtx, %d parts [ %d, %d] \n", + psCShape->nVertices, psCShape->nParts, + psCShape->panPartStart[0],psCShape->panPartStart[1]); +#endif + + Area = 0; + C.x = 0.0; + C.y = 0.0; + + /* for each ring in compound / complex object calc the ring cntrd */ + + ringPrev = psCShape->nVertices; + for ( ring = (psCShape->nParts - 1); ring >= 0; ring-- ) { + rStart = psCShape->panPartStart[ring]; + ring_nVertices = ringPrev - rStart; + + RingCentroid_2d ( ring_nVertices, (double*) &(psCShape->padfX [rStart]), + (double*) &(psCShape->padfY [rStart]), &ringCentrd, &ringArea); + +#ifdef DEBUG + printf ("(SHPCentrd_2d) Ring %d, vtxs %d, area: %f, ring centrd %f, %f \n", + ring, ring_nVertices, ringArea, ringCentrd.x, ringCentrd.y); +#endif + + /* use Superposition of these rings to build a composite Centroid */ + /* sum the ring centrds * ringAreas, at the end divide by total area */ + C.x += ringCentrd.x * ringArea; + C.y += ringCentrd.y * ringArea; + Area += ringArea; + ringPrev = rStart; + } + + /* hold on the division by AREA until were at the end */ + C.x = C.x / Area; + C.y = C.y / Area; +#ifdef DEBUG + printf ("SHPCentrd_2d) Overall Area: %f, Centrd %f, %f \n", + Area, C.x, C.y); +#endif + return ( C ); +} + + +/* ************************************************************************** + * RingCentroid_2d + * + * Return the mathematical / geometric centroid of a single closed ring + * + * **************************************************************************/ +int RingCentroid_2d ( int nVertices, double *a, double *b, PT *C, double *Area ) { + int iv,jv; + int sign_x, sign_y; + double dy_Area, dx_Area, Cx_accum, Cy_accum, ppx, ppy; + double x_base, y_base, x, y; + +/* the centroid of a closed Ring is defined as + * + * Cx = sum (cx * dArea ) / Total Area + * and + * Cy = sum (cy * dArea ) / Total Area + */ + + x_base = a[0]; + y_base = b[0]; + + Cy_accum = 0.0; + Cx_accum = 0.0; + + ppx = a[1] - x_base; + ppy = b[1] - y_base; + *Area = 0; + +/* Skip the closing vector */ + for ( iv = 2; iv <= nVertices - 2; iv++ ) { + x = a[iv] - x_base; + y = b[iv] - y_base; + + /* calc the area and centroid of triangle built out of an arbitrary */ + /* base_point on the ring and each successive pair on the ring */ + + /* Area of a triangle is the cross product of its defining vectors */ + /* Centroid of a triangle is the average of its vertices */ + + dx_Area = ((x * ppy) - (y * ppx)) * 0.5; + *Area += dx_Area; + + Cx_accum += ( ppx + x ) * dx_Area; + Cy_accum += ( ppy + y ) * dx_Area; +#ifdef DEBUG2 + printf("(ringcentrd_2d) Pp( %f, %f), P(%f, %f)\n", ppx, ppy, x, y); + printf("(ringcentrd_2d) dA: %f, sA: %f, Cx: %f, Cy: %f \n", + dx_Area, *Area, Cx_accum, Cy_accum); +#endif + ppx = x; + ppy = y; + } + +#ifdef DEBUG2 + printf("(ringcentrd_2d) Cx: %f, Cy: %f \n", + ( Cx_accum / ( *Area * 3) ), ( Cy_accum / (*Area * 3) )); +#endif + + /* adjust back to world coords */ + C->x = ( Cx_accum / ( *Area * 3)) + x_base; + C->y = ( Cy_accum / ( *Area * 3)) + y_base; + + return ( 1 ); +} + + + + +/* ************************************************************************** + * SHPRingDir_2d + * + * Test Polygon for CW / CCW ( R+ / R- ) + * + * return 1 for R+ + * return -1 for R- + * return 0 for error + * **************************************************************************/ +int SHPRingDir_2d ( SHPObject *psCShape, int Ring ) { + int i, ti, last_vtx; + double tX; + double *a, *b; + double dx0, dx1, dy0, dy1, v1, v2 ,v3; + + tX = 0.0; + a = psCShape->padfX; + b = psCShape->padfY; + + if ( Ring >= psCShape->nParts ) return ( 0 ); + + if ( Ring >= psCShape->nParts -1 ) + { last_vtx = psCShape->nVertices; } + else + { last_vtx = psCShape->panPartStart[Ring + 1]; } + + /* All vertices at the corners of the extrema (rightmost lowest, leftmost lowest, */ + /* topmost rightest, ...) must be less than pi wide. If they werent they couldnt be */ + /* extrema. */ + /* of course the following will fail if the Extents are even a little wrong */ + + for ( i = psCShape->panPartStart[Ring]; i < last_vtx; i++ ) { + if ( b[i] == psCShape->dfYMax && a[i] > tX ) + { ti = i; } + } + +#ifdef DEBUG2 + printf ("(shpgeo:SHPRingDir) highest Rightmost Pt is vtx %d (%f, %f)\n", ti, a[ti], b[ti]); +#endif + + /* cross product */ + /* the sign of the cross product of two vectors indicates the right or left half-plane */ + /* which we can use to indicate Ring Dir */ + if ( ti > psCShape->panPartStart[Ring] & ti < last_vtx ) + { dx0 = a[ti-1] - a[ti]; + dx1 = a[ti+1] - a[ti]; + dy0 = b[ti-1] - b[ti]; + dy1 = b[ti+1] - b[ti]; + } + else + /* if the tested vertex is at the origin then continue from 0 */ + { dx1 = a[1] - a[0]; + dx0 = a[last_vtx] - a[0]; + dy1 = b[1] - b[0]; + dy0 = b[last_vtx] - b[0]; + } + +// v1 = ( (dy0 * 0) - (0 * dy1) ); +// v2 = ( (0 * dx1) - (dx0 * 0) ); +/* these above are always zero so why do the math */ + v3 = ( (dx0 * dy1) - (dx1 * dy0) ); + +#ifdef DEBUG2 + printf ("(shpgeo:SHPRingDir) cross product for vtx %d was %f \n", ti, v3); +#endif + + if ( v3 > 0 ) + { return (1); } + else + { return (-1); } +} + + + +/* ************************************************************************** + * SHPArea_2d + * + * Calculate the XY Area of Polygon ( can be compound / complex ) + * + * **************************************************************************/ +double SHPArea_2d ( SHPObject *psCShape ) { + double cArea; + int ring, ring_vtx, ringDir, ring_nVertices; + + cArea = 0; + if ( !(SHPDimension (psCShape->nSHPType) & SHPD_AREA) ) + return ( -1 ); + + + /* Walk each ring adding its signed Area, R- will return a negative */ + /* area, so we don't have to test for them */ + + /* I just start at the last ring and work down to the first */ + ring_vtx = psCShape->nVertices ; + for ( ring = (psCShape->nParts - 1); ring >= 0; ring-- ) { + ring_nVertices = ring_vtx - psCShape->panPartStart[ring]; + +#ifdef DEBUG2 + printf("(shpgeo:SHPArea_2d) part %d, vtx %d \n", ring, ring_nVertices); +#endif + cArea += RingArea_2d ( ring_nVertices, + (double*) &(psCShape->padfX [psCShape->panPartStart[ring]]), + (double*) &(psCShape->padfY [psCShape->panPartStart[ring]]) ); + + ring_vtx = psCShape->panPartStart[ring]; + } + +#ifdef DEBUG2 + printf ("(shpgeo:SHPArea_2d) Area = %f \n", cArea); +#endif + + /* Area is signed, negative Areas are R- */ + return ( cArea ); + +} + + +/* ************************************************************************** + * SHPLength_2d + * + * Calculate the Planar ( XY ) Length of Polygon ( can be compound / complex ) + * or Polyline ( can be compound ). Length on Polygon is its Perimeter + * + * **************************************************************************/ +double SHPLength_2d ( SHPObject *psCShape ) { + double Length; + int i, j; + double dx, dy; + + if ( !(SHPDimension (psCShape->nSHPType) & (SHPD_AREA || SHPD_LINE)) ) + return ( (double) -1 ); + + Length = 0; + j = 1; + for ( i = 1; i < psCShape->nVertices; i++ ) { + if ( psCShape->panPartStart[j] == i ) + { j ++; } + /* skip the moves with "pen up" from ring to ring */ + else + { + dx = psCShape->padfX[i] - psCShape->padfX[i-1]; + dy = psCShape->padfY[i] - psCShape->padfY[i-1]; + Length += sqrt ( ( dx * dx ) + ( dy * dy ) ); + } + /* simplify this equation */ + } + + return ( Length ); +} + + +/* ************************************************************************** + * RingLength_2d + * + * Calculate the Planar ( XY ) Length of Polygon ( can be compound / complex ) + * or Polyline ( can be compound ). Length of Polygon is its Perimeter + * + * **************************************************************************/ +double RingLength_2d ( int nVertices, double *a, double *b ) { + double Length; + int i, j; + double dx, dy; + + Length = 0; + j = 1; + for ( i = 1; i < nVertices; i++ ) { + dx = a[i] - b[i-1]; + dy = b[i] - b[i-1]; + Length += sqrt ( ( dx * dx ) + ( dy * dy ) ); + /* simplify this equation */ + } + + return ( Length ); +} + + +/* ************************************************************************** + * RingArea_2d + * + * Calculate the Planar Area of a single closed ring + * + * **************************************************************************/ +double RingArea_2d ( int nVertices, double *a, double *b ) { + int iv,jv; + double ppx, ppy; + static double Area; + double dx_Area; + double x_base, y_base, x, y; + + x_base = a[0]; + y_base = b[0]; + + ppx = a[1] - x_base; + ppy = b[1] - y_base; + Area = 0.0; +#ifdef DEBUG2 + printf("(shpgeo:RingArea) %d vertices \n", nVertices); +#endif + for ( iv = 2; iv <= ( nVertices - 1 ); iv++ ) { + x = a[iv] - x_base; + y = b[iv] - y_base; + + /* Area of a triangle is the cross product of its defining vectors */ + + dx_Area = ((x * ppy) - (y * ppx)) * 0.5; + + Area += dx_Area; +#ifdef DEBUG2 + printf ("(shpgeo:RingArea) dxArea %f sArea %f for pt(%f, %f)\n", + dx_Area, Area, x, y); +#endif + + ppx = x; + ppy = y; + } + +#ifdef DEBUG2 + printf ("(shpgeo:RingArea) total RingArea %f \n", Area); +#endif + return ( Area ); + +} + + + +/* ************************************************************************** + * SHPUnCompound + * + * ESRI calls this function explode + * Return a non compound ( possibly complex ) object + * + * ring_number is R+ number corresponding to object + * + * + * ignore complexity in Z dimension for now + * + * **************************************************************************/ +SHPObject* SHPUnCompound ( SHPObject *psCShape, int * ringNumber ) { + int ringDir, ring, lRing; + + if ( (*ringNumber >= psCShape->nParts) || *ringNumber == -1 ) { + *ringNumber = -1; + return (NULL); + } + + + if ( *ringNumber == (psCShape->nParts - 1) ) { + *ringNumber = -1; + return ( SHPClone(psCShape, (psCShape->nParts - 1), -1) ); + } + + lRing = *ringNumber; + ringDir = -1; + for ( ring = (lRing + 1); (ring < psCShape->nParts) && ( ringDir < 0 ); ring ++) + ringDir = SHPRingDir_2d ( psCShape, ring); + + if ( ring == psCShape->nParts ) + *ringNumber = -1; + else + *ringNumber = ring; +/* I am strictly assuming that all R- parts of a complex object + * directly follow their R+, so when we hit a new R+ its a + * new part of a compound object + * a SHPClean may be needed to enforce this as it is not part + * of ESRI's definition of a SHPfile + */ + +#ifdef DEBUG2 + printf ("(SHPUnCompound) asked for ring %d, lastring is %d \n", lRing, ring); +#endif + return ( SHPClone(psCShape, lRing, ring ) ); + +} + + +/* ************************************************************************** + * SHPIntersect_2d + * + * + * prototype only for now + * + * return object with lowest common dimensionality of objects + * + * **************************************************************************/ +SHPObject* SHPIntersect_2d ( SHPObject* a, SHPObject* b ) { + SHPObject *C; + + if ( (SHPDimension(a->nSHPType) && SHPD_POINT) || ( SHPDimension(b->nSHPType) && SHPD_POINT ) ) + return ( NULL ); + /* there is no intersect function like this for points */ + + C = SHPClone ( a, 0 , -1 ); + + return ( C); + +} + + + +/* ************************************************************************** + * SHPClean + * + * Test and fix normalization problems in shapes + * Different tests need to be implemented for different SHPTypes + * SHPT_POLYGON check ring directions CW / CCW ( R+ / R- ) + * put all R- after the R+ they are members of + * i.e. each complex object is completed before the + * next object is started + * check for closed rings + * ring must not intersect itself, even on edge + * + * no other types implemented yet + * + * not sure why but return object in place + * use for object casting and object verification + * **************************************************************************/ +int SHPClean ( SHPObject *psCShape ) { + + + return (0); +} + + +/* ************************************************************************** + * SHPClone + * + * Clone a SHPObject, replicating all data + * + * **************************************************************************/ +SHPObject* SHPClone ( SHPObject *psCShape, int lowPart, int highPart ) { + SHPObject *psObject; + int newParts, newVertices; +#ifdef DEBUG + int i; +#endif + + if ( highPart >= psCShape->nParts || highPart == -1 ) + highPart = psCShape->nParts ; + +#ifdef DEBUG + printf (" cloning SHP (%d parts) from ring %d to ring %d \n", + psCShape->nParts, lowPart, highPart); +#endif + + newParts = highPart - lowPart; + if ( newParts == 0 ) { return ( NULL ); } + + psObject = (SHPObject *) calloc(1,sizeof(SHPObject)); + psObject->nSHPType = psCShape->nSHPType; + psObject->nShapeId = psCShape->nShapeId; + + psObject->nParts = newParts; + if ( psCShape->padfX ) { + psObject->panPartStart = (int*) calloc (newParts, sizeof (int)); + memcpy ( psObject->panPartStart, psCShape->panPartStart, + newParts * sizeof (int) ); + } + if ( psCShape->padfX ) { + psObject->panPartType = (int*) calloc (newParts, sizeof (int)); + memcpy ( psObject->panPartType, + (int *) &(psCShape->panPartType[lowPart]), + newParts * sizeof (int) ); + } + + if ( highPart != psCShape->nParts ) { + newVertices = psCShape->panPartStart[highPart] - + psCShape->panPartStart[lowPart]; + } + else + { newVertices = psCShape->nVertices - psCShape->panPartStart[lowPart]; } + + +#ifdef DEBUG + if ( highPart = psCShape->nParts ) + i = psCShape->nVertices; + else + i = psCShape->panPartStart[highPart]; + printf (" from part %d (%d) to %d (%d) is %d vertices \n", + lowPart, psCShape->panPartStart[lowPart], highPart, + i, newVertices); +#endif + psObject->nVertices = newVertices; + if ( psCShape->padfX ) { + psObject->padfX = (double*) calloc (newVertices, sizeof (double)); + memcpy ( psObject->padfX, + (double *) &(psCShape->padfX[psCShape->panPartStart[lowPart]]), + newVertices * sizeof (double) ); + } + if ( psCShape->padfY ) { + psObject->padfY = (double*) calloc (newVertices, sizeof (double)); + memcpy ( psObject->padfY, + (double *) &(psCShape->padfY[psCShape->panPartStart[lowPart]]), + newVertices * sizeof (double) ); + } + if ( psCShape->padfZ ) { + psObject->padfZ = (double*) calloc (newVertices, sizeof (double)); + memcpy ( psObject->padfZ, + (double *) &(psCShape->padfZ[psCShape->panPartStart[lowPart]]), + newVertices * sizeof (double) ); + } + if ( psCShape->padfM ) { + psObject->padfM = (double*) calloc (newVertices, sizeof (double)); + memcpy ( psObject->padfM, + (double *) &(psCShape->padfM[psCShape->panPartStart[lowPart]]), + newVertices * sizeof (double) ); + } + + psObject->dfXMin = psCShape->dfXMin; + psObject->dfYMin = psCShape->dfYMin; + psObject->dfZMin = psCShape->dfZMin; + psObject->dfMMin = psCShape->dfMMin; + + psObject->dfXMax = psCShape->dfXMax; + psObject->dfYMax = psCShape->dfYMax; + psObject->dfZMax = psCShape->dfZMax; + psObject->dfMMax = psCShape->dfMMax; + + SHPComputeExtents ( psObject ); + return ( psObject ); +} + + + +/************************************************************************/ +/* SwapG */ +/* */ +/* Swap a 2, 4 or 8 byte word. */ +/************************************************************************/ +void SwapG( void *so, void *in, int this_cnt, int this_size ) { + int i, j; + unsigned char temp; + +/* return to a new pointer otherwise it would invalidate existing data */ +/* as prevent further use of it */ + + for( j=0; j < this_cnt; j++ ) + { + for( i=0; i < this_size/2; i++ ) + { + ((unsigned char *) so)[i] = ((unsigned char *) in)[this_size-i-1]; + ((unsigned char *) so)[this_size-i-1] = ((unsigned char *) in)[i]; + } + } +} + + +/* ************************************************************************** + * SwapW + * + * change byte order on an array of 16 bit words + * need to change this over to shapelib, Frank Warmerdam's functions + * + * **************************************************************************/ +void swapW (void *so, unsigned char *in, long bytes) { + int i, j; + unsigned char map[4] = {3,2,1,0}; + unsigned char *out; + + out = so; + for (i=0; i <= (bytes/4); i++) + for (j=0; j < 4; j++) + out[(i*4)+map[j]] = in[(i*4)+j]; +} + + +/* ************************************************************************** + * SwapD + * + * change byte order on an array of (double) 32 bit words + * need to change this over to shapelib, Frank Warmerdam's functons + * + * **************************************************************************/ +void swapD (void *so, unsigned char *in, long bytes) { + int i, j; + unsigned char map[8] = {7,6,5,4,3,2,1,0}; + unsigned char *out; + + out = so; + for (i=0; i <= (bytes/8); i++) + for (j=0; j < 8; j++) + out[(i*8)+map[j]] = in[(i*8)+j]; +} + diff --git a/libs/shapelib/contrib/shpgeo.h b/libs/shapelib/contrib/shpgeo.h new file mode 100644 index 0000000..930df6e --- /dev/null +++ b/libs/shapelib/contrib/shpgeo.h @@ -0,0 +1,162 @@ +/****************************************************************************** + * Copyright (c) 1999, Carl Anderson + * + * This code is based in part on the earlier work of Frank Warmerdam + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * shpgeo.h + * + * support for geometric and other additions to shapelib + * + * + * $Log: shpgeo.h,v $ + * Revision 1.4 2016-12-05 12:44:07 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.3 2002-01-15 14:36:56 warmerda + * upgrade to use proj_api.h + * + * Revision 1.2 1999/05/26 02:56:31 candrsn + * updates to shpdxf, dbfinfo, port from Shapelib 1.1.5 of dbfcat and shpinfo + * + * + */ + + + + /* I'm using some shorthand throughout this file + * R+ is a Clockwise Ring and is the positive portion of an object + * R- is a CounterClockwise Ring and is a hole in a R+ + * A complex object is one having at least one R- + * A compound object is one having more than one R+ + * A simple object has one and only one element (R+ or R-) + * + * The closed ring constraint is for polygons and assumed here + * Arcs or LineStrings I am calling Rings (generically open or closed) + * Point types are vertices or lists of vertices but not Rings + * + * SHPT_POLYGON, SHPT_POLYGONZ, SHPT_POLYGONM and SHPT_MULTIPATCH + * can have SHPObjects that are compound as well as complex + * + * SHP_POINT and its Z and M derivatives are strictly simple + * MULTI_POINT, SHPT_ARC and their derivatives may be simple or compound + * + */ + + +#ifndef SHPGEO_H + +#define SHPGEO_H + + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef PROJ4 +#include "proj_api.h" +#else +typedef void* projPJ; +#endif + +#define SHPD_POINT 1 +#define SHPD_LINE 2 +#define SHPD_AREA 4 +#define SHPD_Z 8 +#define SHPD_MEASURE 16 + + +/* move these into a ogis header file ogis.h */ +#define OGIST_UNKNOWN 0 +#define OGIST_POINT 1 +#define OGIST_LINESTRING 2 +#define OGIST_POLYGON 3 +#define OGIST_MULTIPOINT 4 +#define OGIST_MULTILINE 5 +#define OGIST_MULTIPOLYGON 6 +#define OGIST_GEOMCOLL 7 + +typedef struct { int StreamPos; + int NeedSwap; + char *wStream; + } WKBStreamObj; + +typedef struct { double x; double y; } PT; + + +typedef struct { int cParts; + SHPObject *SHPObj; + } SHPObjectList; + + +#define LSB_ORDER (int) 1 + + +extern char * asFileName ( const char *fil, char *ext ); +extern int SHPProject ( SHPObject *psCShape, + projPJ inproj, projPJ outproj ); +extern projPJ SHPSetProjection ( int param_cnt, char **params ); +extern int SHPFreeProjection ( projPJ p); + +extern int SHPDimension ( int SHPType ); + +extern double SHPArea_2d ( SHPObject *psCShape ); +extern int SHPRingDir_2d ( SHPObject *psCShape, int Ring ); +extern double SHPLength_2d ( SHPObject *psCShape ); +extern PT SHPCentrd_2d ( SHPObject *psCShape ); +extern PT SHPPointinPoly_2d ( SHPObject *psCShape ); +extern PT* SHPPointsinPoly_2d ( SHPObject *psCShape ); + +extern int RingCentroid_2d ( int nVertices, double *a, double *b, PT *C, + double *Area ); +extern double RingLength_2d ( int nVertices, double *a, double *b ); +extern int RingDir_2d ( int nVertices, double *a, double *b ); +extern double RingArea_2d ( int nVertices, double *a, double *b ); + +extern SHPObject* SHPClone ( SHPObject *psCShape, int lowPart, int highPart ); +extern SHPObject* SHPUnCompound ( SHPObject *psCShape, int * ringNumber ); +extern SHPObject* SHPIntersect_2d ( SHPObject* a, SHPObject* b ); + +extern int SHPWriteOGisWKB ( WKBStreamObj *stream_obj, SHPObject *psCShape ); +extern SHPObject* SHPReadOGisWKB ( WKBStreamObj *stream_obj ); + +int SHPWriteOGisPolygon ( WKBStreamObj *stream_obj, SHPObject *psCShape ); +int SHPWriteOGisLine ( WKBStreamObj *stream_obj, SHPObject *psCShape ); +int SHPWriteOGisPoint ( WKBStreamObj *stream_obj, SHPObject *psCShape ); + +SHPObject* SHPReadOGisPolygon ( WKBStreamObj *stream_obj ); +SHPObject* SHPReadOGisLine ( WKBStreamObj *stream_obj ); +SHPObject* SHPReadOGisPoint ( WKBStreamObj *stream_obj ); + +extern int SHPClean ( SHPObject *psCShape ); +extern int SHPOGisType ( int GeomType, int toOGis); + +void swapD (void *so, unsigned char *in, long bytes); +void swapW (void *so, unsigned char *in, long bytes); +void SwapG( void *so, void *in, int this_cnt, int this_size ); + + +#ifdef __cplusplus +} +#endif + +#endif /* ndef SHPGEO_H */ diff --git a/libs/shapelib/contrib/shpinfo.c b/libs/shapelib/contrib/shpinfo.c new file mode 100644 index 0000000..9fb4099 --- /dev/null +++ b/libs/shapelib/contrib/shpinfo.c @@ -0,0 +1,118 @@ +/****************************************************************************** + * Copyright (c) 1999, Carl Anderson + * + * This code is based in part on the earlier work of Frank Warmerdam + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * requires shapelib 1.2 + * gcc shpinfoj shpopen.o -o shpinfo + * + * + * $Log: shpinfo.c,v $ + * Revision 1.5 2016-12-05 12:44:07 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.4 2011-07-24 03:17:46 fwarmerdam + * include string.h and stdlib.h where needed in contrib (#2146) + * + * Revision 1.3 2002-04-15 21:33:03 warmerda + * Avoid dereference arrays. + * + * Revision 1.2 2002/04/15 18:40:31 warmerda + * Fixed size of adfBnds{Min,Max} as per bug from David Fowler. + * + * Revision 1.1 1999/05/26 02:56:31 candrsn + * updates to shpdxf, dbfinfo, port from Shapelib 1.1.5 of dbfcat and shpinfo + * + * + */ + +#include +#include +#include "shapefil.h" + +int main( int argc, char ** argv ) + +{ + SHPHandle hSHP, cSHP; + int nShapeType, nEntities, nVertices, nParts, *panParts, i, iPart; + double *padVertices, adfBndsMin[4], adfBndsMax[4]; + const char *pszPlus; + int cShapeType, cEntities, cVertices, cParts, *cpanParts, ci, cPart; + double *cpadVertices, cadBounds[4]; + const char *cpszPlus; + char sType [15]= ""; +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( argc != 2 ) + { + printf( "shpinfo shp_file\n" ); + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Open the passed shapefile. */ +/* -------------------------------------------------------------------- */ + hSHP = SHPOpen( argv[1], "rb" ); + + if( hSHP == NULL ) + { + printf( "Unable to open:%s\n", argv[1] ); + exit( 1 ); + } + + SHPGetInfo( hSHP, &nEntities, &nShapeType, adfBndsMin, adfBndsMax ); + + switch ( nShapeType ) { + case SHPT_POINT: + strcpy(sType,"Point"); + break; + + case SHPT_ARC: + strcpy(sType,"Polyline"); + break; + + case SHPT_POLYGON: + strcpy(sType,"Polygon"); + break; + + case SHPT_MULTIPOINT: + strcpy(sType,"MultiPoint"); + break; + } + +/* -------------------------------------------------------------------- */ + printf ("Info for %s\n",argv[1]); + printf ("%s(%d), %d Records in file\n",sType,nShapeType,nEntities); + +/* -------------------------------------------------------------------- */ +/* Print out the file bounds. */ +/* -------------------------------------------------------------------- */ + printf( "File Bounds: (%15.10lg,%15.10lg)\n\t(%15.10lg,%15.10lg)\n", + adfBndsMin[0], adfBndsMin[1], adfBndsMax[0], adfBndsMax[1] ); + + + + SHPClose( hSHP ); +} diff --git a/libs/shapelib/contrib/shpproj.c b/libs/shapelib/contrib/shpproj.c new file mode 100644 index 0000000..231c7f7 --- /dev/null +++ b/libs/shapelib/contrib/shpproj.c @@ -0,0 +1,260 @@ +/****************************************************************************** + * Copyright (c) 1999, Carl Anderson + * + * This code is based in part on the earlier work of Frank Warmerdam + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * requires shapelib 1.2 + * gcc shpproj ../shpopen.o ../dbfopen.o shpgeo.o -lm -lproj -o shpproj + * + * this requires linking with the PROJ4.3 projection library available from + * + * ftp://kai.er.usgs.gov/ftp/PROJ.4 + * + * + * SHPGeo must be compiled with -DPROJ4 support + * + * $Log: shpproj.c,v $ + * Revision 1.10 2011-07-24 03:17:46 fwarmerdam + * include string.h and stdlib.h where needed in contrib (#2146) + * + * Revision 1.9 2002-01-15 14:37:08 warmerda + * upgrade to use proj_api.h + * + * Revision 1.8 2002/01/11 15:47:26 warmerda + * several fixes + * + * Revision 1.7 2002/01/11 15:23:28 warmerda + * use text mode reading and writing .prj files + * + * Revision 1.6 1999/05/26 02:56:31 candrsn + * updates to shpdxf, dbfinfo, port from Shapelib 1.1.5 of dbfcat and shpinfo + * + * Revision 1.2 1999/05/13 19:30:52 warmerda + * Removed libgen.h, added url for PROJ.4, and corrected unsafe return of + * local variable in asFileName(). + * + */ + + +#include +#include +#include +#include "shapefil.h" +#include "shpgeo.h" + +int main( int argc, char ** argv ) +{ + SHPHandle old_SHP, new_SHP; + DBFHandle old_DBF, new_DBF; + int nShapeType, nEntities, nVertices, nParts, *panParts, i, iPart, j; + double *padVertices, adBounds[4]; + const char *pszPlus; + DBFFieldType idfld_type; + SHPObject *psCShape; + FILE *ifp = NULL; + int idfld, nflds; + char kv[257] = ""; + char idfldName[120] = ""; + char fldName[120] = ""; + char shpFileName[120] = ""; + char dbfFileName[120] = ""; + char prjFileName[120] = ""; + char parg[80]; + double apeture[4]; + int inarg, outarg; + char *DBFRow = NULL; + +/* for testing only + char *in_args[] = { "init=nad83:1002", "units=us-ft" }; + char *out_args[] = { "proj=utm", "zone=16", "units=m" }; +*/ + + char *in_args[16]; + char *out_args[16]; + int in_argc = 0 , out_argc = 0, outf_arg; + char *arglst; + projPJ orig_prj, new_prj; + va_list myargs, moargs; + + if( argc < 4) + { + printf( "shpproj shp_file new_shp ( -i=in_proj_file | -i=\"in_params\" | -i=geographic ) ( -o=out_info_file | -o=\"out_params\" | -o=geographic ) \n" ); + exit( 1 ); + } + + old_SHP = SHPOpen( argv[1], "rb" ); + old_DBF = DBFOpen( argv[1], "rb" ); + if( old_SHP == NULL || old_DBF == NULL ) + { + printf( "Unable to open old files:%s\n", argv[1] ); + exit( 1 ); + } + + outf_arg = 2; + inarg = 0; + outarg = 0; + for ( i = 3; i < argc; i++ ) { + if ( !strncmp ("-i=", argv[i], 3 )) inarg = i; + if ( !strncmp ("-o=", argv[i], 3 )) outarg = i; + } + + +/* if shapefile has a prj component then use that + else try for a file then read args as list */ + + if( inarg == 0 ) + { + strcpy( prjFileName, argv[1] ); + ifp = fopen( asFileName ( prjFileName, "prj" ),"rt"); + } + else + { + ifp = fopen( asFileName ( argv[inarg] + 3, "prj" ),"rt"); + } + + i = 0; + if ( ifp ) { + if( inarg == 0 ) + printf ("using default file proj params from <- %s\n", + asFileName ( prjFileName, "prj" ) ); + else + printf ("using file proj params from <- %s\n", + asFileName ( argv[inarg] + 3, "prj" ) ); + + while( fscanf( ifp, "%s", parg) != EOF ) { + in_args[i] = malloc ( strlen(parg)+1 ); + strcpy ( in_args[i], parg); + i++; + } + + in_argc = i; + fclose (ifp); + } + else { + if ( inarg > 0 ) { + arglst = argv[inarg] + 3; + j = 0; + i = 0; + while ( j < strlen (arglst) ) { + in_argc += sscanf ( arglst + j, "%s", parg); + + in_args[i] = malloc( strlen (parg)+1); + strcpy (in_args[i], parg); + i++; + j += strlen (parg) +1; + if ( arglst[j] + 1 == 0 ) j = strlen (argv[inarg]); + } + } + } + + i = 0; + if ( outarg > 0 ) ifp = fopen( asFileName ( argv[outarg] + 3, "prj" ),"rt"); + if ( ifp ) { + while( fscanf( ifp, "%s", parg) != EOF ) { + out_args[i] = malloc ( strlen(parg)); + strcpy ( out_args[i], parg); + i++; + } + out_argc = i; + fclose (ifp); + } + else { + if ( outarg > 0 ) { + arglst = argv[outarg] + 3; + j = 0; + i = 0; + while ( j < strlen (arglst) ) { + out_argc += sscanf ( arglst + j, "%s", parg); + + out_args[i] = malloc( strlen (parg)+1); + strcpy (out_args[i], parg); + i++; + j += strlen (parg) +1; + if ( arglst[j] + 1 == 0 ) j = strlen (argv[outarg]); + } + } + } + + if ( !strcmp( argv[inarg], "-i=geographic" )) in_argc = 0; + if ( !strcmp( argv[outarg], "-o=geographic" )) out_argc = 0; + + orig_prj = SHPSetProjection ( in_argc, in_args ); + new_prj = SHPSetProjection ( out_argc, out_args ); + + if ( !(( (!in_argc) || orig_prj) && ( (!out_argc) || new_prj) )) { + fprintf (stderr, "unable to process projection, exiting...\n"); + exit(1); + } + + + SHPGetInfo( old_SHP, &nEntities, &nShapeType, NULL, NULL); + new_SHP = SHPCreate ( argv[outf_arg], nShapeType ); + + new_DBF = DBFCloneEmpty (old_DBF, argv[outf_arg]); + if( new_SHP == NULL || new_DBF == NULL ) + { + printf( "Unable to create new files:%s\n", argv[outf_arg] ); + exit( 1 ); + } + + DBFRow = (char *) malloc ( (old_DBF->nRecordLength) + 15 ); + + for( i = 0; i < nEntities; i++ ) + { + int j; + + psCShape = SHPReadObject ( old_SHP, i ); + + SHPProject (psCShape, orig_prj, new_prj ); + + SHPWriteObject ( new_SHP, -1, psCShape ); + SHPDestroyObject ( psCShape ); + + memcpy ( DBFRow, DBFReadTuple ( old_DBF, i ), old_DBF->nRecordLength ); + DBFWriteTuple ( new_DBF, new_DBF->nRecords, DBFRow ); + + } + + SHPFreeProjection ( orig_prj ); + SHPFreeProjection ( new_prj ); + + /* store projection params into prj file */ + ifp = fopen( asFileName ( argv[outf_arg], "prj" ),"wt"); + if ( ifp ) { + + if ( out_argc == 0 ) + { fprintf( ifp, "proj=geographic\n" ); } + else + { for ( i = 0; i < out_argc; i++ ) + fprintf( ifp, "%s\n", out_args[i]); + } + fclose (ifp); + } + + SHPClose( old_SHP ); + SHPClose( new_SHP ); + DBFClose( old_DBF ); + DBFClose( new_DBF ); + printf ("\n"); +} + + diff --git a/libs/shapelib/contrib/shpsort.c b/libs/shapelib/contrib/shpsort.c new file mode 100644 index 0000000..ae0bf6f --- /dev/null +++ b/libs/shapelib/contrib/shpsort.c @@ -0,0 +1,605 @@ +/****************************************************************************** + * Copyright (c) 2004, Eric G. Miller + * + * This code is based in part on the earlier work of Frank Warmerdam + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * shpsort + * + * Rewrite a shapefile sorted by a field or by the geometry. For polygons, + * sort by area, for lines sort by length and do nothing for all others. + * + * $Log: shpsort.c,v $ + * Revision 1.3 2004-07-06 21:23:17 fwarmerdam + * minor const warning fix + * + * Revision 1.2 2004/07/06 21:20:49 fwarmerdam + * major upgrade .. sort on multiple fields + * + * Revision 1.4 2004/06/30 18:19:53 emiller + * handle POINTZ, POINTM + * + * Revision 1.3 2004/06/30 17:40:32 emiller + * major rewrite allows sorting on multiple fields. + * + * Revision 1.2 2004/06/23 23:19:58 emiller + * use tuple copy, misc changes + * + * Revision 1.1 2004/06/23 21:38:17 emiller + * Initial revision + * + * + */ + +#include +#include +#include +#include +#include +#include "shapefil.h" + +enum FieldOrderEnum {DESCENDING, ASCENDING}; +enum FieldTypeEnum { + FIDType = -2, + SHPType = -1, + StringType = FTString, + LogicalType = FTLogical, + IntegerType = FTInteger, + DoubleType = FTDouble +}; + +struct DataUnion { + int null; + union { + int i; + double d; + char *s; + } u; +}; + +struct DataStruct { + int record; + struct DataUnion *value; +}; + +/* + globals used in sorting, each element could have a pointer to + a single data struct, but that's still nShapes pointers more + memory. Alternatively, write a custom sort rather than using + library qsort. +*/ +int nFields; +int *fldIdx; +int *fldOrder; +int *fldType; +int shpType; +int nShapes; + +static struct DataStruct * build_index (SHPHandle shp, DBFHandle dbf); +static char * dupstr (const char *); +static void copy_related (const char *inName, const char *outName, + const char *old_ext, const char *new_ext); +static char ** split(const char *arg, const char *delim); +static int compare(const void *, const void *); +static double area2d_polygon (int n, double *x, double *y); +static double shp_area (SHPObject *feat); +static double length2d_polyline (int n, double *x, double *y); +static double shp_length (SHPObject *feat); + +int main (int argc, char *argv[]) { + + SHPHandle inSHP, outSHP; + DBFHandle inDBF, outDBF; + int len; + int i; + char **fieldNames; + char **strOrder = 0; + struct DataStruct *index; + int width; + int decimals; + SHPObject *feat; + void *tuple; + + if (argc < 4) { + printf("USAGE: shpsort [<(ASCENDING|DESCENDING)[;...]>]\n"); + exit(EXIT_FAILURE); + } + + inSHP = SHPOpen (argv[1], "rb"); + if (!inSHP) { + fputs("Couldn't open shapefile for reading!\n", stderr); + exit(EXIT_FAILURE); + } + SHPGetInfo(inSHP, &nShapes, &shpType, NULL, NULL); + + /* If we can open the inSHP, open its DBF */ + inDBF = DBFOpen (argv[1], "rb"); + if (!inDBF) { + fputs("Couldn't open dbf file for reading!\n", stderr); + exit(EXIT_FAILURE); + } + + /* Parse fields and validate existence */ + fieldNames = split(argv[3], ";"); + if (!fieldNames) { + fputs("ERROR: parsing field names!\n", stderr); + exit(EXIT_FAILURE); + } + for (nFields = 0; fieldNames[nFields] ; nFields++) { + continue; + } + + fldIdx = malloc(sizeof *fldIdx * nFields); + if (!fldIdx) { + fputs("malloc failed!\n", stderr); + exit(EXIT_FAILURE); + } + for (i = 0; i < nFields; i++) { + len = (int)strlen(fieldNames[i]); + while(len > 0) { + --len; + fieldNames[i][len] = (char)toupper((unsigned char)fieldNames[i][len]); + } + fldIdx[i] = DBFGetFieldIndex(inDBF, fieldNames[i]); + if (fldIdx[i] < 0) { + /* try "SHAPE" */ + if (strcmp(fieldNames[i], "SHAPE") == 0) { + fldIdx[i] = -1; + } + else if (strcmp(fieldNames[i], "FID") == 0) { + fldIdx[i] = -2; + } + else { + fprintf(stderr, "ERROR: field '%s' not found!\n", fieldNames[i]); + exit(EXIT_FAILURE); + } + } + } + + + /* set up field type array */ + fldType = malloc(sizeof *fldType * nFields); + if (!fldType) { + fputs("malloc failed!\n", stderr); + exit(EXIT_FAILURE); + } + for (i = 0; i < nFields; i++) { + if (fldIdx[i] < 0) { + fldType[i] = fldIdx[i]; + } + else { + fldType[i] = DBFGetFieldInfo(inDBF, fldIdx[i], NULL, &width, &decimals); + if (fldType[i] == FTInvalid) { + fputs("Unrecognized field type in dBASE file!\n", stderr); + exit(EXIT_FAILURE); + } + } + } + + + /* set up field order array */ + fldOrder = malloc(sizeof *fldOrder * nFields); + if (!fldOrder) { + fputs("malloc failed!\n", stderr); + exit(EXIT_FAILURE); + } + for (i = 0; i < nFields; i++) { + /* default to ascending order */ + fldOrder[i] = ASCENDING; + } + if (argc > 4) { + strOrder = split(argv[4], ";"); + if (!strOrder) { + fputs("ERROR: parsing fields ordering!\n", stderr); + exit(EXIT_FAILURE); + } + for (i = 0; i < nFields && strOrder[i]; i++) { + if (strcmp(strOrder[i], "DESCENDING") == 0) { + fldOrder[i] = DESCENDING; + } + } + } + + /* build the index */ + index = build_index (inSHP, inDBF); + + /* Create output shapefile */ + outSHP = SHPCreate(argv[2], shpType); + if (!outSHP) { + fprintf(stderr, "%s:%d: couldn't create output shapefile!\n", + __FILE__, __LINE__); + exit(EXIT_FAILURE); + } + + /* Create output dbf */ + outDBF = DBFCloneEmpty(inDBF, argv[2]); + if (!outDBF) { + fprintf(stderr, "%s:%d: couldn't create output dBASE file!\n", + __FILE__, __LINE__); + exit(EXIT_FAILURE); + } + + /* Copy projection file, if any */ + copy_related(argv[1], argv[2], ".shp", ".prj"); + + /* Copy metadata file, if any */ + copy_related(argv[1], argv[2], ".shp", ".shp.xml"); + + /* Write out sorted results */ + for (i = 0; i < nShapes; i++) { + feat = SHPReadObject(inSHP, index[i].record); + if (SHPWriteObject(outSHP, -1, feat) < 0) { + fprintf(stderr, "%s:%d: error writing shapefile!\n", __FILE__, __LINE__); + exit(EXIT_FAILURE); + } + tuple = (void *) DBFReadTuple(inDBF, index[i].record); + if (DBFWriteTuple(outDBF, i, tuple) < 0) { + fprintf(stderr, "%s:%d: error writing dBASE file!\n", __FILE__, __LINE__); + exit(EXIT_FAILURE); + } + } + SHPClose(inSHP); + SHPClose(outSHP); + DBFClose(inDBF); + DBFClose(outDBF); + + return EXIT_SUCCESS; + +} + +static char ** split(const char *arg, const char *delim) +{ + char *copy = dupstr(arg); + char *cptr = copy; + char **result = NULL; + char **tmp; + int i = 0; + + for (cptr = strtok(copy, delim); cptr; cptr = strtok(NULL, delim)) { + tmp = realloc (result, sizeof *result * (i + 1)); + if (!tmp && result) { + while (i > 0) { + free(result[--i]); + } + free(result); + free(copy); + return NULL; + } + result = tmp; + result[i++] = dupstr(cptr); + } + + free(copy); + + if (i) { + tmp = realloc(result, sizeof *result * (i + 1)); + if (!tmp) { + while (i > 0) { + free(result[--i]); + } + free(result); + free(copy); + return NULL; + } + result = tmp; + result[i++] = NULL; + } + + return result; +} + + +static void copy_related (const char *inName, const char *outName, + const char *old_ext, const char *new_ext) +{ + char *in; + char *out; + FILE *inFile; + FILE *outFile; + int c; + size_t name_len = strlen(inName); + size_t old_len = strlen(old_ext); + size_t new_len = strlen(new_ext); + + in = malloc(name_len - old_len + new_len + 1); + strncpy(in, inName, (name_len - old_len)); + strcpy(&in[(name_len - old_len)], new_ext); + inFile = fopen(in, "rb"); + if (!inFile) { + free(in); + return; + } + name_len = strlen(outName); + out = malloc(name_len - old_len + new_len + 1); + strncpy(out, outName, (name_len - old_len)); + strcpy(&out[(name_len - old_len)], new_ext); + outFile = fopen(out, "wb"); + if (!out) { + fprintf(stderr, "%s:%d: couldn't copy related file!\n", + __FILE__, __LINE__); + free(in); + free(out); + return; + } + while ((c = fgetc(inFile)) != EOF) { + fputc(c, outFile); + } + fclose(inFile); + fclose(outFile); + free(in); + free(out); +} + +static char * dupstr (const char *src) +{ + char *dst = malloc(strlen(src) + 1); + char *cptr; + if (!dst) { + fprintf(stderr, "%s:%d: malloc failed!\n", __FILE__, __LINE__); + exit(EXIT_FAILURE); + } + cptr = dst; + while ((*cptr++ = *src++)) + ; + return dst; +} + +#ifdef DEBUG +static void PrintDataStruct (struct DataStruct *data) { + int i, j; + for (i = 0; i < nShapes; i++) { + printf("data[%d] {\n", i); + printf("\t.record = %d\n", data[i].record); + for (j = 0; j < nFields; j++) { + printf("\t.value[%d].null = %d\n", j, data[i].value[j].null); + if (!data[i].value[j].null) { + switch(fldType[j]) { + case FIDType: + case IntegerType: + case LogicalType: + printf("\t.value[%d].u.i = %d\n", j, data[i].value[j].u.i); + break; + case DoubleType: + case SHPType: + printf("\t.value[%d].u.d = %f\n", j, data[i].value[j].u.d); + break; + case StringType: + printf("\t.value[%d].u.s = %s\n", j, data[i].value[j].u.s); + break; + } + } + } + puts("}"); + } +} +#endif + +static struct DataStruct * build_index (SHPHandle shp, DBFHandle dbf) { + struct DataStruct *data; + SHPObject *feat; + int i; + int j; + + /* make array */ + data = malloc (sizeof *data * nShapes); + if (!data) { + fputs("malloc failed!\n", stderr); + exit(EXIT_FAILURE); + } + + /* populate array */ + for (i = 0; i < nShapes; i++) { + data[i].value = malloc(sizeof data[0].value[0] * nFields); + if (0 == data[i].value) { + fputs("malloc failed!\n", stderr); + exit(EXIT_FAILURE); + } + data[i].record = i; + for (j = 0; j < nFields; j++) { + data[i].value[j].null = 0; + switch (fldType[j]) { + case FIDType: + data[i].value[j].u.i = i; + break; + case SHPType: + feat = SHPReadObject(shp, i); + switch (feat->nSHPType) { + case SHPT_NULL: + fprintf(stderr, "Shape %d is a null feature!\n", i); + data[i].value[j].null = 1; + break; + case SHPT_POINT: + case SHPT_POINTZ: + case SHPT_POINTM: + case SHPT_MULTIPOINT: + case SHPT_MULTIPOINTZ: + case SHPT_MULTIPOINTM: + case SHPT_MULTIPATCH: + /* Y-sort bounds */ + data[i].value[j].u.d = feat->dfYMax; + break; + case SHPT_ARC: + case SHPT_ARCZ: + case SHPT_ARCM: + data[i].value[j].u.d = shp_length(feat); + break; + case SHPT_POLYGON: + case SHPT_POLYGONZ: + case SHPT_POLYGONM: + data[i].value[j].u.d = shp_area(feat); + break; + default: + fputs("Can't sort on Shapefile feature type!\n", stderr); + exit(EXIT_FAILURE); + } + SHPDestroyObject(feat); + break; + case FTString: + data[i].value[j].null = DBFIsAttributeNULL(dbf, i, fldIdx[j]); + if (!data[i].value[j].null) { + data[i].value[j].u.s = dupstr(DBFReadStringAttribute(dbf, i, fldIdx[j])); + } + break; + case FTInteger: + case FTLogical: + data[i].value[j].null = DBFIsAttributeNULL(dbf, i, fldIdx[j]); + if (!data[i].value[j].null) { + data[i].value[j].u.i = DBFReadIntegerAttribute(dbf, i, fldIdx[j]); + } + break; + case FTDouble: + data[i].value[j].null = DBFIsAttributeNULL(dbf, i, fldIdx[j]); + if (!data[i].value[j].null) { + data[i].value[j].u.d = DBFReadDoubleAttribute(dbf, i, fldIdx[j]); + } + break; + } + } + } + +#ifdef DEBUG + PrintDataStruct(data); + fputs("build_index: sorting array\n", stdout); +#endif + + qsort (data, nShapes, sizeof data[0], compare); + +#ifdef DEBUG + PrintDataStruct(data); + fputs("build_index: returning array\n", stdout); +#endif + + return data; +} + +static int compare(const void *A, const void *B) { + const struct DataStruct *a = A; + const struct DataStruct *b = B; + int i; + int result = 0; + + for (i = 0; i < nFields; i++) { + if (a->value[i].null && b->value[i].null) { + continue; + } + if (a->value[i].null && !b->value[i].null) { + return (fldOrder[i]) ? 1 : -1; + } + if (!a->value[i].null && b->value[i].null) { + return (fldOrder[i]) ? -1 : 1; + } + switch (fldType[i]) { + case FIDType: + case IntegerType: + case LogicalType: + if (a->value[i].u.i < b->value[i].u.i) { + return (fldOrder[i]) ? -1 : 1; + } + if (a->value[i].u.i > b->value[i].u.i) { + return (fldOrder[i]) ? 1 : -1; + } + break; + case DoubleType: + case SHPType: + if (a->value[i].u.d < b->value[i].u.d) { + return (fldOrder[i]) ? -1 : 1; + } + if (a->value[i].u.d > b->value[i].u.d) { + return (fldOrder[i]) ? 1 : -1; + } + break; + case StringType: + result = strcmp(a->value[i].u.s, b->value[i].u.s); + if (result) { + return (fldOrder[i]) ? result : -result; + } + break; + default: + fprintf(stderr, "compare: Program Error! Unhandled field type! fldType[%d] = %d\n", i, fldType[i]); + break; + } + } + return 0; +} + +static double area2d_polygon (int n, double *x, double *y) { + double area = 0; + int i; + for (i = 1; i < n; i++) { + area += (x[i-1] + x[i]) * (y[i] - y[i-1]); + } + return area / 2.0; +} + +static double shp_area (SHPObject *feat) { + double area = 0.0; + if (feat->nParts == 0) { + area = area2d_polygon (feat->nVertices, feat->padfX, feat->padfY); + } + else { + int part, n; + for (part = 0; part < feat->nParts; part++) { + if (part < feat->nParts - 1) { + n = feat->panPartStart[part+1] - feat->panPartStart[part]; + } + else { + n = feat->nVertices - feat->panPartStart[part]; + } + area += area2d_polygon (n, &(feat->padfX[feat->panPartStart[part]]), + &(feat->padfY[feat->panPartStart[part]])); + } + } + /* our area function computes in opposite direction */ + return -area; +} + +static double length2d_polyline (int n, double *x, double *y) { + double length = 0.0; + int i; + for (i = 1; i < n; i++) { + length += sqrt((x[i] - x[i-1])*(x[i] - x[i-1]) + + + (y[i] - y[i-1])*(y[i] - y[i-1])); + } + return length; +} + +static double shp_length (SHPObject *feat) { + double length = 0.0; + if (feat->nParts == 0) { + length = length2d_polyline(feat->nVertices, feat->padfX, feat->padfY); + } + else { + int part, n; + for (part = 0; part < feat->nParts; part++) { + if (part < feat->nParts - 1) { + n = feat->panPartStart[part+1] - feat->panPartStart[part]; + } + else { + n = feat->nVertices - feat->panPartStart[part]; + } + length += length2d_polyline (n, + &(feat->padfX[feat->panPartStart[part]]), + &(feat->padfY[feat->panPartStart[part]])); + } + } + return length; +} + diff --git a/libs/shapelib/contrib/shpwkb.c b/libs/shapelib/contrib/shpwkb.c new file mode 100644 index 0000000..f27114e --- /dev/null +++ b/libs/shapelib/contrib/shpwkb.c @@ -0,0 +1,129 @@ +/****************************************************************************** + * Copyright (c) 1999, Carl Anderson + * + * this code is based in part on the earlier work of Frank Warmerdam + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * shpwkb.c - test WKB binary Input / Output + * + * + * $Log: shpwkb.c,v $ + * Revision 1.2 2016-12-05 12:44:07 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.1 1999-05-26 02:29:36 candrsn + * OGis Well Known Binary test program (output only) + * + * + * + */ + +#include +#include "shapefil.h" +#include "shpgeo.h" + +int main( int argc, char ** argv ) +{ + SHPHandle old_SHP, new_SHP; + DBFHandle old_DBF, new_DBF; + int nShapeType, nEntities, nVertices, nParts, *panParts, i, iPart; + double *padVertices, adBounds[4]; + const char *pszPlus; + DBFFieldType idfld_type; + int idfld, nflds; + char kv[257] = ""; + char idfldName[120] = ""; + char fldName[120] = ""; + char shpFileName[120] = ""; + char dbfFileName[120] = ""; + char *DBFRow = NULL; + int Cpan[2] = { 0,0 }; + int byRing = 0; + PT oCentrd, ringCentrd; + SHPObject *psCShape, *cent_pt; + double oArea = 0.0, oLen = 0.0; + WKBStreamObj *wkbObj = NULL; + FILE *wkb_file = NULL; + + if( argc < 3 ) + { + printf( "shpwkb shp_file wkb_file\n" ); + exit( 1 ); + } + + old_SHP = SHPOpen (argv[1], "rb" ); + old_DBF = DBFOpen (argv[1], "rb"); + if( old_SHP == NULL || old_DBF == NULL ) + { + printf( "Unable to open old files:%s\n", argv[1] ); + exit( 1 ); + } + + wkb_file = fopen ( argv[2], "wb"); + wkbObj = calloc ( 3, sizeof (int) ); + + SHPGetInfo( old_SHP, &nEntities, &nShapeType, NULL, NULL ); + for( i = 0; i < nEntities; i++ ) + { + int res ; + + psCShape = SHPReadObject( old_SHP, i ); + + if ( byRing == 1 ) { + int ring, prevStart, ringDir; + double ringArea; + + prevStart = psCShape->nVertices; + for ( ring = (psCShape->nParts - 1); ring >= 0; ring-- ) { + SHPObject *psO; + int j, numVtx, rStart; + + rStart = psCShape->panPartStart[ring]; + if ( ring == (psCShape->nParts -1) ) + { numVtx = psCShape->nVertices - rStart; } + else + { numVtx = psCShape->panPartStart[ring+1] - rStart; } + + printf ("(shpdata) Ring(%d) (%d for %d) \n", ring, rStart, numVtx); + psO = SHPClone ( psCShape, ring, ring + 1 ); + + SHPDestroyObject ( psO ); + printf ("(shpdata) End Ring \n"); + } /* (ring) [0,nParts */ + + } /* by ring */ + + printf ("gonna build a wkb \n"); + res = SHPWriteOGisWKB ( wkbObj, psCShape ); + printf ("gonna write a wkb that is %d bytes long \n", wkbObj->StreamPos ); + fwrite ( (void*) wkbObj->wStream, 1, wkbObj->StreamPos, wkb_file ); + } + + + free ( wkbObj ); + SHPClose( old_SHP ); + DBFClose( old_DBF ); + if ( wkb_file ) fclose ( wkb_file ); + + printf ("\n"); +} diff --git a/libs/shapelib/contrib/tests/shpproj.sh b/libs/shapelib/contrib/tests/shpproj.sh new file mode 100755 index 0000000..4f1ceb5 --- /dev/null +++ b/libs/shapelib/contrib/tests/shpproj.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +testdir="$(dirname "$(readlink -f $0)")" + +rm -f "$testdir/test*" +$top_builddir/shpcreate "$testdir/test" point + +$top_builddir/shpadd "$testdir/test" -83.54949956 34.992401 +$top_builddir/shpadd "$testdir/test" -83.52162155 34.99276748 +$top_builddir/shpadd "$testdir/test" -84.01681518 34.67275985 +$top_builddir/shpadd "$testdir/test" -84.15596023 34.64862437 +$top_builddir/shpadd "$testdir/test" -83.61951463 34.54927047 + +$top_builddir/dbfcreate "$testdir/test" -s fd 30 +$top_builddir/dbfadd "$testdir/test" "1" +$top_builddir/dbfadd "$testdir/test" "2" +$top_builddir/dbfadd "$testdir/test" "3" +$top_builddir/dbfadd "$testdir/test" "4" +$top_builddir/dbfadd "$testdir/test" "5" + +$top_builddir/contrib/shpproj "$testdir/test" "$testdir/test_1" -i=geographic -o="init=nad83:1002 units=us-ft" +$top_builddir/contrib/shpproj "$testdir/test_1" "$testdir/test_2" -o="proj=utm zone=16 units=m" +$top_builddir/contrib/shpproj "$testdir/test_2" "$testdir/test_3" -o=geographic + +$top_builddir/shpdump -precision 8 "$testdir/test" > "$testdir/test.out" +$top_builddir/shpdump -precision 8 "$testdir/test_3" > "$testdir/test_3.out" + + +result="$(diff "$testdir/test.out" "$testdir/test_3.out")" +if [ "$result" == "" ]; then + echo "******* Test Succeeded *********" + rm -f "$testdir/test*" + exit 0 +else + echo "******* Test Failed *********" + echo "$result" + rm -f "$testdir/test*" + exit 1 +fi diff --git a/libs/shapelib/dbfadd.c b/libs/shapelib/dbfadd.c new file mode 100644 index 0000000..0c57ef8 --- /dev/null +++ b/libs/shapelib/dbfadd.c @@ -0,0 +1,133 @@ +/****************************************************************************** + * $Id: dbfadd.c,v 1.10 2016-12-05 12:44:05 erouault Exp $ + * + * Project: Shapelib + * Purpose: Sample application for adding a record to an existing .dbf file. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * $Log: dbfadd.c,v $ + * Revision 1.10 2016-12-05 12:44:05 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.9 2004-09-26 20:09:35 fwarmerdam + * avoid rcsid warnings + * + * Revision 1.8 2004/01/09 16:39:49 fwarmerdam + * include standard include files + * + * Revision 1.7 2002/01/15 14:36:07 warmerda + * updated email address + * + * Revision 1.6 2001/05/31 18:15:40 warmerda + * Added support for NULL fields in DBF files + * + * Revision 1.5 1999/11/05 14:12:04 warmerda + * updated license terms + * + * Revision 1.4 1998/12/03 16:36:06 warmerda + * Added stdlib.h and math.h to get atof() prototype. + * + * Revision 1.3 1995/10/21 03:13:23 warmerda + * Use binary mode.. + * + * Revision 1.2 1995/08/04 03:15:59 warmerda + * Added header. + * + */ + +#include +#include +#include + +#include "shapefil.h" + +SHP_CVSID("$Id: dbfadd.c,v 1.10 2016-12-05 12:44:05 erouault Exp $") + +int main( int argc, char ** argv ) + +{ + DBFHandle hDBF; + int i, iRecord; + +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( argc < 3 ) + { + printf( "dbfadd xbase_file field_values\n" ); + + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Create the database. */ +/* -------------------------------------------------------------------- */ + hDBF = DBFOpen( argv[1], "r+b" ); + if( hDBF == NULL ) + { + printf( "DBFOpen(%s,\"rb+\") failed.\n", argv[1] ); + exit( 2 ); + } + +/* -------------------------------------------------------------------- */ +/* Do we have the correct number of arguments? */ +/* -------------------------------------------------------------------- */ + if( DBFGetFieldCount( hDBF ) != argc - 2 ) + { + printf( "Got %d fields, but require %d\n", + argc - 2, DBFGetFieldCount( hDBF ) ); + exit( 3 ); + } + + iRecord = DBFGetRecordCount( hDBF ); + +/* -------------------------------------------------------------------- */ +/* Loop assigning the new field values. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < DBFGetFieldCount(hDBF); i++ ) + { + if( strcmp( argv[i+2], "" ) == 0 ) + DBFWriteNULLAttribute(hDBF, iRecord, i ); + else if( DBFGetFieldInfo( hDBF, i, NULL, NULL, NULL ) == FTString ) + DBFWriteStringAttribute(hDBF, iRecord, i, argv[i+2] ); + else + DBFWriteDoubleAttribute(hDBF, iRecord, i, atof(argv[i+2]) ); + } + +/* -------------------------------------------------------------------- */ +/* Close and cleanup. */ +/* -------------------------------------------------------------------- */ + DBFClose( hDBF ); + + return( 0 ); +} diff --git a/libs/shapelib/dbfcreate.c b/libs/shapelib/dbfcreate.c new file mode 100644 index 0000000..13238b3 --- /dev/null +++ b/libs/shapelib/dbfcreate.c @@ -0,0 +1,131 @@ +/****************************************************************************** + * $Id: dbfcreate.c,v 1.8 2016-12-05 12:44:05 erouault Exp $ + * + * Project: Shapelib + * Purpose: Sample application for creating a new .dbf file. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * $Log: dbfcreate.c,v $ + * Revision 1.8 2016-12-05 12:44:05 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.7 2004-09-26 20:09:35 fwarmerdam + * avoid rcsid warnings + * + * Revision 1.6 2002/01/15 14:36:07 warmerda + * updated email address + * + * Revision 1.5 2000/07/07 13:39:45 warmerda + * removed unused variables, and added system include files + * + * Revision 1.4 1999/11/05 14:12:04 warmerda + * updated license terms + * + * Revision 1.3 1999/04/01 18:47:44 warmerda + * Fixed DBFAddField() call convention. + * + * Revision 1.2 1995/08/04 03:17:11 warmerda + * Added header. + * + */ + +#include +#include +#include "shapefil.h" + +SHP_CVSID("$Id: dbfcreate.c,v 1.8 2016-12-05 12:44:05 erouault Exp $") + +int main( int argc, char ** argv ) + +{ + DBFHandle hDBF; + int i; + +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( argc < 2 ) + { + printf( "dbfcreate xbase_file [[-s field_name width],[-n field_name width decimals]]...\n" ); + + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Create the database. */ +/* -------------------------------------------------------------------- */ + hDBF = DBFCreate( argv[1] ); + if( hDBF == NULL ) + { + printf( "DBFCreate(%s) failed.\n", argv[1] ); + exit( 2 ); + } + +/* -------------------------------------------------------------------- */ +/* Loop over the field definitions adding new fields. */ +/* -------------------------------------------------------------------- */ + for( i = 2; i < argc; i++ ) + { + if( strcmp(argv[i],"-s") == 0 && i < argc-2 ) + { + if( DBFAddField( hDBF, argv[i+1], FTString, atoi(argv[i+2]), 0 ) + == -1 ) + { + printf( "DBFAddField(%s,FTString,%d,0) failed.\n", + argv[i+1], atoi(argv[i+2]) ); + exit( 4 ); + } + i = i + 2; + } + else if( strcmp(argv[i],"-n") == 0 && i < argc-3 ) + { + if( DBFAddField( hDBF, argv[i+1], FTDouble, atoi(argv[i+2]), + atoi(argv[i+3]) ) == -1 ) + { + printf( "DBFAddField(%s,FTDouble,%d,%d) failed.\n", + argv[i+1], atoi(argv[i+2]), atoi(argv[i+3]) ); + exit( 4 ); + } + i = i + 3; + } + else + { + printf( "Argument incomplete, or unrecognised:%s\n", argv[i] ); + exit( 3 ); + } + } + + DBFClose( hDBF ); + + return( 0 ); +} diff --git a/libs/shapelib/dbfdump.c b/libs/shapelib/dbfdump.c new file mode 100644 index 0000000..bb3afdf --- /dev/null +++ b/libs/shapelib/dbfdump.c @@ -0,0 +1,295 @@ +/****************************************************************************** + * $Id: dbfdump.c,v 1.14 2016-12-05 12:44:05 erouault Exp $ + * + * Project: Shapelib + * Purpose: Sample application for dumping .dbf files to the terminal. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * $Log: dbfdump.c,v $ + * Revision 1.14 2016-12-05 12:44:05 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.13 2013-11-26 21:52:33 fwarmerdam + * report deleted rows in dbfdump + * + * Revision 1.12 2006-06-17 00:15:08 fwarmerdam + * Free panWidth for better memory testing. + * + * Revision 1.11 2006/02/15 01:11:27 fwarmerdam + * added reporting of native type + * + * Revision 1.10 2004/09/26 20:09:35 fwarmerdam + * avoid rcsid warnings + * + * Revision 1.9 2002/01/15 14:36:07 warmerda + * updated email address + * + * Revision 1.8 2001/05/31 18:15:40 warmerda + * Added support for NULL fields in DBF files + * + * Revision 1.7 2000/09/20 13:13:55 warmerda + * added break after default: + * + * Revision 1.6 2000/07/07 13:39:45 warmerda + * removed unused variables, and added system include files + * + * Revision 1.5 1999/11/05 14:12:04 warmerda + * updated license terms + * + * Revision 1.4 1998/12/31 15:30:13 warmerda + * Added -m, -r, and -h commandline options. + * + * Revision 1.3 1995/10/21 03:15:01 warmerda + * Changed to use binary file access. + * + * Revision 1.2 1995/08/04 03:16:22 warmerda + * Added header. + * + */ + +#include +#include +#include "shapefil.h" + +SHP_CVSID("$Id: dbfdump.c,v 1.14 2016-12-05 12:44:05 erouault Exp $") + +int main( int argc, char ** argv ) + +{ + DBFHandle hDBF; + int *panWidth, i, iRecord; + char szFormat[32], *pszFilename = NULL; + int nWidth, nDecimals; + int bHeader = 0; + int bRaw = 0; + int bMultiLine = 0; + char szTitle[12]; + +/* -------------------------------------------------------------------- */ +/* Handle arguments. */ +/* -------------------------------------------------------------------- */ + for( i = 1; i < argc; i++ ) + { + if( strcmp(argv[i],"-h") == 0 ) + bHeader = 1; + else if( strcmp(argv[i],"-r") == 0 ) + bRaw = 1; + else if( strcmp(argv[i],"-m") == 0 ) + bMultiLine = 1; + else + pszFilename = argv[i]; + } + +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( pszFilename == NULL ) + { + printf( "dbfdump [-h] [-r] [-m] xbase_file\n" ); + printf( " -h: Write header info (field descriptions)\n" ); + printf( " -r: Write raw field info, numeric values not reformatted\n" ); + printf( " -m: Multiline, one line per field.\n" ); + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Open the file. */ +/* -------------------------------------------------------------------- */ + hDBF = DBFOpen( pszFilename, "rb" ); + if( hDBF == NULL ) + { + printf( "DBFOpen(%s,\"r\") failed.\n", argv[1] ); + exit( 2 ); + } + +/* -------------------------------------------------------------------- */ +/* If there is no data in this file let the user know. */ +/* -------------------------------------------------------------------- */ + if( DBFGetFieldCount(hDBF) == 0 ) + { + printf( "There are no fields in this table!\n" ); + exit( 3 ); + } + +/* -------------------------------------------------------------------- */ +/* Dump header definitions. */ +/* -------------------------------------------------------------------- */ + if( bHeader ) + { + for( i = 0; i < DBFGetFieldCount(hDBF); i++ ) + { + DBFFieldType eType; + const char *pszTypeName; + char chNativeType; + + chNativeType = DBFGetNativeFieldType( hDBF, i ); + + eType = DBFGetFieldInfo( hDBF, i, szTitle, &nWidth, &nDecimals ); + if( eType == FTString ) + pszTypeName = "String"; + else if( eType == FTInteger ) + pszTypeName = "Integer"; + else if( eType == FTDouble ) + pszTypeName = "Double"; + else if( eType == FTInvalid ) + pszTypeName = "Invalid"; + + printf( "Field %d: Type=%c/%s, Title=`%s', Width=%d, Decimals=%d\n", + i, chNativeType, pszTypeName, szTitle, nWidth, nDecimals ); + } + } + +/* -------------------------------------------------------------------- */ +/* Compute offsets to use when printing each of the field */ +/* values. We make each field as wide as the field title+1, or */ +/* the field value + 1. */ +/* -------------------------------------------------------------------- */ + panWidth = (int *) malloc( DBFGetFieldCount( hDBF ) * sizeof(int) ); + + for( i = 0; i < DBFGetFieldCount(hDBF) && !bMultiLine; i++ ) + { + DBFFieldType eType; + + eType = DBFGetFieldInfo( hDBF, i, szTitle, &nWidth, &nDecimals ); + if( (int) strlen(szTitle) > nWidth ) + panWidth[i] = strlen(szTitle); + else + panWidth[i] = nWidth; + + if( eType == FTString ) + sprintf( szFormat, "%%-%ds ", panWidth[i] ); + else + sprintf( szFormat, "%%%ds ", panWidth[i] ); + printf( szFormat, szTitle ); + } + printf( "\n" ); + +/* -------------------------------------------------------------------- */ +/* Read all the records */ +/* -------------------------------------------------------------------- */ + for( iRecord = 0; iRecord < DBFGetRecordCount(hDBF); iRecord++ ) + { + if( bMultiLine ) + printf( "Record: %d\n", iRecord ); + + for( i = 0; i < DBFGetFieldCount(hDBF); i++ ) + { + DBFFieldType eType; + + eType = DBFGetFieldInfo( hDBF, i, szTitle, &nWidth, &nDecimals ); + + if( bMultiLine ) + { + printf( "%s: ", szTitle ); + } + +/* -------------------------------------------------------------------- */ +/* Print the record according to the type and formatting */ +/* information implicit in the DBF field description. */ +/* -------------------------------------------------------------------- */ + if( !bRaw ) + { + if( DBFIsAttributeNULL( hDBF, iRecord, i ) ) + { + if( eType == FTString ) + sprintf( szFormat, "%%-%ds", nWidth ); + else + sprintf( szFormat, "%%%ds", nWidth ); + + printf( szFormat, "(NULL)" ); + } + else + { + switch( eType ) + { + case FTString: + sprintf( szFormat, "%%-%ds", nWidth ); + printf( szFormat, + DBFReadStringAttribute( hDBF, iRecord, i ) ); + break; + + case FTInteger: + sprintf( szFormat, "%%%dd", nWidth ); + printf( szFormat, + DBFReadIntegerAttribute( hDBF, iRecord, i ) ); + break; + + case FTDouble: + sprintf( szFormat, "%%%d.%dlf", nWidth, nDecimals ); + printf( szFormat, + DBFReadDoubleAttribute( hDBF, iRecord, i ) ); + break; + + default: + break; + } + } + } + +/* -------------------------------------------------------------------- */ +/* Just dump in raw form (as formatted in the file). */ +/* -------------------------------------------------------------------- */ + else + { + sprintf( szFormat, "%%-%ds", nWidth ); + printf( szFormat, + DBFReadStringAttribute( hDBF, iRecord, i ) ); + } + +/* -------------------------------------------------------------------- */ +/* Write out any extra spaces required to pad out the field */ +/* width. */ +/* -------------------------------------------------------------------- */ + if( !bMultiLine ) + { + sprintf( szFormat, "%%%ds", panWidth[i] - nWidth + 1 ); + printf( szFormat, "" ); + } + + if( bMultiLine ) + printf( "\n" ); + + fflush( stdout ); + } + + if( DBFIsRecordDeleted(hDBF, iRecord) ) + printf( "(DELETED)" ); + + printf( "\n" ); + } + + DBFClose( hDBF ); + free( panWidth ); + + return( 0 ); +} diff --git a/libs/shapelib/dbfopen.c b/libs/shapelib/dbfopen.c new file mode 100644 index 0000000..148e593 --- /dev/null +++ b/libs/shapelib/dbfopen.c @@ -0,0 +1,2405 @@ +/****************************************************************************** + * $Id: dbfopen.c,v 1.92 2016-12-05 18:44:08 erouault Exp $ + * + * Project: Shapelib + * Purpose: Implementation of .dbf access API documented in dbf_api.html. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * Copyright (c) 2012-2013, Even Rouault + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * $Log: dbfopen.c,v $ + * Revision 1.92 2016-12-05 18:44:08 erouault + * * dbfopen.c, shapefil.h: write DBF end-of-file character 0x1A by default. + * This behaviour can be controlled with the DBFSetWriteEndOfFileChar() + * function. + * + * Revision 1.91 2016-12-05 12:44:05 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.90 2016-12-04 15:30:15 erouault + * * shpopen.c, dbfopen.c, shptree.c, shapefil.h: resync with + * GDAL Shapefile driver. Mostly cleanups. SHPObject and DBFInfo + * structures extended with new members. New functions: + * DBFSetLastModifiedDate, SHPOpenLLEx, SHPRestoreSHX, + * SHPSetFastModeReadObject + * + * * sbnsearch.c: new file to implement original ESRI .sbn spatial + * index reading. (no write support). New functions: + * SBNOpenDiskTree, SBNCloseDiskTree, SBNSearchDiskTree, + * SBNSearchDiskTreeInteger, SBNSearchFreeIds + * + * * Makefile, makefile.vc, CMakeLists.txt, shapelib.def: updates + * with new file and symbols. + * + * * commit: helper script to cvs commit + * + * Revision 1.89 2011-07-24 05:59:25 fwarmerdam + * minimize use of CPLError in favor of SAHooks.Error() + * + * Revision 1.88 2011-05-13 17:35:17 fwarmerdam + * added DBFReorderFields() and DBFAlterFields() functions (from Even) + * + * Revision 1.87 2011-05-07 22:41:02 fwarmerdam + * ensure pending record is flushed when adding a native field (GDAL #4073) + * + * Revision 1.86 2011-04-17 15:15:29 fwarmerdam + * Removed unused variable. + * + * Revision 1.85 2010-12-06 16:09:34 fwarmerdam + * fix buffer read overrun fetching code page (bug 2276) + * + * Revision 1.84 2009-10-29 19:59:48 fwarmerdam + * avoid crash on truncated header (gdal #3093) + * + * Revision 1.83 2008/11/12 14:28:15 fwarmerdam + * DBFCreateField() now works on files with records + * + * Revision 1.82 2008/11/11 17:47:09 fwarmerdam + * added DBFDeleteField() function + * + * Revision 1.81 2008/01/03 17:48:13 bram + * in DBFCreate, use default code page LDID/87 (= 0x57, ANSI) + * instead of LDID/3. This seems to be the same as what ESRI + * would be doing by default. + * + * Revision 1.80 2007/12/30 14:36:39 fwarmerdam + * avoid syntax issue with last comment. + * + * Revision 1.79 2007/12/30 14:35:48 fwarmerdam + * Avoid char* / unsigned char* warnings. + * + * Revision 1.78 2007/12/18 18:28:07 bram + * - create hook for client specific atof (bugzilla ticket 1615) + * - check for NULL handle before closing cpCPG file, and close after reading. + * + * Revision 1.77 2007/12/15 20:25:21 bram + * dbfopen.c now reads the Code Page information from the DBF file, and exports + * this information as a string through the DBFGetCodePage function. This is + * either the number from the LDID header field ("LDID/") or as the + * content of an accompanying .CPG file. When creating a DBF file, the code can + * be set using DBFCreateEx. + * + * Revision 1.76 2007/12/12 22:21:32 bram + * DBFClose: check for NULL psDBF handle before trying to close it. + * + * Revision 1.75 2007/12/06 13:58:19 fwarmerdam + * make sure file offset calculations are done in as SAOffset + * + * Revision 1.74 2007/12/06 07:00:25 fwarmerdam + * dbfopen now using SAHooks for fileio + * + * Revision 1.73 2007/09/03 19:48:11 fwarmerdam + * move DBFReadAttribute() static dDoubleField into dbfinfo + * + * Revision 1.72 2007/09/03 19:34:06 fwarmerdam + * Avoid use of static tuple buffer in DBFReadTuple() + * + * Revision 1.71 2006/06/22 14:37:18 fwarmerdam + * avoid memory leak if dbfopen fread fails + * + * Revision 1.70 2006/06/17 17:47:05 fwarmerdam + * use calloc() for dbfinfo in DBFCreate + * + * Revision 1.69 2006/06/17 15:34:32 fwarmerdam + * disallow creating fields wider than 255 + * + * Revision 1.68 2006/06/17 15:12:40 fwarmerdam + * Fixed C++ style comments. + * + * Revision 1.67 2006/06/17 00:24:53 fwarmerdam + * Don't treat non-zero decimals values as high order byte for length + * for strings. It causes serious corruption for some files. + * http://bugzilla.remotesensing.org/show_bug.cgi?id=1202 + * + * Revision 1.66 2006/03/29 18:26:20 fwarmerdam + * fixed bug with size of pachfieldtype in dbfcloneempty + * + * Revision 1.65 2006/02/15 01:14:30 fwarmerdam + * added DBFAddNativeFieldType + * + * Revision 1.64 2006/02/09 00:29:04 fwarmerdam + * Changed to put spaces into string fields that are NULL as + * per http://bugzilla.maptools.org/show_bug.cgi?id=316. + * + * Revision 1.63 2006/01/25 15:35:43 fwarmerdam + * check success on DBFFlushRecord + * + * Revision 1.62 2006/01/10 16:28:03 fwarmerdam + * Fixed typo in CPLError. + * + * Revision 1.61 2006/01/10 16:26:29 fwarmerdam + * Push loading record buffer into DBFLoadRecord. + * Implement CPL error reporting if USE_CPL defined. + * + * Revision 1.60 2006/01/05 01:27:27 fwarmerdam + * added dbf deletion mark/fetch + * + * Revision 1.59 2005/03/14 15:20:28 fwarmerdam + * Fixed last change. + * + * Revision 1.58 2005/03/14 15:18:54 fwarmerdam + * Treat very wide fields with no decimals as double. This is + * more than 32bit integer fields. + * + * Revision 1.57 2005/02/10 20:16:54 fwarmerdam + * Make the pszStringField buffer for DBFReadAttribute() static char [256] + * as per bug 306. + * + * Revision 1.56 2005/02/10 20:07:56 fwarmerdam + * Fixed bug 305 in DBFCloneEmpty() - header length problem. + * + * Revision 1.55 2004/09/26 20:23:46 fwarmerdam + * avoid warnings with rcsid and signed/unsigned stuff + * + * Revision 1.54 2004/09/15 16:26:10 fwarmerdam + * Treat all blank numeric fields as null too. + */ + +#include "shapefil.h" + +#include +#include +#include +#include + +#ifdef USE_CPL +#include "cpl_string.h" +#else + +#if defined(_MSC_VER) +# if _MSC_VER < 1900 +# define snprintf _snprintf +# endif +#elif defined(WIN32) || defined(_WIN32) +# ifndef snprintf +# define snprintf _snprintf +# endif +#endif + +#define CPLsprintf sprintf +#define CPLsnprintf snprintf +#endif + +SHP_CVSID("$Id: dbfopen.c,v 1.92 2016-12-05 18:44:08 erouault Exp $") + +#ifndef FALSE +# define FALSE 0 +# define TRUE 1 +#endif + +/* File header size */ +#define XBASE_FILEHDR_SZ 32 + +#define HEADER_RECORD_TERMINATOR 0x0D + +/* See http://www.manmrk.net/tutorials/database/xbase/dbf.html */ +#define END_OF_FILE_CHARACTER 0x1A + +#ifdef USE_CPL +CPL_INLINE static void CPL_IGNORE_RET_VAL_INT(CPL_UNUSED int unused) {} +#else +#define CPL_IGNORE_RET_VAL_INT(x) x +#endif + +/************************************************************************/ +/* SfRealloc() */ +/* */ +/* A realloc cover function that will access a NULL pointer as */ +/* a valid input. */ +/************************************************************************/ + +static void * SfRealloc( void * pMem, int nNewSize ) + +{ + if( pMem == NULL ) + return( (void *) malloc(nNewSize) ); + else + return( (void *) realloc(pMem,nNewSize) ); +} + +/************************************************************************/ +/* DBFWriteHeader() */ +/* */ +/* This is called to write out the file header, and field */ +/* descriptions before writing any actual data records. This */ +/* also computes all the DBFDataSet field offset/size/decimals */ +/* and so forth values. */ +/************************************************************************/ + +static void DBFWriteHeader(DBFHandle psDBF) + +{ + unsigned char abyHeader[XBASE_FILEHDR_SZ] = { 0 }; + + if( !psDBF->bNoHeader ) + return; + + psDBF->bNoHeader = FALSE; + +/* -------------------------------------------------------------------- */ +/* Initialize the file header information. */ +/* -------------------------------------------------------------------- */ + abyHeader[0] = 0x03; /* memo field? - just copying */ + + /* write out update date */ + abyHeader[1] = (unsigned char) psDBF->nUpdateYearSince1900; + abyHeader[2] = (unsigned char) psDBF->nUpdateMonth; + abyHeader[3] = (unsigned char) psDBF->nUpdateDay; + + /* record count preset at zero */ + + abyHeader[8] = (unsigned char) (psDBF->nHeaderLength % 256); + abyHeader[9] = (unsigned char) (psDBF->nHeaderLength / 256); + + abyHeader[10] = (unsigned char) (psDBF->nRecordLength % 256); + abyHeader[11] = (unsigned char) (psDBF->nRecordLength / 256); + + abyHeader[29] = (unsigned char) (psDBF->iLanguageDriver); + +/* -------------------------------------------------------------------- */ +/* Write the initial 32 byte file header, and all the field */ +/* descriptions. */ +/* -------------------------------------------------------------------- */ + psDBF->sHooks.FSeek( psDBF->fp, 0, 0 ); + psDBF->sHooks.FWrite( abyHeader, XBASE_FILEHDR_SZ, 1, psDBF->fp ); + psDBF->sHooks.FWrite( psDBF->pszHeader, XBASE_FLDHDR_SZ, psDBF->nFields, + psDBF->fp ); + +/* -------------------------------------------------------------------- */ +/* Write out the newline character if there is room for it. */ +/* -------------------------------------------------------------------- */ + if( psDBF->nHeaderLength > XBASE_FLDHDR_SZ*psDBF->nFields + + XBASE_FLDHDR_SZ ) + { + char cNewline; + + cNewline = HEADER_RECORD_TERMINATOR; + psDBF->sHooks.FWrite( &cNewline, 1, 1, psDBF->fp ); + } + +/* -------------------------------------------------------------------- */ +/* If the file is new, add a EOF character. */ +/* -------------------------------------------------------------------- */ + if( psDBF->nRecords == 0 && psDBF->bWriteEndOfFileChar ) + { + char ch = END_OF_FILE_CHARACTER; + + psDBF->sHooks.FWrite( &ch, 1, 1, psDBF->fp ); + } +} + +/************************************************************************/ +/* DBFFlushRecord() */ +/* */ +/* Write out the current record if there is one. */ +/************************************************************************/ + +static int DBFFlushRecord( DBFHandle psDBF ) + +{ + SAOffset nRecordOffset; + + if( psDBF->bCurrentRecordModified && psDBF->nCurrentRecord > -1 ) + { + psDBF->bCurrentRecordModified = FALSE; + + nRecordOffset = + psDBF->nRecordLength * (SAOffset) psDBF->nCurrentRecord + + psDBF->nHeaderLength; + + if( psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ) != 0 + || psDBF->sHooks.FWrite( psDBF->pszCurrentRecord, + psDBF->nRecordLength, + 1, psDBF->fp ) != 1 ) + { + char szMessage[128]; + snprintf( szMessage, sizeof(szMessage), "Failure writing DBF record %d.", + psDBF->nCurrentRecord ); + psDBF->sHooks.Error( szMessage ); + return FALSE; + } + + if( psDBF->nCurrentRecord == psDBF->nRecords - 1 ) + { + if( psDBF->bWriteEndOfFileChar ) + { + char ch = END_OF_FILE_CHARACTER; + psDBF->sHooks.FWrite( &ch, 1, 1, psDBF->fp ); + } + } + } + + return TRUE; +} + +/************************************************************************/ +/* DBFLoadRecord() */ +/************************************************************************/ + +static int DBFLoadRecord( DBFHandle psDBF, int iRecord ) + +{ + if( psDBF->nCurrentRecord != iRecord ) + { + SAOffset nRecordOffset; + + if( !DBFFlushRecord( psDBF ) ) + return FALSE; + + nRecordOffset = + psDBF->nRecordLength * (SAOffset) iRecord + psDBF->nHeaderLength; + + if( psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, SEEK_SET ) != 0 ) + { + char szMessage[128]; + snprintf( szMessage, sizeof(szMessage), "fseek(%ld) failed on DBF file.", + (long) nRecordOffset ); + psDBF->sHooks.Error( szMessage ); + return FALSE; + } + + if( psDBF->sHooks.FRead( psDBF->pszCurrentRecord, + psDBF->nRecordLength, 1, psDBF->fp ) != 1 ) + { + char szMessage[128]; + snprintf( szMessage, sizeof(szMessage), "fread(%d) failed on DBF file.", + psDBF->nRecordLength ); + psDBF->sHooks.Error( szMessage ); + return FALSE; + } + + psDBF->nCurrentRecord = iRecord; + } + + return TRUE; +} + +/************************************************************************/ +/* DBFUpdateHeader() */ +/************************************************************************/ + +void SHPAPI_CALL +DBFUpdateHeader( DBFHandle psDBF ) + +{ + unsigned char abyFileHeader[XBASE_FILEHDR_SZ]; + + if( psDBF->bNoHeader ) + DBFWriteHeader( psDBF ); + + if( !DBFFlushRecord( psDBF ) ) + return; + + psDBF->sHooks.FSeek( psDBF->fp, 0, 0 ); + psDBF->sHooks.FRead( abyFileHeader, sizeof(abyFileHeader), 1, psDBF->fp ); + + abyFileHeader[1] = (unsigned char) psDBF->nUpdateYearSince1900; + abyFileHeader[2] = (unsigned char) psDBF->nUpdateMonth; + abyFileHeader[3] = (unsigned char) psDBF->nUpdateDay; + abyFileHeader[4] = (unsigned char) (psDBF->nRecords % 256); + abyFileHeader[5] = (unsigned char) ((psDBF->nRecords/256) % 256); + abyFileHeader[6] = (unsigned char) ((psDBF->nRecords/(256*256)) % 256); + abyFileHeader[7] = (unsigned char) ((psDBF->nRecords/(256*256*256)) % 256); + + psDBF->sHooks.FSeek( psDBF->fp, 0, 0 ); + psDBF->sHooks.FWrite( abyFileHeader, sizeof(abyFileHeader), 1, psDBF->fp ); + + psDBF->sHooks.FFlush( psDBF->fp ); +} + +/************************************************************************/ +/* DBFSetLastModifiedDate() */ +/************************************************************************/ + +void SHPAPI_CALL +DBFSetLastModifiedDate( DBFHandle psDBF, int nYYSince1900, int nMM, int nDD ) +{ + psDBF->nUpdateYearSince1900 = nYYSince1900; + psDBF->nUpdateMonth = nMM; + psDBF->nUpdateDay = nDD; +} + +/************************************************************************/ +/* DBFOpen() */ +/* */ +/* Open a .dbf file. */ +/************************************************************************/ + +DBFHandle SHPAPI_CALL +DBFOpen( const char * pszFilename, const char * pszAccess ) + +{ + SAHooks sHooks; + + SASetupDefaultHooks( &sHooks ); + + return DBFOpenLL( pszFilename, pszAccess, &sHooks ); +} + +/************************************************************************/ +/* DBFOpen() */ +/* */ +/* Open a .dbf file. */ +/************************************************************************/ + +DBFHandle SHPAPI_CALL +DBFOpenLL( const char * pszFilename, const char * pszAccess, SAHooks *psHooks ) + +{ + DBFHandle psDBF; + SAFile pfCPG; + unsigned char *pabyBuf; + int nFields, nHeadLen, iField, i; + char *pszBasename, *pszFullname; + int nBufSize = 500; + size_t nFullnameLen; + +/* -------------------------------------------------------------------- */ +/* We only allow the access strings "rb" and "r+". */ +/* -------------------------------------------------------------------- */ + if( strcmp(pszAccess,"r") != 0 && strcmp(pszAccess,"r+") != 0 + && strcmp(pszAccess,"rb") != 0 && strcmp(pszAccess,"rb+") != 0 + && strcmp(pszAccess,"r+b") != 0 ) + return( NULL ); + + if( strcmp(pszAccess,"r") == 0 ) + pszAccess = "rb"; + + if( strcmp(pszAccess,"r+") == 0 ) + pszAccess = "rb+"; + +/* -------------------------------------------------------------------- */ +/* Compute the base (layer) name. If there is any extension */ +/* on the passed in filename we will strip it off. */ +/* -------------------------------------------------------------------- */ + pszBasename = (char *) malloc(strlen(pszFilename)+5); + strcpy( pszBasename, pszFilename ); + for( i = (int)strlen(pszBasename)-1; + i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' + && pszBasename[i] != '\\'; + i-- ) {} + + if( pszBasename[i] == '.' ) + pszBasename[i] = '\0'; + + nFullnameLen = strlen(pszBasename) + 5; + pszFullname = (char *) malloc(nFullnameLen); + snprintf( pszFullname, nFullnameLen, "%s.dbf", pszBasename ); + + psDBF = (DBFHandle) calloc( 1, sizeof(DBFInfo) ); + psDBF->fp = psHooks->FOpen( pszFullname, pszAccess ); + memcpy( &(psDBF->sHooks), psHooks, sizeof(SAHooks) ); + + if( psDBF->fp == NULL ) + { + snprintf( pszFullname, nFullnameLen, "%s.DBF", pszBasename ); + psDBF->fp = psDBF->sHooks.FOpen(pszFullname, pszAccess ); + } + + snprintf( pszFullname, nFullnameLen, "%s.cpg", pszBasename ); + pfCPG = psHooks->FOpen( pszFullname, "r" ); + if( pfCPG == NULL ) + { + snprintf( pszFullname, nFullnameLen, "%s.CPG", pszBasename ); + pfCPG = psHooks->FOpen( pszFullname, "r" ); + } + + free( pszBasename ); + free( pszFullname ); + + if( psDBF->fp == NULL ) + { + free( psDBF ); + if( pfCPG ) psHooks->FClose( pfCPG ); + return( NULL ); + } + + psDBF->bNoHeader = FALSE; + psDBF->nCurrentRecord = -1; + psDBF->bCurrentRecordModified = FALSE; + +/* -------------------------------------------------------------------- */ +/* Read Table Header info */ +/* -------------------------------------------------------------------- */ + pabyBuf = (unsigned char *) malloc(nBufSize); + if( psDBF->sHooks.FRead( pabyBuf, XBASE_FILEHDR_SZ, 1, psDBF->fp ) != 1 ) + { + psDBF->sHooks.FClose( psDBF->fp ); + if( pfCPG ) psDBF->sHooks.FClose( pfCPG ); + free( pabyBuf ); + free( psDBF ); + return NULL; + } + + DBFSetLastModifiedDate(psDBF, pabyBuf[1], pabyBuf[2], pabyBuf[3]); + + psDBF->nRecords = + pabyBuf[4] + pabyBuf[5]*256 + pabyBuf[6]*256*256 + (pabyBuf[7] & 0x7f) *256*256*256; + + psDBF->nHeaderLength = nHeadLen = pabyBuf[8] + pabyBuf[9]*256; + psDBF->nRecordLength = pabyBuf[10] + pabyBuf[11]*256; + psDBF->iLanguageDriver = pabyBuf[29]; + + if (psDBF->nRecordLength == 0 || nHeadLen < XBASE_FILEHDR_SZ) + { + psDBF->sHooks.FClose( psDBF->fp ); + if( pfCPG ) psDBF->sHooks.FClose( pfCPG ); + free( pabyBuf ); + free( psDBF ); + return NULL; + } + + psDBF->nFields = nFields = (nHeadLen - XBASE_FILEHDR_SZ) / XBASE_FLDHDR_SZ; + + psDBF->pszCurrentRecord = (char *) malloc(psDBF->nRecordLength); + +/* -------------------------------------------------------------------- */ +/* Figure out the code page from the LDID and CPG */ +/* -------------------------------------------------------------------- */ + + psDBF->pszCodePage = NULL; + if( pfCPG ) + { + size_t n; + memset( pabyBuf, 0, nBufSize); + psDBF->sHooks.FRead( pabyBuf, nBufSize - 1, 1, pfCPG ); + n = strcspn( (char *) pabyBuf, "\n\r" ); + if( n > 0 ) + { + pabyBuf[n] = '\0'; + psDBF->pszCodePage = (char *) malloc(n + 1); + memcpy( psDBF->pszCodePage, pabyBuf, n + 1 ); + } + psDBF->sHooks.FClose( pfCPG ); + } + if( psDBF->pszCodePage == NULL && pabyBuf[29] != 0 ) + { + snprintf( (char *) pabyBuf, nBufSize, "LDID/%d", psDBF->iLanguageDriver ); + psDBF->pszCodePage = (char *) malloc(strlen((char*)pabyBuf) + 1); + strcpy( psDBF->pszCodePage, (char *) pabyBuf ); + } + +/* -------------------------------------------------------------------- */ +/* Read in Field Definitions */ +/* -------------------------------------------------------------------- */ + + pabyBuf = (unsigned char *) SfRealloc(pabyBuf,nHeadLen); + psDBF->pszHeader = (char *) pabyBuf; + + psDBF->sHooks.FSeek( psDBF->fp, XBASE_FILEHDR_SZ, 0 ); + if( psDBF->sHooks.FRead( pabyBuf, nHeadLen-XBASE_FILEHDR_SZ, 1, + psDBF->fp ) != 1 ) + { + psDBF->sHooks.FClose( psDBF->fp ); + free( pabyBuf ); + free( psDBF->pszCurrentRecord ); + free( psDBF ); + return NULL; + } + + psDBF->panFieldOffset = (int *) malloc(sizeof(int) * nFields); + psDBF->panFieldSize = (int *) malloc(sizeof(int) * nFields); + psDBF->panFieldDecimals = (int *) malloc(sizeof(int) * nFields); + psDBF->pachFieldType = (char *) malloc(sizeof(char) * nFields); + + for( iField = 0; iField < nFields; iField++ ) + { + unsigned char *pabyFInfo; + + pabyFInfo = pabyBuf+iField*XBASE_FLDHDR_SZ; + + if( pabyFInfo[11] == 'N' || pabyFInfo[11] == 'F' ) + { + psDBF->panFieldSize[iField] = pabyFInfo[16]; + psDBF->panFieldDecimals[iField] = pabyFInfo[17]; + } + else + { + psDBF->panFieldSize[iField] = pabyFInfo[16]; + psDBF->panFieldDecimals[iField] = 0; + +/* +** The following seemed to be used sometimes to handle files with long +** string fields, but in other cases (such as bug 1202) the decimals field +** just seems to indicate some sort of preferred formatting, not very +** wide fields. So I have disabled this code. FrankW. + psDBF->panFieldSize[iField] = pabyFInfo[16] + pabyFInfo[17]*256; + psDBF->panFieldDecimals[iField] = 0; +*/ + } + + psDBF->pachFieldType[iField] = (char) pabyFInfo[11]; + if( iField == 0 ) + psDBF->panFieldOffset[iField] = 1; + else + psDBF->panFieldOffset[iField] = + psDBF->panFieldOffset[iField-1] + psDBF->panFieldSize[iField-1]; + } + + DBFSetWriteEndOfFileChar( psDBF, TRUE ); + + return( psDBF ); +} + +/************************************************************************/ +/* DBFClose() */ +/************************************************************************/ + +void SHPAPI_CALL +DBFClose(DBFHandle psDBF) +{ + if( psDBF == NULL ) + return; + +/* -------------------------------------------------------------------- */ +/* Write out header if not already written. */ +/* -------------------------------------------------------------------- */ + if( psDBF->bNoHeader ) + DBFWriteHeader( psDBF ); + + CPL_IGNORE_RET_VAL_INT(DBFFlushRecord( psDBF )); + +/* -------------------------------------------------------------------- */ +/* Update last access date, and number of records if we have */ +/* write access. */ +/* -------------------------------------------------------------------- */ + if( psDBF->bUpdated ) + DBFUpdateHeader( psDBF ); + +/* -------------------------------------------------------------------- */ +/* Close, and free resources. */ +/* -------------------------------------------------------------------- */ + psDBF->sHooks.FClose( psDBF->fp ); + + if( psDBF->panFieldOffset != NULL ) + { + free( psDBF->panFieldOffset ); + free( psDBF->panFieldSize ); + free( psDBF->panFieldDecimals ); + free( psDBF->pachFieldType ); + } + + if( psDBF->pszWorkField != NULL ) + free( psDBF->pszWorkField ); + + free( psDBF->pszHeader ); + free( psDBF->pszCurrentRecord ); + free( psDBF->pszCodePage ); + + free( psDBF ); +} + +/************************************************************************/ +/* DBFCreate() */ +/* */ +/* Create a new .dbf file with default code page LDID/87 (0x57) */ +/************************************************************************/ + +DBFHandle SHPAPI_CALL +DBFCreate( const char * pszFilename ) + +{ + return DBFCreateEx( pszFilename, "LDID/87" ); // 0x57 +} + +/************************************************************************/ +/* DBFCreateEx() */ +/* */ +/* Create a new .dbf file. */ +/************************************************************************/ + +DBFHandle SHPAPI_CALL +DBFCreateEx( const char * pszFilename, const char* pszCodePage ) + +{ + SAHooks sHooks; + + SASetupDefaultHooks( &sHooks ); + + return DBFCreateLL( pszFilename, pszCodePage , &sHooks ); +} + +/************************************************************************/ +/* DBFCreate() */ +/* */ +/* Create a new .dbf file. */ +/************************************************************************/ + +DBFHandle SHPAPI_CALL +DBFCreateLL( const char * pszFilename, const char * pszCodePage, SAHooks *psHooks ) + +{ + DBFHandle psDBF; + SAFile fp; + char *pszFullname, *pszBasename; + int i, ldid = -1; + char chZero = '\0'; + size_t nFullnameLen; + +/* -------------------------------------------------------------------- */ +/* Compute the base (layer) name. If there is any extension */ +/* on the passed in filename we will strip it off. */ +/* -------------------------------------------------------------------- */ + pszBasename = (char *) malloc(strlen(pszFilename)+5); + strcpy( pszBasename, pszFilename ); + for( i = (int)strlen(pszBasename)-1; + i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' + && pszBasename[i] != '\\'; + i-- ) {} + + if( pszBasename[i] == '.' ) + pszBasename[i] = '\0'; + + nFullnameLen = strlen(pszBasename) + 5; + pszFullname = (char *) malloc(nFullnameLen); + snprintf( pszFullname, nFullnameLen, "%s.dbf", pszBasename ); + +/* -------------------------------------------------------------------- */ +/* Create the file. */ +/* -------------------------------------------------------------------- */ + fp = psHooks->FOpen( pszFullname, "wb" ); + if( fp == NULL ) + { + free( pszBasename ); + free( pszFullname ); + return( NULL ); + } + + psHooks->FWrite( &chZero, 1, 1, fp ); + psHooks->FClose( fp ); + + fp = psHooks->FOpen( pszFullname, "rb+" ); + if( fp == NULL ) + { + free( pszBasename ); + free( pszFullname ); + return( NULL ); + } + + snprintf( pszFullname, nFullnameLen, "%s.cpg", pszBasename ); + if( pszCodePage != NULL ) + { + if( strncmp( pszCodePage, "LDID/", 5 ) == 0 ) + { + ldid = atoi( pszCodePage + 5 ); + if( ldid > 255 ) + ldid = -1; // don't use 0 to indicate out of range as LDID/0 is a valid one + } + if( ldid < 0 ) + { + SAFile fpCPG = psHooks->FOpen( pszFullname, "w" ); + psHooks->FWrite( (char*) pszCodePage, strlen(pszCodePage), 1, fpCPG ); + psHooks->FClose( fpCPG ); + } + } + if( pszCodePage == NULL || ldid >= 0 ) + { + psHooks->Remove( pszFullname ); + } + + free( pszBasename ); + free( pszFullname ); + +/* -------------------------------------------------------------------- */ +/* Create the info structure. */ +/* -------------------------------------------------------------------- */ + psDBF = (DBFHandle) calloc(1,sizeof(DBFInfo)); + + memcpy( &(psDBF->sHooks), psHooks, sizeof(SAHooks) ); + psDBF->fp = fp; + psDBF->nRecords = 0; + psDBF->nFields = 0; + psDBF->nRecordLength = 1; + psDBF->nHeaderLength = XBASE_FILEHDR_SZ + 1; /* + 1 for HEADER_RECORD_TERMINATOR */ + + psDBF->panFieldOffset = NULL; + psDBF->panFieldSize = NULL; + psDBF->panFieldDecimals = NULL; + psDBF->pachFieldType = NULL; + psDBF->pszHeader = NULL; + + psDBF->nCurrentRecord = -1; + psDBF->bCurrentRecordModified = FALSE; + psDBF->pszCurrentRecord = NULL; + + psDBF->bNoHeader = TRUE; + + psDBF->iLanguageDriver = ldid > 0 ? ldid : 0; + psDBF->pszCodePage = NULL; + if( pszCodePage ) + { + psDBF->pszCodePage = (char * ) malloc( strlen(pszCodePage) + 1 ); + strcpy( psDBF->pszCodePage, pszCodePage ); + } + DBFSetLastModifiedDate(psDBF, 95, 7, 26); /* dummy date */ + + DBFSetWriteEndOfFileChar(psDBF, TRUE); + + return( psDBF ); +} + +/************************************************************************/ +/* DBFAddField() */ +/* */ +/* Add a field to a newly created .dbf or to an existing one */ +/************************************************************************/ + +int SHPAPI_CALL +DBFAddField(DBFHandle psDBF, const char * pszFieldName, + DBFFieldType eType, int nWidth, int nDecimals ) + +{ + char chNativeType = 'C'; + + if( eType == FTLogical ) + chNativeType = 'L'; + else if( eType == FTString ) + chNativeType = 'C'; + else + chNativeType = 'N'; + + return DBFAddNativeFieldType( psDBF, pszFieldName, chNativeType, + nWidth, nDecimals ); +} + +/************************************************************************/ +/* DBFGetNullCharacter() */ +/************************************************************************/ + +static char DBFGetNullCharacter(char chType) +{ + switch (chType) + { + case 'N': + case 'F': + return '*'; + case 'D': + return '0'; + case 'L': + return '?'; + default: + return ' '; + } +} + +/************************************************************************/ +/* DBFAddField() */ +/* */ +/* Add a field to a newly created .dbf file before any records */ +/* are written. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFAddNativeFieldType(DBFHandle psDBF, const char * pszFieldName, + char chType, int nWidth, int nDecimals ) + +{ + char *pszFInfo; + int i; + int nOldRecordLength, nOldHeaderLength; + char *pszRecord; + char chFieldFill; + SAOffset nRecordOffset; + + /* make sure that everything is written in .dbf */ + if( !DBFFlushRecord( psDBF ) ) + return -1; + + if( psDBF->nHeaderLength + XBASE_FLDHDR_SZ > 65535 ) + { + char szMessage[128]; + snprintf( szMessage, sizeof(szMessage), + "Cannot add field %s. Header length limit reached " + "(max 65535 bytes, 2046 fields).", + pszFieldName ); + psDBF->sHooks.Error( szMessage ); + return -1; + } + +/* -------------------------------------------------------------------- */ +/* Do some checking to ensure we can add records to this file. */ +/* -------------------------------------------------------------------- */ + if( nWidth < 1 ) + return -1; + + if( nWidth > XBASE_FLD_MAX_WIDTH ) + nWidth = XBASE_FLD_MAX_WIDTH; + + if( psDBF->nRecordLength + nWidth > 65535 ) + { + char szMessage[128]; + snprintf( szMessage, sizeof(szMessage), + "Cannot add field %s. Record length limit reached " + "(max 65535 bytes).", + pszFieldName ); + psDBF->sHooks.Error( szMessage ); + return -1; + } + + nOldRecordLength = psDBF->nRecordLength; + nOldHeaderLength = psDBF->nHeaderLength; + +/* -------------------------------------------------------------------- */ +/* SfRealloc all the arrays larger to hold the additional field */ +/* information. */ +/* -------------------------------------------------------------------- */ + psDBF->nFields++; + + psDBF->panFieldOffset = (int *) + SfRealloc( psDBF->panFieldOffset, sizeof(int) * psDBF->nFields ); + + psDBF->panFieldSize = (int *) + SfRealloc( psDBF->panFieldSize, sizeof(int) * psDBF->nFields ); + + psDBF->panFieldDecimals = (int *) + SfRealloc( psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields ); + + psDBF->pachFieldType = (char *) + SfRealloc( psDBF->pachFieldType, sizeof(char) * psDBF->nFields ); + +/* -------------------------------------------------------------------- */ +/* Assign the new field information fields. */ +/* -------------------------------------------------------------------- */ + psDBF->panFieldOffset[psDBF->nFields-1] = psDBF->nRecordLength; + psDBF->nRecordLength += nWidth; + psDBF->panFieldSize[psDBF->nFields-1] = nWidth; + psDBF->panFieldDecimals[psDBF->nFields-1] = nDecimals; + psDBF->pachFieldType[psDBF->nFields-1] = chType; + +/* -------------------------------------------------------------------- */ +/* Extend the required header information. */ +/* -------------------------------------------------------------------- */ + psDBF->nHeaderLength += XBASE_FLDHDR_SZ; + psDBF->bUpdated = FALSE; + + psDBF->pszHeader = (char *) SfRealloc(psDBF->pszHeader, + psDBF->nFields*XBASE_FLDHDR_SZ); + + pszFInfo = psDBF->pszHeader + XBASE_FLDHDR_SZ * (psDBF->nFields-1); + + for( i = 0; i < XBASE_FLDHDR_SZ; i++ ) + pszFInfo[i] = '\0'; + + strncpy( pszFInfo, pszFieldName, XBASE_FLDNAME_LEN_WRITE ); + + pszFInfo[11] = psDBF->pachFieldType[psDBF->nFields-1]; + + if( chType == 'C' ) + { + pszFInfo[16] = (unsigned char) (nWidth % 256); + pszFInfo[17] = (unsigned char) (nWidth / 256); + } + else + { + pszFInfo[16] = (unsigned char) nWidth; + pszFInfo[17] = (unsigned char) nDecimals; + } + +/* -------------------------------------------------------------------- */ +/* Make the current record buffer appropriately larger. */ +/* -------------------------------------------------------------------- */ + psDBF->pszCurrentRecord = (char *) SfRealloc(psDBF->pszCurrentRecord, + psDBF->nRecordLength); + + /* we're done if dealing with new .dbf */ + if( psDBF->bNoHeader ) + return( psDBF->nFields - 1 ); + +/* -------------------------------------------------------------------- */ +/* For existing .dbf file, shift records */ +/* -------------------------------------------------------------------- */ + + /* alloc record */ + pszRecord = (char *) malloc(sizeof(char) * psDBF->nRecordLength); + + chFieldFill = DBFGetNullCharacter(chType); + + for (i = psDBF->nRecords-1; i >= 0; --i) + { + nRecordOffset = nOldRecordLength * (SAOffset) i + nOldHeaderLength; + + /* load record */ + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FRead( pszRecord, nOldRecordLength, 1, psDBF->fp ); + + /* set new field's value to NULL */ + memset(pszRecord + nOldRecordLength, chFieldFill, nWidth); + + nRecordOffset = psDBF->nRecordLength * (SAOffset) i + psDBF->nHeaderLength; + + /* move record to the new place*/ + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FWrite( pszRecord, psDBF->nRecordLength, 1, psDBF->fp ); + } + + if( psDBF->bWriteEndOfFileChar ) + { + char ch = END_OF_FILE_CHARACTER; + + nRecordOffset = + psDBF->nRecordLength * (SAOffset) psDBF->nRecords + psDBF->nHeaderLength; + + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FWrite( &ch, 1, 1, psDBF->fp ); + } + + /* free record */ + free(pszRecord); + + /* force update of header with new header, record length and new field */ + psDBF->bNoHeader = TRUE; + DBFUpdateHeader( psDBF ); + + psDBF->nCurrentRecord = -1; + psDBF->bCurrentRecordModified = FALSE; + psDBF->bUpdated = TRUE; + + return( psDBF->nFields-1 ); +} + +/************************************************************************/ +/* DBFReadAttribute() */ +/* */ +/* Read one of the attribute fields of a record. */ +/************************************************************************/ + +static void *DBFReadAttribute(DBFHandle psDBF, int hEntity, int iField, + char chReqType ) + +{ + unsigned char *pabyRec; + void *pReturnField = NULL; + +/* -------------------------------------------------------------------- */ +/* Verify selection. */ +/* -------------------------------------------------------------------- */ + if( hEntity < 0 || hEntity >= psDBF->nRecords ) + return( NULL ); + + if( iField < 0 || iField >= psDBF->nFields ) + return( NULL ); + +/* -------------------------------------------------------------------- */ +/* Have we read the record? */ +/* -------------------------------------------------------------------- */ + if( !DBFLoadRecord( psDBF, hEntity ) ) + return NULL; + + pabyRec = (unsigned char *) psDBF->pszCurrentRecord; + +/* -------------------------------------------------------------------- */ +/* Ensure we have room to extract the target field. */ +/* -------------------------------------------------------------------- */ + if( psDBF->panFieldSize[iField] >= psDBF->nWorkFieldLength ) + { + psDBF->nWorkFieldLength = psDBF->panFieldSize[iField] + 100; + if( psDBF->pszWorkField == NULL ) + psDBF->pszWorkField = (char *) malloc(psDBF->nWorkFieldLength); + else + psDBF->pszWorkField = (char *) realloc(psDBF->pszWorkField, + psDBF->nWorkFieldLength); + } + +/* -------------------------------------------------------------------- */ +/* Extract the requested field. */ +/* -------------------------------------------------------------------- */ + memcpy( psDBF->pszWorkField, + ((const char *) pabyRec) + psDBF->panFieldOffset[iField], + psDBF->panFieldSize[iField] ); + psDBF->pszWorkField[psDBF->panFieldSize[iField]] = '\0'; + + pReturnField = psDBF->pszWorkField; + +/* -------------------------------------------------------------------- */ +/* Decode the field. */ +/* -------------------------------------------------------------------- */ + if( chReqType == 'I' ) + { + psDBF->fieldValue.nIntField = atoi(psDBF->pszWorkField); + + pReturnField = &(psDBF->fieldValue.nIntField); + } + else if( chReqType == 'N' ) + { + psDBF->fieldValue.dfDoubleField = psDBF->sHooks.Atof(psDBF->pszWorkField); + + pReturnField = &(psDBF->fieldValue.dfDoubleField); + } + +/* -------------------------------------------------------------------- */ +/* Should we trim white space off the string attribute value? */ +/* -------------------------------------------------------------------- */ +#ifdef TRIM_DBF_WHITESPACE + else + { + char *pchSrc, *pchDst; + + pchDst = pchSrc = psDBF->pszWorkField; + while( *pchSrc == ' ' ) + pchSrc++; + + while( *pchSrc != '\0' ) + *(pchDst++) = *(pchSrc++); + *pchDst = '\0'; + + while( pchDst != psDBF->pszWorkField && *(--pchDst) == ' ' ) + *pchDst = '\0'; + } +#endif + + return( pReturnField ); +} + +/************************************************************************/ +/* DBFReadIntAttribute() */ +/* */ +/* Read an integer attribute. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFReadIntegerAttribute( DBFHandle psDBF, int iRecord, int iField ) + +{ + int *pnValue; + + pnValue = (int *) DBFReadAttribute( psDBF, iRecord, iField, 'I' ); + + if( pnValue == NULL ) + return 0; + else + return( *pnValue ); +} + +/************************************************************************/ +/* DBFReadDoubleAttribute() */ +/* */ +/* Read a double attribute. */ +/************************************************************************/ + +double SHPAPI_CALL +DBFReadDoubleAttribute( DBFHandle psDBF, int iRecord, int iField ) + +{ + double *pdValue; + + pdValue = (double *) DBFReadAttribute( psDBF, iRecord, iField, 'N' ); + + if( pdValue == NULL ) + return 0.0; + else + return( *pdValue ); +} + +/************************************************************************/ +/* DBFReadStringAttribute() */ +/* */ +/* Read a string attribute. */ +/************************************************************************/ + +const char SHPAPI_CALL1(*) +DBFReadStringAttribute( DBFHandle psDBF, int iRecord, int iField ) + +{ + return( (const char *) DBFReadAttribute( psDBF, iRecord, iField, 'C' ) ); +} + +/************************************************************************/ +/* DBFReadLogicalAttribute() */ +/* */ +/* Read a logical attribute. */ +/************************************************************************/ + +const char SHPAPI_CALL1(*) +DBFReadLogicalAttribute( DBFHandle psDBF, int iRecord, int iField ) + +{ + return( (const char *) DBFReadAttribute( psDBF, iRecord, iField, 'L' ) ); +} + + +/************************************************************************/ +/* DBFIsValueNULL() */ +/* */ +/* Return TRUE if the passed string is NULL. */ +/************************************************************************/ + +static int DBFIsValueNULL( char chType, const char* pszValue ) +{ + int i; + + if( pszValue == NULL ) + return TRUE; + + switch(chType) + { + case 'N': + case 'F': + /* + ** We accept all asterisks or all blanks as NULL + ** though according to the spec I think it should be all + ** asterisks. + */ + if( pszValue[0] == '*' ) + return TRUE; + + for( i = 0; pszValue[i] != '\0'; i++ ) + { + if( pszValue[i] != ' ' ) + return FALSE; + } + return TRUE; + + case 'D': + /* NULL date fields have value "00000000" */ + return strncmp(pszValue,"00000000",8) == 0; + + case 'L': + /* NULL boolean fields have value "?" */ + return pszValue[0] == '?'; + + default: + /* empty string fields are considered NULL */ + return strlen(pszValue) == 0; + } +} + +/************************************************************************/ +/* DBFIsAttributeNULL() */ +/* */ +/* Return TRUE if value for field is NULL. */ +/* */ +/* Contributed by Jim Matthews. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFIsAttributeNULL( DBFHandle psDBF, int iRecord, int iField ) + +{ + const char *pszValue; + + pszValue = DBFReadStringAttribute( psDBF, iRecord, iField ); + + if( pszValue == NULL ) + return TRUE; + + return DBFIsValueNULL( psDBF->pachFieldType[iField], pszValue ); +} + +/************************************************************************/ +/* DBFGetFieldCount() */ +/* */ +/* Return the number of fields in this table. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFGetFieldCount( DBFHandle psDBF ) + +{ + return( psDBF->nFields ); +} + +/************************************************************************/ +/* DBFGetRecordCount() */ +/* */ +/* Return the number of records in this table. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFGetRecordCount( DBFHandle psDBF ) + +{ + return( psDBF->nRecords ); +} + +/************************************************************************/ +/* DBFGetFieldInfo() */ +/* */ +/* Return any requested information about the field. */ +/* pszFieldName must be at least XBASE_FLDNAME_LEN_READ+1 (=12) */ +/* bytes long. */ +/************************************************************************/ + +DBFFieldType SHPAPI_CALL +DBFGetFieldInfo( DBFHandle psDBF, int iField, char * pszFieldName, + int * pnWidth, int * pnDecimals ) + +{ + if( iField < 0 || iField >= psDBF->nFields ) + return( FTInvalid ); + + if( pnWidth != NULL ) + *pnWidth = psDBF->panFieldSize[iField]; + + if( pnDecimals != NULL ) + *pnDecimals = psDBF->panFieldDecimals[iField]; + + if( pszFieldName != NULL ) + { + int i; + + strncpy( pszFieldName, (char *) psDBF->pszHeader+iField*XBASE_FLDHDR_SZ, + XBASE_FLDNAME_LEN_READ ); + pszFieldName[XBASE_FLDNAME_LEN_READ] = '\0'; + for( i = XBASE_FLDNAME_LEN_READ - 1; i > 0 && pszFieldName[i] == ' '; i-- ) + pszFieldName[i] = '\0'; + } + + if ( psDBF->pachFieldType[iField] == 'L' ) + return( FTLogical); + + else if( psDBF->pachFieldType[iField] == 'N' + || psDBF->pachFieldType[iField] == 'F' ) + { + if( psDBF->panFieldDecimals[iField] > 0 + || psDBF->panFieldSize[iField] >= 10 ) + return( FTDouble ); + else + return( FTInteger ); + } + else + { + return( FTString ); + } +} + +/************************************************************************/ +/* DBFWriteAttribute() */ +/* */ +/* Write an attribute record to the file. */ +/************************************************************************/ + +static int DBFWriteAttribute(DBFHandle psDBF, int hEntity, int iField, + void * pValue ) + +{ + int i, j, nRetResult = TRUE; + unsigned char *pabyRec; + char szSField[XBASE_FLD_MAX_WIDTH+1], szFormat[20]; + +/* -------------------------------------------------------------------- */ +/* Is this a valid record? */ +/* -------------------------------------------------------------------- */ + if( hEntity < 0 || hEntity > psDBF->nRecords ) + return( FALSE ); + + if( psDBF->bNoHeader ) + DBFWriteHeader(psDBF); + +/* -------------------------------------------------------------------- */ +/* Is this a brand new record? */ +/* -------------------------------------------------------------------- */ + if( hEntity == psDBF->nRecords ) + { + if( !DBFFlushRecord( psDBF ) ) + return FALSE; + + psDBF->nRecords++; + for( i = 0; i < psDBF->nRecordLength; i++ ) + psDBF->pszCurrentRecord[i] = ' '; + + psDBF->nCurrentRecord = hEntity; + } + +/* -------------------------------------------------------------------- */ +/* Is this an existing record, but different than the last one */ +/* we accessed? */ +/* -------------------------------------------------------------------- */ + if( !DBFLoadRecord( psDBF, hEntity ) ) + return FALSE; + + pabyRec = (unsigned char *) psDBF->pszCurrentRecord; + + psDBF->bCurrentRecordModified = TRUE; + psDBF->bUpdated = TRUE; + +/* -------------------------------------------------------------------- */ +/* Translate NULL value to valid DBF file representation. */ +/* */ +/* Contributed by Jim Matthews. */ +/* -------------------------------------------------------------------- */ + if( pValue == NULL ) + { + memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), + DBFGetNullCharacter(psDBF->pachFieldType[iField]), + psDBF->panFieldSize[iField] ); + return TRUE; + } + +/* -------------------------------------------------------------------- */ +/* Assign all the record fields. */ +/* -------------------------------------------------------------------- */ + switch( psDBF->pachFieldType[iField] ) + { + case 'D': + case 'N': + case 'F': + { + int nWidth = psDBF->panFieldSize[iField]; + + if( (int) sizeof(szSField)-2 < nWidth ) + nWidth = sizeof(szSField)-2; + + snprintf( szFormat, sizeof(szFormat), "%%%d.%df", + nWidth, psDBF->panFieldDecimals[iField] ); + CPLsnprintf(szSField, sizeof(szSField), szFormat, *((double *) pValue) ); + if( (int) strlen(szSField) > psDBF->panFieldSize[iField] ) + { + szSField[psDBF->panFieldSize[iField]] = '\0'; + nRetResult = FALSE; + } + strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]), + szSField, strlen(szSField) ); + break; + } + + case 'L': + if (psDBF->panFieldSize[iField] >= 1 && + (*(char*)pValue == 'F' || *(char*)pValue == 'T')) + *(pabyRec+psDBF->panFieldOffset[iField]) = *(char*)pValue; + break; + + default: + if( (int) strlen((char *) pValue) > psDBF->panFieldSize[iField] ) + { + j = psDBF->panFieldSize[iField]; + nRetResult = FALSE; + } + else + { + memset( pabyRec+psDBF->panFieldOffset[iField], ' ', + psDBF->panFieldSize[iField] ); + j = (int)strlen((char *) pValue); + } + + strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]), + (char *) pValue, j ); + break; + } + + return( nRetResult ); +} + +/************************************************************************/ +/* DBFWriteAttributeDirectly() */ +/* */ +/* Write an attribute record to the file, but without any */ +/* reformatting based on type. The provided buffer is written */ +/* as is to the field position in the record. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, int iField, + void * pValue ) + +{ + int i, j; + unsigned char *pabyRec; + +/* -------------------------------------------------------------------- */ +/* Is this a valid record? */ +/* -------------------------------------------------------------------- */ + if( hEntity < 0 || hEntity > psDBF->nRecords ) + return( FALSE ); + + if( psDBF->bNoHeader ) + DBFWriteHeader(psDBF); + +/* -------------------------------------------------------------------- */ +/* Is this a brand new record? */ +/* -------------------------------------------------------------------- */ + if( hEntity == psDBF->nRecords ) + { + if( !DBFFlushRecord( psDBF ) ) + return FALSE; + + psDBF->nRecords++; + for( i = 0; i < psDBF->nRecordLength; i++ ) + psDBF->pszCurrentRecord[i] = ' '; + + psDBF->nCurrentRecord = hEntity; + } + +/* -------------------------------------------------------------------- */ +/* Is this an existing record, but different than the last one */ +/* we accessed? */ +/* -------------------------------------------------------------------- */ + if( !DBFLoadRecord( psDBF, hEntity ) ) + return FALSE; + + pabyRec = (unsigned char *) psDBF->pszCurrentRecord; + +/* -------------------------------------------------------------------- */ +/* Assign all the record fields. */ +/* -------------------------------------------------------------------- */ + if( (int)strlen((char *) pValue) > psDBF->panFieldSize[iField] ) + j = psDBF->panFieldSize[iField]; + else + { + memset( pabyRec+psDBF->panFieldOffset[iField], ' ', + psDBF->panFieldSize[iField] ); + j = (int)strlen((char *) pValue); + } + + strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]), + (char *) pValue, j ); + + psDBF->bCurrentRecordModified = TRUE; + psDBF->bUpdated = TRUE; + + return( TRUE ); +} + +/************************************************************************/ +/* DBFWriteDoubleAttribute() */ +/* */ +/* Write a double attribute. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFWriteDoubleAttribute( DBFHandle psDBF, int iRecord, int iField, + double dValue ) + +{ + return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) &dValue ) ); +} + +/************************************************************************/ +/* DBFWriteIntegerAttribute() */ +/* */ +/* Write a integer attribute. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFWriteIntegerAttribute( DBFHandle psDBF, int iRecord, int iField, + int nValue ) + +{ + double dValue = nValue; + + return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) &dValue ) ); +} + +/************************************************************************/ +/* DBFWriteStringAttribute() */ +/* */ +/* Write a string attribute. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFWriteStringAttribute( DBFHandle psDBF, int iRecord, int iField, + const char * pszValue ) + +{ + return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) pszValue ) ); +} + +/************************************************************************/ +/* DBFWriteNULLAttribute() */ +/* */ +/* Write a string attribute. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFWriteNULLAttribute( DBFHandle psDBF, int iRecord, int iField ) + +{ + return( DBFWriteAttribute( psDBF, iRecord, iField, NULL ) ); +} + +/************************************************************************/ +/* DBFWriteLogicalAttribute() */ +/* */ +/* Write a logical attribute. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFWriteLogicalAttribute( DBFHandle psDBF, int iRecord, int iField, + const char lValue) + +{ + return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) (&lValue) ) ); +} + +/************************************************************************/ +/* DBFWriteTuple() */ +/* */ +/* Write an attribute record to the file. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFWriteTuple(DBFHandle psDBF, int hEntity, void * pRawTuple ) + +{ + int i; + unsigned char *pabyRec; + +/* -------------------------------------------------------------------- */ +/* Is this a valid record? */ +/* -------------------------------------------------------------------- */ + if( hEntity < 0 || hEntity > psDBF->nRecords ) + return( FALSE ); + + if( psDBF->bNoHeader ) + DBFWriteHeader(psDBF); + +/* -------------------------------------------------------------------- */ +/* Is this a brand new record? */ +/* -------------------------------------------------------------------- */ + if( hEntity == psDBF->nRecords ) + { + if( !DBFFlushRecord( psDBF ) ) + return FALSE; + + psDBF->nRecords++; + for( i = 0; i < psDBF->nRecordLength; i++ ) + psDBF->pszCurrentRecord[i] = ' '; + + psDBF->nCurrentRecord = hEntity; + } + +/* -------------------------------------------------------------------- */ +/* Is this an existing record, but different than the last one */ +/* we accessed? */ +/* -------------------------------------------------------------------- */ + if( !DBFLoadRecord( psDBF, hEntity ) ) + return FALSE; + + pabyRec = (unsigned char *) psDBF->pszCurrentRecord; + + memcpy ( pabyRec, pRawTuple, psDBF->nRecordLength ); + + psDBF->bCurrentRecordModified = TRUE; + psDBF->bUpdated = TRUE; + + return( TRUE ); +} + +/************************************************************************/ +/* DBFReadTuple() */ +/* */ +/* Read a complete record. Note that the result is only valid */ +/* till the next record read for any reason. */ +/************************************************************************/ + +const char SHPAPI_CALL1(*) +DBFReadTuple(DBFHandle psDBF, int hEntity ) + +{ + if( hEntity < 0 || hEntity >= psDBF->nRecords ) + return( NULL ); + + if( !DBFLoadRecord( psDBF, hEntity ) ) + return NULL; + + return (const char *) psDBF->pszCurrentRecord; +} + +/************************************************************************/ +/* DBFCloneEmpty() */ +/* */ +/* Read one of the attribute fields of a record. */ +/************************************************************************/ + +DBFHandle SHPAPI_CALL +DBFCloneEmpty(DBFHandle psDBF, const char * pszFilename ) +{ + DBFHandle newDBF; + + newDBF = DBFCreateEx ( pszFilename, psDBF->pszCodePage ); + if ( newDBF == NULL ) return ( NULL ); + + newDBF->nFields = psDBF->nFields; + newDBF->nRecordLength = psDBF->nRecordLength; + newDBF->nHeaderLength = psDBF->nHeaderLength; + + if( psDBF->pszHeader ) + { + newDBF->pszHeader = (char *) malloc ( XBASE_FLDHDR_SZ * psDBF->nFields ); + memcpy ( newDBF->pszHeader, psDBF->pszHeader, XBASE_FLDHDR_SZ * psDBF->nFields ); + } + + newDBF->panFieldOffset = (int *) malloc ( sizeof(int) * psDBF->nFields ); + memcpy ( newDBF->panFieldOffset, psDBF->panFieldOffset, sizeof(int) * psDBF->nFields ); + newDBF->panFieldSize = (int *) malloc ( sizeof(int) * psDBF->nFields ); + memcpy ( newDBF->panFieldSize, psDBF->panFieldSize, sizeof(int) * psDBF->nFields ); + newDBF->panFieldDecimals = (int *) malloc ( sizeof(int) * psDBF->nFields ); + memcpy ( newDBF->panFieldDecimals, psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields ); + newDBF->pachFieldType = (char *) malloc ( sizeof(char) * psDBF->nFields ); + memcpy ( newDBF->pachFieldType, psDBF->pachFieldType, sizeof(char)*psDBF->nFields ); + + newDBF->bNoHeader = TRUE; + newDBF->bUpdated = TRUE; + newDBF->bWriteEndOfFileChar = psDBF->bWriteEndOfFileChar; + + DBFWriteHeader ( newDBF ); + DBFClose ( newDBF ); + + newDBF = DBFOpen ( pszFilename, "rb+" ); + newDBF->bWriteEndOfFileChar = psDBF->bWriteEndOfFileChar; + + return ( newDBF ); +} + +/************************************************************************/ +/* DBFGetNativeFieldType() */ +/* */ +/* Return the DBase field type for the specified field. */ +/* */ +/* Value can be one of: 'C' (String), 'D' (Date), 'F' (Float), */ +/* 'N' (Numeric, with or without decimal), */ +/* 'L' (Logical), */ +/* 'M' (Memo: 10 digits .DBT block ptr) */ +/************************************************************************/ + +char SHPAPI_CALL +DBFGetNativeFieldType( DBFHandle psDBF, int iField ) + +{ + if( iField >=0 && iField < psDBF->nFields ) + return psDBF->pachFieldType[iField]; + + return ' '; +} + +/************************************************************************/ +/* str_to_upper() */ +/************************************************************************/ + +static void str_to_upper (char *string) +{ + int len; + int i = -1; + + len = (int)strlen (string); + + while (++i < len) + if (isalpha(string[i]) && islower(string[i])) + string[i] = (char) toupper ((int)string[i]); +} + +/************************************************************************/ +/* DBFGetFieldIndex() */ +/* */ +/* Get the index number for a field in a .dbf file. */ +/* */ +/* Contributed by Jim Matthews. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFGetFieldIndex(DBFHandle psDBF, const char *pszFieldName) + +{ + char name[XBASE_FLDNAME_LEN_READ+1], + name1[XBASE_FLDNAME_LEN_READ+1], + name2[XBASE_FLDNAME_LEN_READ+1]; + int i; + + strncpy(name1, pszFieldName,XBASE_FLDNAME_LEN_READ); + name1[XBASE_FLDNAME_LEN_READ] = '\0'; + str_to_upper(name1); + + for( i = 0; i < DBFGetFieldCount(psDBF); i++ ) + { + DBFGetFieldInfo( psDBF, i, name, NULL, NULL ); + strncpy(name2,name,XBASE_FLDNAME_LEN_READ); + name2[XBASE_FLDNAME_LEN_READ] = '\0'; + str_to_upper(name2); + + if(!strcmp(name1,name2)) + return(i); + } + return(-1); +} + +/************************************************************************/ +/* DBFIsRecordDeleted() */ +/* */ +/* Returns TRUE if the indicated record is deleted, otherwise */ +/* it returns FALSE. */ +/************************************************************************/ + +int SHPAPI_CALL DBFIsRecordDeleted( DBFHandle psDBF, int iShape ) + +{ +/* -------------------------------------------------------------------- */ +/* Verify selection. */ +/* -------------------------------------------------------------------- */ + if( iShape < 0 || iShape >= psDBF->nRecords ) + return TRUE; + +/* -------------------------------------------------------------------- */ +/* Have we read the record? */ +/* -------------------------------------------------------------------- */ + if( !DBFLoadRecord( psDBF, iShape ) ) + return FALSE; + +/* -------------------------------------------------------------------- */ +/* '*' means deleted. */ +/* -------------------------------------------------------------------- */ + return psDBF->pszCurrentRecord[0] == '*'; +} + +/************************************************************************/ +/* DBFMarkRecordDeleted() */ +/************************************************************************/ + +int SHPAPI_CALL DBFMarkRecordDeleted( DBFHandle psDBF, int iShape, + int bIsDeleted ) + +{ + char chNewFlag; + +/* -------------------------------------------------------------------- */ +/* Verify selection. */ +/* -------------------------------------------------------------------- */ + if( iShape < 0 || iShape >= psDBF->nRecords ) + return FALSE; + +/* -------------------------------------------------------------------- */ +/* Is this an existing record, but different than the last one */ +/* we accessed? */ +/* -------------------------------------------------------------------- */ + if( !DBFLoadRecord( psDBF, iShape ) ) + return FALSE; + +/* -------------------------------------------------------------------- */ +/* Assign value, marking record as dirty if it changes. */ +/* -------------------------------------------------------------------- */ + if( bIsDeleted ) + chNewFlag = '*'; + else + chNewFlag = ' '; + + if( psDBF->pszCurrentRecord[0] != chNewFlag ) + { + psDBF->bCurrentRecordModified = TRUE; + psDBF->bUpdated = TRUE; + psDBF->pszCurrentRecord[0] = chNewFlag; + } + + return TRUE; +} + +/************************************************************************/ +/* DBFGetCodePage */ +/************************************************************************/ + +const char SHPAPI_CALL1(*) +DBFGetCodePage(DBFHandle psDBF ) +{ + if( psDBF == NULL ) + return NULL; + return psDBF->pszCodePage; +} + +/************************************************************************/ +/* DBFDeleteField() */ +/* */ +/* Remove a field from a .dbf file */ +/************************************************************************/ + +int SHPAPI_CALL +DBFDeleteField(DBFHandle psDBF, int iField) +{ + int nOldRecordLength, nOldHeaderLength; + int nDeletedFieldOffset, nDeletedFieldSize; + SAOffset nRecordOffset; + char* pszRecord; + int i, iRecord; + + if (iField < 0 || iField >= psDBF->nFields) + return FALSE; + + /* make sure that everything is written in .dbf */ + if( !DBFFlushRecord( psDBF ) ) + return FALSE; + + /* get information about field to be deleted */ + nOldRecordLength = psDBF->nRecordLength; + nOldHeaderLength = psDBF->nHeaderLength; + nDeletedFieldOffset = psDBF->panFieldOffset[iField]; + nDeletedFieldSize = psDBF->panFieldSize[iField]; + + /* update fields info */ + for (i = iField + 1; i < psDBF->nFields; i++) + { + psDBF->panFieldOffset[i-1] = psDBF->panFieldOffset[i] - nDeletedFieldSize; + psDBF->panFieldSize[i-1] = psDBF->panFieldSize[i]; + psDBF->panFieldDecimals[i-1] = psDBF->panFieldDecimals[i]; + psDBF->pachFieldType[i-1] = psDBF->pachFieldType[i]; + } + + /* resize fields arrays */ + psDBF->nFields--; + + psDBF->panFieldOffset = (int *) + SfRealloc( psDBF->panFieldOffset, sizeof(int) * psDBF->nFields ); + + psDBF->panFieldSize = (int *) + SfRealloc( psDBF->panFieldSize, sizeof(int) * psDBF->nFields ); + + psDBF->panFieldDecimals = (int *) + SfRealloc( psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields ); + + psDBF->pachFieldType = (char *) + SfRealloc( psDBF->pachFieldType, sizeof(char) * psDBF->nFields ); + + /* update header information */ + psDBF->nHeaderLength -= XBASE_FLDHDR_SZ; + psDBF->nRecordLength -= nDeletedFieldSize; + + /* overwrite field information in header */ + memmove(psDBF->pszHeader + iField*XBASE_FLDHDR_SZ, + psDBF->pszHeader + (iField+1)*XBASE_FLDHDR_SZ, + sizeof(char) * (psDBF->nFields - iField)*XBASE_FLDHDR_SZ); + + psDBF->pszHeader = (char *) SfRealloc(psDBF->pszHeader, + psDBF->nFields*XBASE_FLDHDR_SZ); + + /* update size of current record appropriately */ + psDBF->pszCurrentRecord = (char *) SfRealloc(psDBF->pszCurrentRecord, + psDBF->nRecordLength); + + /* we're done if we're dealing with not yet created .dbf */ + if ( psDBF->bNoHeader && psDBF->nRecords == 0 ) + return TRUE; + + /* force update of header with new header and record length */ + psDBF->bNoHeader = TRUE; + DBFUpdateHeader( psDBF ); + + /* alloc record */ + pszRecord = (char *) malloc(sizeof(char) * nOldRecordLength); + + /* shift records to their new positions */ + for (iRecord = 0; iRecord < psDBF->nRecords; iRecord++) + { + nRecordOffset = + nOldRecordLength * (SAOffset) iRecord + nOldHeaderLength; + + /* load record */ + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FRead( pszRecord, nOldRecordLength, 1, psDBF->fp ); + + nRecordOffset = + psDBF->nRecordLength * (SAOffset) iRecord + psDBF->nHeaderLength; + + /* move record in two steps */ + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FWrite( pszRecord, nDeletedFieldOffset, 1, psDBF->fp ); + psDBF->sHooks.FWrite( pszRecord + nDeletedFieldOffset + nDeletedFieldSize, + nOldRecordLength - nDeletedFieldOffset - nDeletedFieldSize, + 1, psDBF->fp ); + + } + + if( psDBF->bWriteEndOfFileChar ) + { + char ch = END_OF_FILE_CHARACTER; + psDBF->sHooks.FWrite( &ch, 1, 1, psDBF->fp ); + } + + /* TODO: truncate file */ + + /* free record */ + free(pszRecord); + + psDBF->nCurrentRecord = -1; + psDBF->bCurrentRecordModified = FALSE; + psDBF->bUpdated = TRUE; + + return TRUE; +} + +/************************************************************************/ +/* DBFReorderFields() */ +/* */ +/* Reorder the fields of a .dbf file */ +/* */ +/* panMap must be exactly psDBF->nFields long and be a permutation */ +/* of [0, psDBF->nFields-1]. This assumption will not be asserted in the*/ +/* code of DBFReorderFields. */ +/************************************************************************/ + +int SHPAPI_CALL +DBFReorderFields( DBFHandle psDBF, int* panMap ) +{ + SAOffset nRecordOffset; + int i, iRecord; + int *panFieldOffsetNew; + int *panFieldSizeNew; + int *panFieldDecimalsNew; + char *pachFieldTypeNew; + char *pszHeaderNew; + char *pszRecord; + char *pszRecordNew; + + if ( psDBF->nFields == 0 ) + return TRUE; + + /* make sure that everything is written in .dbf */ + if( !DBFFlushRecord( psDBF ) ) + return FALSE; + + /* a simple malloc() would be enough, but calloc() helps clang static analyzer */ + panFieldOffsetNew = (int *) calloc(sizeof(int), psDBF->nFields); + panFieldSizeNew = (int *) calloc(sizeof(int), psDBF->nFields); + panFieldDecimalsNew = (int *) calloc(sizeof(int), psDBF->nFields); + pachFieldTypeNew = (char *) calloc(sizeof(char), psDBF->nFields); + pszHeaderNew = (char*) malloc(sizeof(char) * XBASE_FLDHDR_SZ * + psDBF->nFields); + + /* shuffle fields definitions */ + for(i=0; i < psDBF->nFields; i++) + { + panFieldSizeNew[i] = psDBF->panFieldSize[panMap[i]]; + panFieldDecimalsNew[i] = psDBF->panFieldDecimals[panMap[i]]; + pachFieldTypeNew[i] = psDBF->pachFieldType[panMap[i]]; + memcpy(pszHeaderNew + i * XBASE_FLDHDR_SZ, + psDBF->pszHeader + panMap[i] * XBASE_FLDHDR_SZ, XBASE_FLDHDR_SZ); + } + panFieldOffsetNew[0] = 1; + for(i=1; i < psDBF->nFields; i++) + { + panFieldOffsetNew[i] = panFieldOffsetNew[i - 1] + panFieldSizeNew[i - 1]; + } + + free(psDBF->pszHeader); + psDBF->pszHeader = pszHeaderNew; + + /* we're done if we're dealing with not yet created .dbf */ + if ( !(psDBF->bNoHeader && psDBF->nRecords == 0) ) + { + /* force update of header with new header and record length */ + psDBF->bNoHeader = TRUE; + DBFUpdateHeader( psDBF ); + + /* alloc record */ + pszRecord = (char *) malloc(sizeof(char) * psDBF->nRecordLength); + pszRecordNew = (char *) malloc(sizeof(char) * psDBF->nRecordLength); + + /* shuffle fields in records */ + for (iRecord = 0; iRecord < psDBF->nRecords; iRecord++) + { + nRecordOffset = + psDBF->nRecordLength * (SAOffset) iRecord + psDBF->nHeaderLength; + + /* load record */ + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FRead( pszRecord, psDBF->nRecordLength, 1, psDBF->fp ); + + pszRecordNew[0] = pszRecord[0]; + + for(i=0; i < psDBF->nFields; i++) + { + memcpy(pszRecordNew + panFieldOffsetNew[i], + pszRecord + psDBF->panFieldOffset[panMap[i]], + psDBF->panFieldSize[panMap[i]]); + } + + /* write record */ + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FWrite( pszRecordNew, psDBF->nRecordLength, 1, psDBF->fp ); + } + + /* free record */ + free(pszRecord); + free(pszRecordNew); + } + + free(psDBF->panFieldOffset); + free(psDBF->panFieldSize); + free(psDBF->panFieldDecimals); + free(psDBF->pachFieldType); + + psDBF->panFieldOffset = panFieldOffsetNew; + psDBF->panFieldSize = panFieldSizeNew; + psDBF->panFieldDecimals =panFieldDecimalsNew; + psDBF->pachFieldType = pachFieldTypeNew; + + psDBF->nCurrentRecord = -1; + psDBF->bCurrentRecordModified = FALSE; + psDBF->bUpdated = TRUE; + + return TRUE; +} + + +/************************************************************************/ +/* DBFAlterFieldDefn() */ +/* */ +/* Alter a field definition in a .dbf file */ +/************************************************************************/ + +int SHPAPI_CALL +DBFAlterFieldDefn( DBFHandle psDBF, int iField, const char * pszFieldName, + char chType, int nWidth, int nDecimals ) +{ + int i; + int iRecord; + int nOffset; + int nOldWidth; + int nOldRecordLength; + SAOffset nRecordOffset; + char* pszFInfo; + char chOldType; + int bIsNULL; + char chFieldFill; + + if (iField < 0 || iField >= psDBF->nFields) + return FALSE; + + /* make sure that everything is written in .dbf */ + if( !DBFFlushRecord( psDBF ) ) + return FALSE; + + chFieldFill = DBFGetNullCharacter(chType); + + chOldType = psDBF->pachFieldType[iField]; + nOffset = psDBF->panFieldOffset[iField]; + nOldWidth = psDBF->panFieldSize[iField]; + nOldRecordLength = psDBF->nRecordLength; + +/* -------------------------------------------------------------------- */ +/* Do some checking to ensure we can add records to this file. */ +/* -------------------------------------------------------------------- */ + if( nWidth < 1 ) + return -1; + + if( nWidth > XBASE_FLD_MAX_WIDTH ) + nWidth = XBASE_FLD_MAX_WIDTH; + +/* -------------------------------------------------------------------- */ +/* Assign the new field information fields. */ +/* -------------------------------------------------------------------- */ + psDBF->panFieldSize[iField] = nWidth; + psDBF->panFieldDecimals[iField] = nDecimals; + psDBF->pachFieldType[iField] = chType; + +/* -------------------------------------------------------------------- */ +/* Update the header information. */ +/* -------------------------------------------------------------------- */ + pszFInfo = psDBF->pszHeader + XBASE_FLDHDR_SZ * iField; + + for( i = 0; i < XBASE_FLDHDR_SZ; i++ ) + pszFInfo[i] = '\0'; + + strncpy( pszFInfo, pszFieldName, XBASE_FLDNAME_LEN_WRITE ); + + pszFInfo[11] = psDBF->pachFieldType[iField]; + + if( chType == 'C' ) + { + pszFInfo[16] = (unsigned char) (nWidth % 256); + pszFInfo[17] = (unsigned char) (nWidth / 256); + } + else + { + pszFInfo[16] = (unsigned char) nWidth; + pszFInfo[17] = (unsigned char) nDecimals; + } + +/* -------------------------------------------------------------------- */ +/* Update offsets */ +/* -------------------------------------------------------------------- */ + if (nWidth != nOldWidth) + { + for (i = iField + 1; i < psDBF->nFields; i++) + psDBF->panFieldOffset[i] += nWidth - nOldWidth; + psDBF->nRecordLength += nWidth - nOldWidth; + + psDBF->pszCurrentRecord = (char *) SfRealloc(psDBF->pszCurrentRecord, + psDBF->nRecordLength); + } + + /* we're done if we're dealing with not yet created .dbf */ + if ( psDBF->bNoHeader && psDBF->nRecords == 0 ) + return TRUE; + + /* force update of header with new header and record length */ + psDBF->bNoHeader = TRUE; + DBFUpdateHeader( psDBF ); + + if (nWidth < nOldWidth || (nWidth == nOldWidth && chType != chOldType)) + { + char* pszRecord = (char *) malloc(sizeof(char) * nOldRecordLength); + char* pszOldField = (char *) malloc(sizeof(char) * (nOldWidth + 1)); + + /* cppcheck-suppress uninitdata */ + pszOldField[nOldWidth] = 0; + + /* move records to their new positions */ + for (iRecord = 0; iRecord < psDBF->nRecords; iRecord++) + { + nRecordOffset = + nOldRecordLength * (SAOffset) iRecord + psDBF->nHeaderLength; + + /* load record */ + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FRead( pszRecord, nOldRecordLength, 1, psDBF->fp ); + + memcpy(pszOldField, pszRecord + nOffset, nOldWidth); + bIsNULL = DBFIsValueNULL( chOldType, pszOldField ); + + if (nWidth != nOldWidth) + { + if ((chOldType == 'N' || chOldType == 'F') && pszOldField[0] == ' ') + { + /* Strip leading spaces when truncating a numeric field */ + memmove( pszRecord + nOffset, + pszRecord + nOffset + nOldWidth - nWidth, + nWidth ); + } + if (nOffset + nOldWidth < nOldRecordLength) + { + memmove( pszRecord + nOffset + nWidth, + pszRecord + nOffset + nOldWidth, + nOldRecordLength - (nOffset + nOldWidth)); + } + } + + /* Convert null value to the appropriate value of the new type */ + if (bIsNULL) + { + memset( pszRecord + nOffset, chFieldFill, nWidth); + } + + nRecordOffset = + psDBF->nRecordLength * (SAOffset) iRecord + psDBF->nHeaderLength; + + /* write record */ + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FWrite( pszRecord, psDBF->nRecordLength, 1, psDBF->fp ); + } + + if( psDBF->bWriteEndOfFileChar ) + { + char ch = END_OF_FILE_CHARACTER; + + nRecordOffset = + psDBF->nRecordLength * (SAOffset) psDBF->nRecords + psDBF->nHeaderLength; + + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FWrite( &ch, 1, 1, psDBF->fp ); + } + /* TODO: truncate file */ + + free(pszRecord); + free(pszOldField); + } + else if (nWidth > nOldWidth) + { + char* pszRecord = (char *) malloc(sizeof(char) * psDBF->nRecordLength); + char* pszOldField = (char *) malloc(sizeof(char) * (nOldWidth + 1)); + + /* cppcheck-suppress uninitdata */ + pszOldField[nOldWidth] = 0; + + /* move records to their new positions */ + for (iRecord = psDBF->nRecords - 1; iRecord >= 0; iRecord--) + { + nRecordOffset = + nOldRecordLength * (SAOffset) iRecord + psDBF->nHeaderLength; + + /* load record */ + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FRead( pszRecord, nOldRecordLength, 1, psDBF->fp ); + + memcpy(pszOldField, pszRecord + nOffset, nOldWidth); + bIsNULL = DBFIsValueNULL( chOldType, pszOldField ); + + if (nOffset + nOldWidth < nOldRecordLength) + { + memmove( pszRecord + nOffset + nWidth, + pszRecord + nOffset + nOldWidth, + nOldRecordLength - (nOffset + nOldWidth)); + } + + /* Convert null value to the appropriate value of the new type */ + if (bIsNULL) + { + memset( pszRecord + nOffset, chFieldFill, nWidth); + } + else + { + if ((chOldType == 'N' || chOldType == 'F')) + { + /* Add leading spaces when expanding a numeric field */ + memmove( pszRecord + nOffset + nWidth - nOldWidth, + pszRecord + nOffset, nOldWidth ); + memset( pszRecord + nOffset, ' ', nWidth - nOldWidth ); + } + else + { + /* Add trailing spaces */ + memset(pszRecord + nOffset + nOldWidth, ' ', nWidth - nOldWidth); + } + } + + nRecordOffset = + psDBF->nRecordLength * (SAOffset) iRecord + psDBF->nHeaderLength; + + /* write record */ + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FWrite( pszRecord, psDBF->nRecordLength, 1, psDBF->fp ); + } + + if( psDBF->bWriteEndOfFileChar ) + { + char ch = END_OF_FILE_CHARACTER; + + nRecordOffset = + psDBF->nRecordLength * (SAOffset) psDBF->nRecords + psDBF->nHeaderLength; + + psDBF->sHooks.FSeek( psDBF->fp, nRecordOffset, 0 ); + psDBF->sHooks.FWrite( &ch, 1, 1, psDBF->fp ); + } + + free(pszRecord); + free(pszOldField); + } + + psDBF->nCurrentRecord = -1; + psDBF->bCurrentRecordModified = FALSE; + psDBF->bUpdated = TRUE; + + return TRUE; +} + +/************************************************************************/ +/* DBFSetWriteEndOfFileChar() */ +/************************************************************************/ + +void SHPAPI_CALL DBFSetWriteEndOfFileChar( DBFHandle psDBF, int bWriteFlag ) +{ + psDBF->bWriteEndOfFileChar = bWriteFlag; +} diff --git a/libs/shapelib/depcomp b/libs/shapelib/depcomp new file mode 100755 index 0000000..fc98710 --- /dev/null +++ b/libs/shapelib/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2013-05-30.07; # UTC + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The second -e expression handles DOS-style file names with drive + # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/libs/shapelib/install-sh b/libs/shapelib/install-sh new file mode 100755 index 0000000..59990a1 --- /dev/null +++ b/libs/shapelib/install-sh @@ -0,0 +1,508 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2014-09-12.12; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# 'make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +tab=' ' +nl=' +' +IFS=" $tab$nl" + +# Set DOITPROG to "echo" to test this script. + +doit=${DOITPROG-} +doit_exec=${doit:-exec} + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +is_target_a_directory=possibly + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) is_target_a_directory=never;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call 'install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for 'test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + dstdir=`dirname "$dst"` + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + # $RANDOM is not portable (e.g. dash); use it when possible to + # lower collision chance + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 + + # As "mkdir -p" follows symlinks and we work in /tmp possibly; so + # create the $tmpdir first (and fail if unsuccessful) to make sure + # that nobody tries to guess the $tmpdir name. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + oIFS=$IFS + IFS=/ + set -f + set fnord $dstdir + shift + set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + set +f && + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/libs/shapelib/ltmain.sh b/libs/shapelib/ltmain.sh new file mode 100644 index 0000000..147d758 --- /dev/null +++ b/libs/shapelib/ltmain.sh @@ -0,0 +1,11156 @@ +#! /bin/sh +## DO NOT EDIT - This file generated from ./build-aux/ltmain.in +## by inline-source v2014-01-03.01 + +# libtool (GNU libtool) 2.4.6 +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +PROGRAM=libtool +PACKAGE=libtool +VERSION="2.4.6 Debian-2.4.6-0.1" +package_revision=2.4.6 + + +## ------ ## +## Usage. ## +## ------ ## + +# Run './libtool --help' for help with using this script from the +# command line. + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# After configure completes, it has a better idea of some of the +# shell tools we need than the defaults used by the functions shared +# with bootstrap, so set those here where they can still be over- +# ridden by the user, but otherwise take precedence. + +: ${AUTOCONF="autoconf"} +: ${AUTOMAKE="automake"} + + +## -------------------------- ## +## Source external libraries. ## +## -------------------------- ## + +# Much of our low-level functionality needs to be sourced from external +# libraries, which are installed to $pkgauxdir. + +# Set a version string for this script. +scriptversion=2015-01-20.17; # UTC + +# General shell script boiler plate, and helper functions. +# Written by Gary V. Vaughan, 2004 + +# Copyright (C) 2004-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. + +# As a special exception to the GNU General Public License, if you distribute +# this file as part of a program or library that is built using GNU Libtool, +# you may include this file under the same distribution terms that you use +# for the rest of that program. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# Evaluate this file near the top of your script to gain access to +# the functions and variables defined here: +# +# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh +# +# If you need to override any of the default environment variable +# settings, do that before evaluating this file. + + +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac +fi + +# NLS nuisances: We save the old values in case they are required later. +_G_user_locale= +_G_safe_locale= +for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test set = \"\${$_G_var+set}\"; then + save_$_G_var=\$$_G_var + $_G_var=C + export $_G_var + _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" + _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" + fi" +done + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Make sure IFS has a sensible default +sp=' ' +nl=' +' +IFS="$sp $nl" + +# There are apparently some retarded systems that use ';' as a PATH separator! +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + + +## ------------------------- ## +## Locate command utilities. ## +## ------------------------- ## + + +# func_executable_p FILE +# ---------------------- +# Check that FILE is an executable regular file. +func_executable_p () +{ + test -f "$1" && test -x "$1" +} + + +# func_path_progs PROGS_LIST CHECK_FUNC [PATH] +# -------------------------------------------- +# Search for either a program that responds to --version with output +# containing "GNU", or else returned by CHECK_FUNC otherwise, by +# trying all the directories in PATH with each of the elements of +# PROGS_LIST. +# +# CHECK_FUNC should accept the path to a candidate program, and +# set $func_check_prog_result if it truncates its output less than +# $_G_path_prog_max characters. +func_path_progs () +{ + _G_progs_list=$1 + _G_check_func=$2 + _G_PATH=${3-"$PATH"} + + _G_path_prog_max=0 + _G_path_prog_found=false + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} + for _G_dir in $_G_PATH; do + IFS=$_G_save_IFS + test -z "$_G_dir" && _G_dir=. + for _G_prog_name in $_G_progs_list; do + for _exeext in '' .EXE; do + _G_path_prog=$_G_dir/$_G_prog_name$_exeext + func_executable_p "$_G_path_prog" || continue + case `"$_G_path_prog" --version 2>&1` in + *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; + *) $_G_check_func $_G_path_prog + func_path_progs_result=$func_check_prog_result + ;; + esac + $_G_path_prog_found && break 3 + done + done + done + IFS=$_G_save_IFS + test -z "$func_path_progs_result" && { + echo "no acceptable sed could be found in \$PATH" >&2 + exit 1 + } +} + + +# We want to be able to use the functions in this file before configure +# has figured out where the best binaries are kept, which means we have +# to search for them ourselves - except when the results are already set +# where we skip the searches. + +# Unless the user overrides by setting SED, search the path for either GNU +# sed, or the sed that truncates its output the least. +test -z "$SED" && { + _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for _G_i in 1 2 3 4 5 6 7; do + _G_sed_script=$_G_sed_script$nl$_G_sed_script + done + echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed + _G_sed_script= + + func_check_prog_sed () + { + _G_path_prog=$1 + + _G_count=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo '' >> conftest.nl + "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin + rm -f conftest.sed + SED=$func_path_progs_result +} + + +# Unless the user overrides by setting GREP, search the path for either GNU +# grep, or the grep that truncates its output the least. +test -z "$GREP" && { + func_check_prog_grep () + { + _G_path_prog=$1 + + _G_count=0 + _G_path_prog_max=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo 'GREP' >> conftest.nl + "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin + GREP=$func_path_progs_result +} + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. + +: ${CP="cp -f"} +: ${ECHO="printf %s\n"} +: ${EGREP="$GREP -E"} +: ${FGREP="$GREP -F"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} + + +## -------------------- ## +## Useful sed snippets. ## +## -------------------- ## + +sed_dirname='s|/[^/]*$||' +sed_basename='s|^.*/||' + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s|\([`"$\\]\)|\\\1|g' + +# Same as above, but do not quote variable references. +sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' + +# Sed substitution that converts a w32 file name or path +# that contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-'\' parameter expansions in output of sed_double_quote_subst that +# were '\'-ed in input to the same. If an odd number of '\' preceded a +# '$' in input to sed_double_quote_subst, that '$' was protected from +# expansion. Since each input '\' is now two '\'s, look for any number +# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. +_G_bs='\\' +_G_bs2='\\\\' +_G_bs4='\\\\\\\\' +_G_dollar='\$' +sed_double_backslash="\ + s/$_G_bs4/&\\ +/g + s/^$_G_bs2$_G_dollar/$_G_bs&/ + s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g + s/\n//g" + + +## ----------------- ## +## Global variables. ## +## ----------------- ## + +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the 'Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the '^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. + +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +# Allow overriding, eg assuming that you follow the convention of +# putting '$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# +# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +debug_cmd=${debug_cmd-":"} +exit_cmd=: + +# By convention, finish your script with: +# +# exit $exit_status +# +# so that you can set exit_status to non-zero if you want to indicate +# something went wrong during execution without actually bailing out at +# the point of failure. +exit_status=$EXIT_SUCCESS + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath=$0 + +# The name of this program. +progname=`$ECHO "$progpath" |$SED "$sed_basename"` + +# Make sure we have an absolute progpath for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` + progdir=`cd "$progdir" && pwd` + progpath=$progdir/$progname + ;; + *) + _G_IFS=$IFS + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS=$_G_IFS + test -x "$progdir/$progname" && break + done + IFS=$_G_IFS + test -n "$progdir" || progdir=`pwd` + progpath=$progdir/$progname + ;; +esac + + +## ----------------- ## +## Standard options. ## +## ----------------- ## + +# The following options affect the operation of the functions defined +# below, and should be set appropriately depending on run-time para- +# meters passed on the command line. + +opt_dry_run=false +opt_quiet=false +opt_verbose=false + +# Categories 'all' and 'none' are always available. Append any others +# you will pass as the first argument to func_warning from your own +# code. +warning_categories= + +# By default, display warnings according to 'opt_warning_types'. Set +# 'warning_func' to ':' to elide all warnings, or func_fatal_error to +# treat the next displayed warning as a fatal error. +warning_func=func_warn_and_continue + +# Set to 'all' to display all warnings, 'none' to suppress all +# warnings, or a space delimited list of some subset of +# 'warning_categories' to display only the listed warnings. +opt_warning_types=all + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# 'require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () +{ + $debug_cmd + + test -t 1 && { + # COLORTERM and USE_ANSI_COLORS environment variables take + # precedence, because most terminfo databases neglect to describe + # whether color sequences are supported. + test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} + + if test 1 = "$USE_ANSI_COLORS"; then + # Standard ANSI escape sequences + tc_reset='' + tc_bold=''; tc_standout='' + tc_red=''; tc_green='' + tc_blue=''; tc_cyan='' + else + # Otherwise trust the terminfo database after all. + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + fi + } + + require_term_colors=: +} + + +## ----------------- ## +## Function library. ## +## ----------------- ## + +# This section contains a variety of useful functions to call in your +# scripts. Take note of the portable wrappers for features provided by +# some modern shells, which will fall back to slower equivalents on +# less featureful shells. + + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. + + # We should try to minimise forks, especially on Windows where they are + # unreasonably slow, so skip the feature probes when bash or zsh are + # being used: + if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then + : ${_G_HAVE_ARITH_OP="yes"} + : ${_G_HAVE_XSI_OPS="yes"} + # The += operator was introduced in bash 3.1 + case $BASH_VERSION in + [12].* | 3.0 | 3.0*) ;; + *) + : ${_G_HAVE_PLUSEQ_OP="yes"} + ;; + esac + fi + + # _G_HAVE_PLUSEQ_OP + # Can be empty, in which case the shell is probed, "yes" if += is + # useable or anything else if it does not work. + test -z "$_G_HAVE_PLUSEQ_OP" \ + && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ + && _G_HAVE_PLUSEQ_OP=yes + +if test yes = "$_G_HAVE_PLUSEQ_OP" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_append_quoted VAR VALUE +# ---------------------------- +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +if test yes = "$_G_HAVE_PLUSEQ_OP"; then + eval 'func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1+=\\ \$func_quote_for_eval_result" + }' +else + func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1=\$$1\\ \$func_quote_for_eval_result" + } +fi + + +# func_append_uniq VAR VALUE +# -------------------------- +# Append unique VALUE onto the existing contents of VAR, assuming +# entries are delimited by the first character of VALUE. For example: +# +# func_append_uniq options " --another-option option-argument" +# +# will only append to $options if " --another-option option-argument " +# is not already present somewhere in $options already (note spaces at +# each end implied by leading space in second argument). +func_append_uniq () +{ + $debug_cmd + + eval _G_current_value='`$ECHO $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` + + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; + *) func_append "$@" ;; + esac +} + + +# func_arith TERM... +# ------------------ +# Set func_arith_result to the result of evaluating TERMs. + test -z "$_G_HAVE_ARITH_OP" \ + && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ + && _G_HAVE_ARITH_OP=yes + +if test yes = "$_G_HAVE_ARITH_OP"; then + eval 'func_arith () + { + $debug_cmd + + func_arith_result=$(( $* )) + }' +else + func_arith () + { + $debug_cmd + + func_arith_result=`expr "$@"` + } +fi + + +# func_basename FILE +# ------------------ +# Set func_basename_result to FILE with everything up to and including +# the last / stripped. +if test yes = "$_G_HAVE_XSI_OPS"; then + # If this shell supports suffix pattern removal, then use it to avoid + # forking. Hide the definitions single quotes in case the shell chokes + # on unsupported syntax... + _b='func_basename_result=${1##*/}' + _d='case $1 in + */*) func_dirname_result=${1%/*}$2 ;; + * ) func_dirname_result=$3 ;; + esac' + +else + # ...otherwise fall back to using sed. + _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' + _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` + if test "X$func_dirname_result" = "X$1"; then + func_dirname_result=$3 + else + func_append func_dirname_result "$2" + fi' +fi + +eval 'func_basename () +{ + $debug_cmd + + '"$_b"' +}' + + +# func_dirname FILE APPEND NONDIR_REPLACEMENT +# ------------------------------------------- +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +eval 'func_dirname () +{ + $debug_cmd + + '"$_d"' +}' + + +# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT +# -------------------------------------------------------- +# Perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# For efficiency, we do not delegate to the functions above but instead +# duplicate the functionality here. +eval 'func_dirname_and_basename () +{ + $debug_cmd + + '"$_b"' + '"$_d"' +}' + + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_echo_all ARG... +# -------------------- +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + + +# func_echo_infix_1 INFIX ARG... +# ------------------------------ +# Echo program name, followed by INFIX on the first line, with any +# additional lines not showing INFIX. +func_echo_infix_1 () +{ + $debug_cmd + + $require_term_colors + + _G_infix=$1; shift + _G_indent=$_G_infix + _G_prefix="$progname: $_G_infix: " + _G_message=$* + + # Strip color escape sequences before counting printable length + for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" + do + test -n "$_G_tc" && { + _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` + _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` + } + done + _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes + + func_echo_infix_1_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_infix_1_IFS + $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 + _G_prefix=$_G_indent + done + IFS=$func_echo_infix_1_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + $debug_cmd + + func_error "$*" + exit $EXIT_FAILURE +} + + +# func_grep EXPRESSION FILENAME +# ----------------------------- +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $debug_cmd + + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_len STRING +# --------------- +# Set func_len_result to the length of STRING. STRING may not +# start with a hyphen. + test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` + } +fi + + +# func_mkdir_p DIRECTORY-PATH +# --------------------------- +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + $debug_cmd + + _G_directory_path=$1 + _G_dir_list= + + if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then + + # Protect directory names starting with '-' + case $_G_directory_path in + -*) _G_directory_path=./$_G_directory_path ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$_G_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + _G_dir_list=$_G_directory_path:$_G_dir_list + + # If the last portion added has no slash in it, the list is done + case $_G_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` + done + _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` + + func_mkdir_p_IFS=$IFS; IFS=: + for _G_dir in $_G_dir_list; do + IFS=$func_mkdir_p_IFS + # mkdir can fail with a 'File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$_G_dir" 2>/dev/null || : + done + IFS=$func_mkdir_p_IFS + + # Bail out if we (or some other process) failed to create a directory. + test -d "$_G_directory_path" || \ + func_fatal_error "Failed to create '$1'" + fi +} + + +# func_mktempdir [BASENAME] +# ------------------------- +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, BASENAME is the basename for that directory. +func_mktempdir () +{ + $debug_cmd + + _G_template=${TMPDIR-/tmp}/${1-$progname} + + if test : = "$opt_dry_run"; then + # Return a directory name, but don't create it in dry-run mode + _G_tmpdir=$_G_template-$$ + else + + # If mktemp works, use that first and foremost + _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` + + if test ! -d "$_G_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + _G_tmpdir=$_G_template-${RANDOM-0}$$ + + func_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$_G_tmpdir" + umask $func_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$_G_tmpdir" || \ + func_fatal_error "cannot create temporary directory '$_G_tmpdir'" + fi + + $ECHO "$_G_tmpdir" +} + + +# func_normal_abspath PATH +# ------------------------ +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +func_normal_abspath () +{ + $debug_cmd + + # These SED scripts presuppose an absolute path with a trailing slash. + _G_pathcar='s|^/\([^/]*\).*$|\1|' + _G_pathcdr='s|^/[^/]*||' + _G_removedotparts=':dotsl + s|/\./|/|g + t dotsl + s|/\.$|/|' + _G_collapseslashes='s|/\{1,\}|/|g' + _G_finalslash='s|/*$|/|' + + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` + while :; do + # Processed it all yet? + if test / = "$func_normal_abspath_tpath"; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result"; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + + +# func_notquiet ARG... +# -------------------- +# Echo program name prefixed message only when not in quiet mode. +func_notquiet () +{ + $debug_cmd + + $opt_quiet || func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + + +# func_relative_path SRCDIR DSTDIR +# -------------------------------- +# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. +func_relative_path () +{ + $debug_cmd + + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=$func_dirname_result + if test -z "$func_relative_path_tlibdir"; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test -n "$func_stripname_result"; then + func_append func_relative_path_result "/$func_stripname_result" + fi + + # Normalisation. If bindir is libdir, return '.' else relative path. + if test -n "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + fi + + test -n "$func_relative_path_result" || func_relative_path_result=. + + : +} + + +# func_quote_for_eval ARG... +# -------------------------- +# Aesthetically quote ARGs to be evaled later. +# This function returns two values: +# i) func_quote_for_eval_result +# double-quoted, suitable for a subsequent eval +# ii) func_quote_for_eval_unquoted_result +# has all characters that are still active within double +# quotes backslashified. +func_quote_for_eval () +{ + $debug_cmd + + func_quote_for_eval_unquoted_result= + func_quote_for_eval_result= + while test 0 -lt $#; do + case $1 in + *[\\\`\"\$]*) + _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; + *) + _G_unquoted_arg=$1 ;; + esac + if test -n "$func_quote_for_eval_unquoted_result"; then + func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" + else + func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" + fi + + case $_G_unquoted_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and variable expansion + # for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_quoted_arg=\"$_G_unquoted_arg\" + ;; + *) + _G_quoted_arg=$_G_unquoted_arg + ;; + esac + + if test -n "$func_quote_for_eval_result"; then + func_append func_quote_for_eval_result " $_G_quoted_arg" + else + func_append func_quote_for_eval_result "$_G_quoted_arg" + fi + shift + done +} + + +# func_quote_for_expand ARG +# ------------------------- +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + $debug_cmd + + case $1 in + *[\\\`\"]*) + _G_arg=`$ECHO "$1" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; + *) + _G_arg=$1 ;; + esac + + case $_G_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_arg=\"$_G_arg\" + ;; + esac + + func_quote_for_expand_result=$_G_arg +} + + +# func_stripname PREFIX SUFFIX NAME +# --------------------------------- +# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_stripname () + { + $debug_cmd + + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary variable first. + func_stripname_result=$3 + func_stripname_result=${func_stripname_result#"$1"} + func_stripname_result=${func_stripname_result%"$2"} + }' +else + func_stripname () + { + $debug_cmd + + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; + esac + } +fi + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + func_quote_for_expand "$_G_cmd" + eval "func_notquiet $func_quote_for_expand_result" + + $opt_dry_run || { + eval "$_G_cmd" + _G_status=$? + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_show_eval_locale CMD [FAIL_EXP] +# ------------------------------------ +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + $opt_quiet || { + func_quote_for_expand "$_G_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + $opt_dry_run || { + eval "$_G_user_locale + $_G_cmd" + _G_status=$? + eval "$_G_safe_locale" + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_tr_sh +# ---------- +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + $debug_cmd + + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $debug_cmd + + $opt_verbose && func_echo "$*" + + : +} + + +# func_warn_and_continue ARG... +# ----------------------------- +# Echo program name prefixed warning message to standard error. +func_warn_and_continue () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 +} + + +# func_warning CATEGORY ARG... +# ---------------------------- +# Echo program name prefixed warning message to standard error. Warning +# messages can be filtered according to CATEGORY, where this function +# elides messages where CATEGORY is not listed in the global variable +# 'opt_warning_types'. +func_warning () +{ + $debug_cmd + + # CATEGORY must be in the warning_categories list! + case " $warning_categories " in + *" $1 "*) ;; + *) func_internal_error "invalid warning category '$1'" ;; + esac + + _G_category=$1 + shift + + case " $opt_warning_types " in + *" $_G_category "*) $warning_func ${1+"$@"} ;; + esac +} + + +# func_sort_ver VER1 VER2 +# ----------------------- +# 'sort -V' is not generally available. +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +func_sort_ver () +{ + $debug_cmd + + printf '%s\n%s\n' "$1" "$2" \ + | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n +} + +# func_lt_ver PREV CURR +# --------------------- +# Return true if PREV and CURR are in the correct order according to +# func_sort_ver, otherwise false. Use it like this: +# +# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." +func_lt_ver () +{ + $debug_cmd + + test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# Set a version string for this script. +scriptversion=2014-01-07.03; # UTC + +# A portable, pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# Copyright (C) 2010-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/funclib.sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the '--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# warranty; '. +# +# For '-h' and '--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support '--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and '--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# '--verbose'. +# +# After sourcing this file, you can plug processing for additional +# options by amending the variables from the 'Configuration' section +# below, and following the instructions in the 'Option parsing' +# section further down. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of '-h' and +# '--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to '-h' and '--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=" +Warning categories include: + 'all' show all warnings + 'none' turn off all the warnings + 'error' warnings are treated as fatal errors" + +# Help message printed before fatal option parsing errors. +fatal_help="Try '\$progname --help' for more information." + + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# to the main code. A hook is just a named list of of function, that can +# be run in order later on. + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# 'func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to 'func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It is assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not support hook funcions.n" ;; + esac + + eval _G_hook_fns=\$$1_hooks; shift + + for _G_hook in $_G_hook_fns; do + eval $_G_hook '"$@"' + + # store returned options list back into positional + # parameters for next 'cmd' execution. + eval _G_hook_result=\$${_G_hook}_result + eval set dummy "$_G_hook_result"; shift + done + + func_quote_for_eval ${1+"$@"} + func_run_hooks_result=$func_quote_for_eval_result +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list in your hook function, remove any +# options that you action, and then pass back the remaining unprocessed +# options in '_result', escaped suitably for +# 'eval'. Like this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message=$usage_message' +# -s, --silent don'\''t print informational messages +# ' +# +# func_quote_for_eval ${1+"$@"} +# my_options_prep_result=$func_quote_for_eval_result +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# # Note that for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# ;; +# *) set dummy "$_G_opt" "$*"; shift; break ;; +# esac +# done +# +# func_quote_for_eval ${1+"$@"} +# my_silent_option_result=$func_quote_for_eval_result +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# '--silent' and '--verbose' options are mutually exclusive." +# +# func_quote_for_eval ${1+"$@"} +# my_option_validation_result=$func_quote_for_eval_result +# } +# func_add_hook func_validate_options my_option_validation +# +# You'll alse need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + func_options_prep ${1+"$@"} + eval func_parse_options \ + ${func_options_prep_result+"$func_options_prep_result"} + eval func_validate_options \ + ${func_parse_options_result+"$func_parse_options_result"} + + eval func_run_hooks func_options \ + ${func_validate_options_result+"$func_validate_options_result"} + + # save modified positional parameters for caller + func_options_result=$func_run_hooks_result +} + + +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propogate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before +# returning. +func_hookable func_options_prep +func_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_verbose=false + opt_warning_types= + + func_run_hooks func_options_prep ${1+"$@"} + + # save modified positional parameters for caller + func_options_prep_result=$func_run_hooks_result +} + + +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () +{ + $debug_cmd + + func_parse_options_result= + + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + func_run_hooks func_parse_options ${1+"$@"} + + # Adjust func_parse_options positional parameters to match + eval set dummy "$func_run_hooks_result"; shift + + # Break out of the loop if we already parsed every option. + test $# -gt 0 || break + + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" + $debug_cmd + ;; + + --no-warnings|--no-warning|--no-warn) + set dummy --warnings none ${1+"$@"} + shift + ;; + + --warnings|--warning|-W) + test $# = 0 && func_missing_arg $_G_opt && break + case " $warning_categories $1" in + *" $1 "*) + # trailing space prevents matching last $1 above + func_append_uniq opt_warning_types " $1" + ;; + *all) + opt_warning_types=$warning_categories + ;; + *none) + opt_warning_types=none + warning_func=: + ;; + *error) + opt_warning_types=$warning_categories + warning_func=func_fatal_error + ;; + *) + func_fatal_error \ + "unsupported warning category: '$1'" + ;; + esac + shift + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + func_parse_options_result=$func_quote_for_eval_result +} + + +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () +{ + $debug_cmd + + # Display all warnings if -W was not given. + test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" + + func_run_hooks func_validate_options ${1+"$@"} + + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE + + # save modified positional parameters for caller + func_validate_options_result=$func_run_hooks_result +} + + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + eval \$ECHO \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + + +# func_help +# --------- +# Echo long help message to standard output and exit. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message" + exit 0 +} + + +# func_missing_arg ARGNAME +# ------------------------ +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $debug_cmd + + func_error "Missing argument for '$1'." + exit_cmd=exit +} + + +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables after +# splitting STRING at the '=' sign. +test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + test "x$func_split_equals_lhs" = "x$1" \ + && func_split_equals_rhs= + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` + func_split_equals_rhs= + test "x$func_split_equals_lhs" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# func_split_short_opt SHORTOPT +# ----------------------------- +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () +{ + $debug_cmd + + func_usage_message + $ECHO "Run '$progname --help |${PAGER-more}' for full usage" + exit 0 +} + + +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + echo + $SED -n 's|^# || + /^Written by/{ + x;p;x + } + h + /^Written by/q' < "$progpath" + echo + eval \$ECHO \""$usage_message"\" +} + + +# func_version +# ------------ +# Echo version message to standard output and exit. +func_version () +{ + $debug_cmd + + printf '%s\n' "$progname $scriptversion" + $SED -n ' + /(C)/!b go + :more + /\./!{ + N + s|\n# | | + b more + } + :go + /^# Written by /,/# warranty; / { + s|^# || + s|^# *$|| + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + p + } + /^# Written by / { + s|^# || + p + } + /^warranty; /q' < "$progpath" + + exit $? +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: + +# Set a version string. +scriptversion='(GNU libtool) 2.4.6' + + +# func_echo ARG... +# ---------------- +# Libtool also displays the current mode in messages, so override +# funclib.sh func_echo with this custom definition. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () +{ + $debug_cmd + + $warning_func ${1+"$@"} +} + + +## ---------------- ## +## Options parsing. ## +## ---------------- ## + +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. + +usage='$progpath [OPTION]... [MODE-ARG]...' + +# Short help message in response to '-h'. +usage_message="Options: + --config show all configuration variables + --debug enable verbose shell tracing + -n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --mode=MODE use operation mode MODE + --no-warnings equivalent to '-Wnone' + --preserve-dup-deps don't remove duplicate dependency libraries + --quiet, --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + -v, --verbose print more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message +" + +# Additional text appended to 'usage_message' in response to '--help'. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. When passed as first option, +'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. +Try '$progname --help --mode=MODE' for a more detailed description of MODE. + +When reporting a bug, please describe a test case to reproduce it and +include the following information: + + host-triplet: $host + shell: $SHELL + compiler: $LTCC + compiler flags: $LTCFLAGS + linker: $LD (gnu? $with_gnu_ld) + version: $progname (GNU libtool) 2.4.6 + automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` + autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` + +Report bugs to . +GNU libtool home page: . +General help using GNU software: ." + exit 0 +} + + +# func_lo2o OBJECT-NAME +# --------------------- +# Transform OBJECT-NAME from a '.lo' suffix to the platform specific +# object suffix. + +lo2o=s/\\.lo\$/.$objext/ +o2lo=s/\\.$objext\$/.lo/ + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_lo2o () + { + case $1 in + *.lo) func_lo2o_result=${1%.lo}.$objext ;; + * ) func_lo2o_result=$1 ;; + esac + }' + + # func_xform LIBOBJ-OR-SOURCE + # --------------------------- + # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) + # suffix to a '.lo' libtool-object suffix. + eval 'func_xform () + { + func_xform_result=${1%.*}.lo + }' +else + # ...otherwise fall back to using sed. + func_lo2o () + { + func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` + } + + func_xform () + { + func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` + } +fi + + +# func_fatal_configuration ARG... +# ------------------------------- +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func__fatal_error ${1+"$@"} \ + "See the $PACKAGE documentation for more information." \ + "Fatal configuration error." +} + + +# func_config +# ----------- +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + + +# func_features +# ------------- +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test yes = "$build_libtool_libs"; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test yes = "$build_old_libs"; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + + +# func_enable_tag TAGNAME +# ----------------------- +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname=$1 + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf=/$re_begincf/,/$re_endcf/p + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + + +# func_check_version_match +# ------------------------ +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# libtool_options_prep [ARG]... +# ----------------------------- +# Preparation for options parsed by libtool. +libtool_options_prep () +{ + $debug_mode + + # Option defaults: + opt_config=false + opt_dlopen= + opt_dry_run=false + opt_help=false + opt_mode= + opt_preserve_dup_deps=false + opt_quiet=false + + nonopt= + preserve_args= + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + esac + + # Pass back the list of options. + func_quote_for_eval ${1+"$@"} + libtool_options_prep_result=$func_quote_for_eval_result +} +func_add_hook func_options_prep libtool_options_prep + + +# libtool_parse_options [ARG]... +# --------------------------------- +# Provide handling for libtool specific options. +libtool_parse_options () +{ + $debug_cmd + + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_opt=$1 + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + + --config) func_config ;; + + --dlopen|-dlopen) + opt_dlopen="${opt_dlopen+$opt_dlopen +}$1" + shift + ;; + + --preserve-dup-deps) + opt_preserve_dup_deps=: ;; + + --features) func_features ;; + + --finish) set dummy --mode finish ${1+"$@"}; shift ;; + + --help) opt_help=: ;; + + --help-all) opt_help=': help-all' ;; + + --mode) test $# = 0 && func_missing_arg $_G_opt && break + opt_mode=$1 + case $1 in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $_G_opt" + exit_cmd=exit + break + ;; + esac + shift + ;; + + --no-silent|--no-quiet) + opt_quiet=false + func_append preserve_args " $_G_opt" + ;; + + --no-warnings|--no-warning|--no-warn) + opt_warning=false + func_append preserve_args " $_G_opt" + ;; + + --no-verbose) + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --silent|--quiet) + opt_quiet=: + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --tag) test $# = 0 && func_missing_arg $_G_opt && break + opt_tag=$1 + func_append preserve_args " $_G_opt $1" + func_enable_tag "$1" + shift + ;; + + --verbose|-v) opt_quiet=false + opt_verbose=: + func_append preserve_args " $_G_opt" + ;; + + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + libtool_parse_options_result=$func_quote_for_eval_result +} +func_add_hook func_parse_options libtool_parse_options + + + +# libtool_validate_options [ARG]... +# --------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +libtool_validate_options () +{ + # save first non-option argument + if test 0 -lt $#; then + nonopt=$1 + shift + fi + + # preserve --debug + test : = "$debug_cmd" || func_append preserve_args " --debug" + + case $host in + # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 + # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 + *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + test yes != "$build_libtool_libs" \ + && test yes != "$build_old_libs" \ + && func_fatal_configuration "not configured to build any kind of library" + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test execute != "$opt_mode"; then + func_error "unrecognized option '-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help=$help + help="Try '$progname --help --mode=$opt_mode' for more information." + } + + # Pass back the unparsed argument list + func_quote_for_eval ${1+"$@"} + libtool_validate_options_result=$func_quote_for_eval_result +} +func_add_hook func_validate_options libtool_validate_options + + +# Process options as early as possible so that --help and --version +# can return quickly. +func_options ${1+"$@"} +eval set dummy "$func_options_result"; shift + + + +## ----------- ## +## Main. ## +## ----------- ## + +magic='%%%MAGIC variable%%%' +magic_exe='%%%MAGIC EXE variable%%%' + +# Global variables. +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# func_generated_by_libtool +# True iff stdin has been generated by Libtool. This function is only +# a basic sanity check; it will hardly flush out determined imposters. +func_generated_by_libtool_p () +{ + $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if 'file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case $lalib_p_line in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test yes = "$lalib_p" +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + test -f "$1" && + $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $debug_cmd + + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# 'FILE.' does not work on cygwin managed mounts. +func_source () +{ + $debug_cmd + + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case $lt_sysroot:$1 in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result='='$func_stripname_result + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $debug_cmd + + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with '--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=$1 + if test yes = "$build_libtool_libs"; then + write_lobj=\'$2\' + else + write_lobj=none + fi + + if test yes = "$build_old_libs"; then + write_oldobj=\'$3\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $debug_cmd + + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result= + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result"; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $debug_cmd + + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $debug_cmd + + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $debug_cmd + + if test -z "$2" && test -n "$1"; then + func_error "Could not determine host file name corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result=$1 + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $debug_cmd + + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " '$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result=$3 + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $debug_cmd + + case $4 in + $1 ) func_to_host_path_result=$3$func_to_host_path_result + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via '$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $debug_cmd + + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $debug_cmd + + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result=$1 +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result=$func_convert_core_msys_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result=$func_convert_core_file_wine_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via '$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $debug_cmd + + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd=func_convert_path_$func_stripname_result + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $debug_cmd + + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result=$1 +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_msys_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_path_wine_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_dll_def_p FILE +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with _LT_DLL_DEF_P in libtool.m4 +func_dll_def_p () +{ + $debug_cmd + + func_dll_def_p_tmp=`$SED -n \ + -e 's/^[ ]*//' \ + -e '/^\(;.*\)*$/d' \ + -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ + -e q \ + "$1"` + test DEF = "$func_dll_def_p_tmp" +} + + +# func_mode_compile arg... +func_mode_compile () +{ + $debug_cmd + + # Get the compilation command and the source file. + base_compile= + srcfile=$nonopt # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg=$arg + arg_mode=normal + ;; + + target ) + libobj=$arg + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify '-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs=$IFS; IFS=, + for arg in $args; do + IFS=$save_ifs + func_append_quoted lastarg "$arg" + done + IFS=$save_ifs + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg=$srcfile + srcfile=$arg + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with '-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj=$func_basename_result + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from '$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test yes = "$build_libtool_libs" \ + || func_fatal_configuration "cannot build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name '$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname=$func_basename_result + xdir=$func_dirname_result + lobj=$xdir$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test yes = "$build_old_libs"; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test no = "$compiler_c_o"; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext + lockfile=$output_obj.lock + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test yes = "$need_locks"; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test warn = "$need_locks"; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test yes = "$build_libtool_libs"; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test no != "$pic_mode"; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test yes = "$suppress_opt"; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test yes = "$build_old_libs"; then + if test yes != "$pic_mode"; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test yes = "$compiler_c_o"; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test no != "$need_locks"; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test compile = "$opt_mode" && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a '.o' file suitable for static linking + -static only build a '.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a 'standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix '.c' with the +library object suffix, '.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to '-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the '--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the 'install' or 'cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE use a list of object files found in FILE to specify objects + -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with '-') are ignored. + +Every other argument is treated as a filename. Files ending in '.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in '.la', then a libtool library is created, +only library objects ('.lo' files) may be specified, and '-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created +using 'ar' and 'ranlib', or on Windows using 'lib'. + +If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode '$opt_mode'" + ;; + esac + + echo + $ECHO "Try '$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test : = "$opt_help"; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | $SED -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + $SED '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $debug_cmd + + # The first argument is the command name. + cmd=$nonopt + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "'$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "'$file' was not linked with '-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir=$func_dirname_result + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir=$func_dirname_result + ;; + + *) + func_warning "'-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir=$absdir + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic=$magic + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file=$progdir/$program + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file=$progdir/$program + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if $opt_dry_run; then + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + else + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd=\$cmd$args + fi +} + +test execute = "$opt_mode" && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $debug_cmd + + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "'$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument '$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and '=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_quiet && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the '-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the '$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the '$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the '$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test finish = "$opt_mode" && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $debug_cmd + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac + then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=false + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=: ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test X-m = "X$prev" && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the '$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=: + if $isdir; then + destdir=$dest + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir=$func_dirname_result + destname=$func_basename_result + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "'$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "'$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir=$func_dirname_result + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking '$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname=$1 + shift + + srcname=$realname + test -n "$relink_command" && srcname=${realname}T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme=$stripme + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme= + ;; + esac + ;; + os2*) + case $realname in + *_dll.a) + tstripme= + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try 'ln -sf' first, because the 'ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib=$destdir/$realname + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name=$func_basename_result + instname=$dir/${name}i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest=$destfile + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to '$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test yes = "$build_old_libs"; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext= + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=.exe + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script '$wrapper'" + + finalize=: + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "'$lib' has not been installed in '$libdir'" + finalize=false + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test no = "$fast_install" && test -n "$relink_command"; then + $opt_dry_run || { + if $finalize; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file=$func_basename_result + outputname=$tmpdir/$file + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_quiet || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink '$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file=$outputname + else + func_warning "cannot relink '$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name=$func_basename_result + + # Set up the ranlib parameters. + oldlib=$destdir/$name + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run '$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test install = "$opt_mode" && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $debug_cmd + + my_outputname=$1 + my_originator=$2 + my_pic_p=${3-false} + my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms=${my_outputname}S.c + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist=$output_objdir/$my_outputname.nm + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* External symbol declarations for the compiler. */\ +" + + if test yes = "$dlself"; then + func_verbose "generating symbol list for '$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from '$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols=$output_objdir/$outputname.exp + $opt_dry_run || { + $RM $export_symbols + eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from '$dlprefile'" + func_basename "$dlprefile" + name=$func_basename_result + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename= + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname"; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename=$func_basename_result + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename"; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + func_show_eval '$RM "${nlist}I"' + if test -n "$global_symbol_to_import"; then + eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[];\ +" + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ +static void lt_syminit(void) +{ + LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; + for (; symbol->name; ++symbol) + {" + $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" + echo >> "$output_objdir/$my_dlsyms" "\ + } +}" + fi + echo >> "$output_objdir/$my_dlsyms" "\ +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{ {\"$my_originator\", (void *) 0}," + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ + {\"@INIT@\", (void *) <_syminit}," + fi + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + $my_pic_p && pic_flag_for_symtable=" $pic_flag" + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' + + # Transform the symbol file into the correct name. + symfileobj=$output_objdir/${my_outputname}S.$objext + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for '$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $debug_cmd + + win32_libid_type=unknown + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + case $nm_interface in + "MS dumpbin") + if func_cygming_ms_implib_p "$1" || + func_cygming_gnu_implib_p "$1" + then + win32_nmres=import + else + win32_nmres= + fi + ;; + *) + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s|.*|import| + p + q + } + }'` + ;; + esac + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $debug_cmd + + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $debug_cmd + + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive that possess that section. Heuristic: eliminate + # all those that have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $debug_cmd + + if func_cygming_gnu_implib_p "$1"; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1"; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result= + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $debug_cmd + + f_ex_an_ar_dir=$1; shift + f_ex_an_ar_oldlib=$1 + if test yes = "$lock_old_archive_extraction"; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test yes = "$lock_old_archive_extraction"; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $debug_cmd + + my_gentop=$1; shift + my_oldlibs=${1+"$@"} + my_oldobjs= + my_xlib= + my_xabs= + my_xdir= + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib=$func_basename_result + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir=$my_gentop/$my_xlib_u + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + func_basename "$darwin_archive" + darwin_base_archive=$func_basename_result + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches; do + func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" + $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" + cd "unfat-$$/$darwin_base_archive-$darwin_arch" + func_extract_an_archive "`pwd`" "$darwin_base_archive" + cd "$darwin_curdir" + $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result=$my_oldobjs +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory where it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ that is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options that match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test yes = "$fast_install"; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + \$ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* declarations of non-ANSI functions */ +#if defined __MINGW32__ +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined __CYGWIN__ +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined other_platform || defined ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined _MSC_VER +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +#elif defined __MINGW32__ +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined __CYGWIN__ +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined other platforms ... */ +#endif + +#if defined PATH_MAX +# define LT_PATHMAX PATH_MAX +#elif defined MAXPATHLEN +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ + defined __OS2__ +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free (stale); stale = 0; } \ +} while (0) + +#if defined LT_DEBUGWRAPPER +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + size_t tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined HAVE_DOS_BASED_FILE_SYSTEM + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined HAVE_DOS_BASED_FILE_SYSTEM + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = (size_t) (q - p); + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (STREQ (str, pat)) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + size_t len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + size_t orig_value_len = strlen (orig_value); + size_t add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + size_t len = strlen (new_value); + while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[--len] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $debug_cmd + + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $debug_cmd + + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # what system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll that has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + os2dllname= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=false + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module=$wl-single_module + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test yes != "$build_libtool_libs" \ + && func_fatal_configuration "cannot build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg=$1 + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir=$arg + prev= + continue + ;; + dlfiles|dlprefiles) + $preload || { + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=: + } + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test no = "$dlself"; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test dlprefiles = "$prev"; then + dlself=yes + elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test dlfiles = "$prev"; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols=$arg + test -f "$arg" \ + || func_fatal_error "symbol file '$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex=$arg + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir=$arg + prev= + continue + ;; + mllvm) + # Clang does not use LLVM to link, so we can simply discard any + # '-mllvm $arg' options when doing the link step. + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + if test none != "$pic_object"; then + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + fi + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file '$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + os2dllname) + os2dllname=$arg + prev= + continue + ;; + precious_regex) + precious_files_regex=$arg + prev= + continue + ;; + release) + release=-$arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test rpath = "$prev"; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds=$arg + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg=$arg + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "'-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test X-export-symbols = "X$arg"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between '-L' and '$1'" + else + func_fatal_error "need path for '-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of '$dir'" + dir=$absdir + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test X-lc = "X$arg" || test X-lm = "X$arg"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test X-lc = "X$arg" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc due to us having libc/libc_r. + test X-lc = "X$arg" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test X-lc = "X$arg" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test X-lc = "X$arg" && continue + ;; + esac + elif test X-lc_r = "X$arg"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -mllvm) + prev=mllvm + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module=$wl-multi_module + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "'-no-install' is ignored for $host" + func_warning "assuming '-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -os2dllname) + prev=os2dllname + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # -fstack-protector* stack protector flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -specs=* GCC specs files + # -stdlib=* select c++ std lib with clang + # -fsanitize=* Clang/GCC memory and address sanitizer + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ + -specs=*|-fsanitize=*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + -Z*) + if test os2 = "`expr $host : '.*\(os2\)'`"; then + # OS/2 uses -Zxxx to specify OS/2-specific options + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case $arg in + -Zlinker | -Zstack) + prev=xcompiler + ;; + esac + continue + else + # Otherwise treat like 'Some other compiler flag' below + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + fi + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + test none = "$pic_object" || { + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + } + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test dlfiles = "$prev"; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test dlprefiles = "$prev"; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the '$prevarg' option requires an argument" + + if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname=$func_basename_result + libobjs_save=$libobjs + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + # Definition is injected by LT_CONFIG during libtool generation. + func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" + + func_dirname "$output" "/" "" + output_objdir=$func_dirname_result$objdir + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test lib = "$linkmode"; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=false + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test lib,link = "$linkmode,$pass"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs=$tmp_deplibs + fi + + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass"; then + libs=$deplibs + deplibs= + fi + if test prog = "$linkmode"; then + case $pass in + dlopen) libs=$dlfiles ;; + dlpreopen) libs=$dlprefiles ;; + link) + libs="$deplibs %DEPLIBS%" + test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" + ;; + esac + fi + if test lib,dlpreopen = "$linkmode,$pass"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs=$dlprefiles + fi + if test dlopen = "$pass"; then + # Collect dlpreopened libraries + save_deplibs=$deplibs + deplibs= + fi + + for deplib in $libs; do + lib= + found=false + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test lib != "$linkmode" && test prog != "$linkmode"; then + func_warning "'-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test lib = "$linkmode"; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib=$searchdir/lib$name$search_ext + if test -f "$lib"; then + if test .la = "$search_ext"; then + found=: + else + found=false + fi + break 2 + fi + done + done + if $found; then + # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll=$l + done + if test "X$ll" = "X$old_library"; then # only static version available + found=false + func_dirname "$lib" "" "." + ladir=$func_dirname_result + lib=$ladir/$old_library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + else + # deplib doesn't seem to be a libtool library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + ;; # -l + *.ltframework) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test conv = "$pass" && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + if test scan = "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "'-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test link = "$pass"; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=false + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=: + fi + ;; + pass_all) + valid_a_lib=: + ;; + esac + if $valid_a_lib; then + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + else + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + fi + ;; + esac + continue + ;; + prog) + if test link != "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + elif test prog = "$linkmode"; then + if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=: + continue + ;; + esac # case $deplib + + $found || test -f "$lib" \ + || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "'$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir=$func_dirname_result + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass" || + { test prog != "$linkmode" && test lib != "$linkmode"; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test conv = "$pass"; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + elif test prog != "$linkmode" && test lib != "$linkmode"; then + func_fatal_error "'$lib' is not a convenience library" + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test yes = "$prefer_static_libs" || + test built,no = "$prefer_static_libs,$installed"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib=$l + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + + # This library was specified with -dlopen. + if test dlopen = "$pass"; then + test -z "$libdir" \ + && func_fatal_error "cannot -dlopen a convenience library: '$lib'" + if test -z "$dlname" || + test yes != "$dlopen_support" || + test no = "$build_libtool_libs" + then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of '$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir=$ladir + fi + ;; + esac + func_basename "$lib" + laname=$func_basename_result + + # Find the relevant object directory and library name. + if test yes = "$installed"; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library '$lib' was moved." + dir=$ladir + absdir=$abs_ladir + libdir=$abs_ladir + else + dir=$lt_sysroot$libdir + absdir=$lt_sysroot$libdir + fi + test yes = "$hardcode_automatic" && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir=$ladir + absdir=$abs_ladir + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir=$ladir/$objdir + absdir=$abs_ladir/$objdir + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test dlpreopen = "$pass"; then + if test -z "$libdir" && test prog = "$linkmode"; then + func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" + fi + case $host in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test lib = "$linkmode"; then + deplibs="$dir/$old_library $deplibs" + elif test prog,link = "$linkmode,$pass"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test prog = "$linkmode" && test link != "$pass"; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=false + if test no != "$link_all_deplibs" || test -z "$library_names" || + test no = "$build_libtool_libs"; then + linkalldeplibs=: + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if $linkalldeplibs; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test prog,link = "$linkmode,$pass"; then + if test -n "$library_names" && + { { test no = "$prefer_static_libs" || + test built,yes = "$prefer_static_libs,$installed"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then + # Make sure the rpath contains only unique directories. + case $temp_rpath: in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if $alldeplibs && + { test pass_all = "$deplibs_check_method" || + { test yes = "$build_libtool_libs" && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test built = "$use_static_libs" && test yes = "$installed"; then + use_static_libs=no + fi + if test -n "$library_names" && + { test no = "$use_static_libs" || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc* | *os2*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test no = "$installed"; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule= + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule=$dlpremoduletest + break + fi + done + if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then + echo + if test prog = "$linkmode"; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test lib = "$linkmode" && + test yes = "$hardcode_into_libs"; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname=$1 + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname=$dlname + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc* | *os2*) + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + esac + eval soname=\"$soname_spec\" + else + soname=$realname + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot=$soname + func_basename "$soroot" + soname=$func_basename_result + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from '$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for '$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test prog = "$linkmode" || test relink != "$opt_mode"; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test no = "$hardcode_direct"; then + add=$dir/$linklib + case $host in + *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; + *-*-sysv4*uw2*) add_dir=-L$dir ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir=-L$dir ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we cannot + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library"; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add=$dir/$old_library + fi + elif test -n "$old_library"; then + add=$dir/$old_library + fi + fi + esac + elif test no = "$hardcode_minus_L"; then + case $host in + *-*-sunos*) add_shlibpath=$dir ;; + esac + add_dir=-L$dir + add=-l$name + elif test no = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + relink) + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$dir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$absdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test yes != "$lib_linked"; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test prog = "$linkmode"; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test yes != "$hardcode_direct" && + test yes != "$hardcode_minus_L" && + test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test prog = "$linkmode" || test relink = "$opt_mode"; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$libdir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$libdir + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add=-l$name + elif test yes = "$hardcode_automatic"; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib"; then + add=$inst_prefix_dir$libdir/$linklib + else + add=$libdir/$linklib + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir=-L$libdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + fi + + if test prog = "$linkmode"; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test prog = "$linkmode"; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test unsupported != "$hardcode_direct"; then + test -n "$old_library" && linklib=$old_library + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test yes = "$build_libtool_libs"; then + # Not a shared library + if test pass_all != "$deplibs_check_method"; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system cannot link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test yes = "$module"; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test lib = "$linkmode"; then + if test -n "$dependency_libs" && + { test yes != "$hardcode_into_libs" || + test yes = "$build_old_libs" || + test yes = "$link_static"; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs=$temp_deplibs + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test no != "$link_all_deplibs"; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path=$deplib ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of '$dir'" + absdir=$dir + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names"; then + for tmp in $deplibrary_names; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl"; then + depdepl=$absdir/$objdir/$depdepl + darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" + func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" + path= + fi + fi + ;; + *) + path=-L$absdir/$objdir + ;; + esac + else + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "'$deplib' seems to be moved" + + path=-L$absdir + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test link = "$pass"; then + if test prog = "$linkmode"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs=$newdependency_libs + if test dlpreopen = "$pass"; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test dlopen != "$pass"; then + test conv = "$pass" || { + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + } + + if test prog,link = "$linkmode,$pass"; then + vars="compile_deplibs finalize_deplibs" + else + vars=deplibs + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + + # Add Sun CC postdeps if required: + test CXX = "$tagname" && { + case $host_os in + linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C++ 5.9 + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + func_cc_basename "$CC" + case $func_cc_basename_result in + CC* | sunCC*) + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + esac + } + + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i= + ;; + esac + if test -n "$i"; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test prog = "$linkmode"; then + dlfiles=$newdlfiles + fi + if test prog = "$linkmode" || test lib = "$linkmode"; then + dlprefiles=$newdlprefiles + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "'-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "'-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs=$output + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form 'libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test no = "$module" \ + && func_fatal_help "libtool library '$output' must begin with 'lib'" + + if test no != "$need_lib_prefix"; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test pass_all != "$deplibs_check_method"; then + func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test no = "$dlself" \ + || func_warning "'-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test 1 -lt "$#" \ + && func_warning "ignoring multiple '-rpath's for a libtool library" + + install_libdir=$1 + + oldlibs= + if test -z "$rpath"; then + if test yes = "$build_libtool_libs"; then + # Building a libtool convenience library. + # Some compilers have problems with a '.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "'-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs=$IFS; IFS=: + set dummy $vinfo 0 0 0 + shift + IFS=$save_ifs + + test -n "$7" && \ + func_fatal_help "too many parameters to '-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major=$1 + number_minor=$2 + number_revision=$3 + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # that has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|freebsd-elf|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_revision + ;; + freebsd-aout|qnx|sunos) + current=$number_major + revision=$number_minor + age=0 + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_minor + lt_irix_increment=no + ;; + *) + func_fatal_configuration "$modename: unknown library version type '$version_type'" + ;; + esac + ;; + no) + current=$1 + revision=$2 + age=$3 + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT '$current' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION '$revision' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE '$age' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE '$age' is greater than the current interface number '$current'" + func_fatal_error "'$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + # On Darwin other compilers + case $CC in + nagfor*) + verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + ;; + *) + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + esac + ;; + + freebsd-aout) + major=.$current + versuffix=.$current.$revision + ;; + + freebsd-elf) + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + irix | nonstopux) + if test no = "$lt_irix_increment"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring=$verstring_prefix$major.$revision + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test 0 -ne "$loop"; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring_prefix$major.$iface:$verstring + done + + # Before this point, $major must not contain '.'. + major=.$major + versuffix=$major.$revision + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=.$current.$age.$revision + verstring=$current.$age.$revision + + # Add in all the interfaces that we are compatible with. + loop=$age + while test 0 -ne "$loop"; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring:$iface.0 + done + + # Make executables depend on our current version. + func_append verstring ":$current.0" + ;; + + qnx) + major=.$current + versuffix=.$current + ;; + + sco) + major=.$current + versuffix=.$current + ;; + + sunos) + major=.$current + versuffix=.$current.$revision + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 file systems. + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + + *) + func_fatal_configuration "unknown library version type '$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring=0.0 + ;; + esac + if test no = "$need_version"; then + versuffix= + else + versuffix=.0.0 + fi + fi + + # Remove version info from name if versioning should be avoided + if test yes,no = "$avoid_version,$need_version"; then + major= + versuffix= + verstring= + fi + + # Check to see if the archive will have undefined symbols. + if test yes = "$allow_undefined"; then + if test unsupported = "$allow_undefined_flag"; then + if test yes = "$build_old_libs"; then + func_warning "undefined symbols not allowed in $host shared libraries; building static only" + build_libtool_libs=no + else + func_fatal_error "can't build $host shared library unless -no-undefined is specified" + fi + fi + else + # Don't allow undefined symbols. + allow_undefined_flag=$no_undefined_flag + fi + + fi + + func_generate_dlsyms "$libname" "$libname" : + func_append libobjs " $symfileobj" + test " " = "$libobjs" && libobjs= + + if test relink != "$opt_mode"; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) + if test -n "$precious_files_regex"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles=$dlfiles + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles=$dlprefiles + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test yes = "$build_libtool_libs"; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test yes = "$build_libtool_need_lc"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release= + versuffix= + major= + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib=$potent_lib + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | $SED 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; + *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib= + ;; + esac + fi + if test -n "$a_deplib"; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib=$potent_lib # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs= + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + for i in $predeps $postdeps; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test none = "$deplibs_check_method"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test yes = "$droppeddeps"; then + if test yes = "$module"; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test no = "$allow_undefined"; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs=$new_libs + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test yes = "$build_libtool_libs"; then + # Remove $wl instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test yes = "$hardcode_into_libs"; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath=$finalize_rpath + test relink = "$opt_mode" || rpath=$compile_rpath$rpath + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath=$finalize_shlibpath + test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname=$1 + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname=$realname + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib=$output_objdir/$realname + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols=$output_objdir/$libname.uexp + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + func_dll_def_p "$export_symbols" || { + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols=$export_symbols + export_symbols= + always_export_symbols=yes + } + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs=$IFS; IFS='~' + for cmd1 in $cmds; do + IFS=$save_ifs + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test yes = "$try_normal_branch" \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=$output_objdir/$output_la.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS=$save_ifs + if test -n "$export_symbols_regex" && test : != "$skipped_export"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test : != "$skipped_export" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs=$tmp_deplibs + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test yes = "$compiler_needs_object" && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test : != "$skipped_export" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then + output=$output_objdir/$output_la.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then + output=$output_objdir/$output_la.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test yes = "$compiler_needs_object"; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-$k.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test -z "$objlist" || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test 1 -eq "$k"; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-$k.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-$k.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + ${skipped_export-false} && { + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + } + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs=$IFS; IFS='~' + for cmd in $concat_cmds; do + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + ${skipped_export-false} && { + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + } + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs=$IFS; IFS='~' + for cmd in $cmds; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test yes = "$module" || test yes = "$export_dynamic"; then + # On all known operating systems, these are identical. + dlname=$soname + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "'-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object '$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj=$output + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # if reload_cmds runs $LD directly, get rid of -Wl from + # whole_archive_flag_spec and hope we can get by with turning comma + # into space. + case $reload_cmds in + *\$LD[\ \$]*) wl= ;; + esac + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags + else + gentop=$output_objdir/${obj}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test yes = "$build_libtool_libs" || libobjs=$non_pic_objects + + # Create the old-style object. + reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs + + output=$obj + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + test yes = "$build_libtool_libs" || { + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + } + + if test -n "$pic_flag" || test default != "$pic_mode"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output=$libobj + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "'-release' is ignored for programs" + + $preload \ + && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ + && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test CXX = "$tagname"; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " $wl-bind_at_load" + func_append finalize_command " $wl-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs=$new_libs + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath=$rpath + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath=$rpath + + if test -n "$libobjs" && test yes = "$build_old_libs"; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" false + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=: + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=false + ;; + *cygwin* | *mingw* ) + test yes = "$build_libtool_libs" || wrappers_required=false + ;; + *) + if test no = "$need_relink" || test yes != "$build_libtool_libs"; then + wrappers_required=false + fi + ;; + esac + $wrappers_required || { + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command=$compile_command$compile_rpath + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.$objext"; then + func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' + fi + + exit $exit_status + } + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test yes = "$no_install"; then + # We don't need to create a wrapper script. + link_command=$compile_var$compile_command$compile_rpath + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + case $hardcode_action,$fast_install in + relink,*) + # Fast installation is not supported + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "'$output' will be relinked during installation" + ;; + *,yes) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + ;; + *,no) + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + ;; + *,needless) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command= + ;; + esac + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource=$output_path/$objdir/lt-$output_name.c + cwrapper=$output_path/$output_name.exe + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host"; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + case $build_libtool_libs in + convenience) + oldobjs="$libobjs_save $symfileobj" + addlibs=$convenience + build_libtool_libs=no + ;; + module) + oldobjs=$libobjs_save + addlibs=$old_convenience + build_libtool_libs=no + ;; + *) + oldobjs="$old_deplibs $non_pic_objects" + $preload && test -f "$symfileobj" \ + && func_append oldobjs " $symfileobj" + addlibs=$old_convenience + ;; + esac + + if test -n "$addlibs"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase=$func_basename_result + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj"; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test -z "$oldobjs"; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test yes = "$build_old_libs" && old_library=$libname.$libext + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test yes = "$hardcode_automatic"; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test yes = "$installed"; then + if test -z "$install_libdir"; then + break + fi + output=$output_objdir/${outputname}i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name=$func_basename_result + func_resolve_sysroot "$deplib" + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs=$newdependency_libs + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles=$newdlprefiles + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles=$newdlprefiles + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test -n "$bindir"; then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result/$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test no,yes = "$installed,$need_relink"; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +if test link = "$opt_mode" || test relink = "$opt_mode"; then + func_mode_link ${1+"$@"} +fi + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $debug_cmd + + RM=$nonopt + files= + rmforce=false + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=: ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir=$func_dirname_result + if test . = "$dir"; then + odir=$objdir + else + odir=$dir/$objdir + fi + func_basename "$file" + name=$func_basename_result + test uninstall = "$opt_mode" && odir=$dir + + # Remember odir for removal later, being careful to avoid duplicates + if test clean = "$opt_mode"; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif $rmforce; then + continue + fi + + rmfiles=$file + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case $opt_mode in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && test none != "$pic_object"; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && test none != "$non_pic_object"; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test clean = "$opt_mode"; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.$objext" + if test yes = "$fast_install" && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name"; then + func_append rmfiles " $odir/lt-$noexename.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the $objdir's in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then + func_mode_uninstall ${1+"$@"} +fi + +test -z "$opt_mode" && { + help=$generic_help + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode '$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# where we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/libs/shapelib/m4/libtool.m4 b/libs/shapelib/m4/libtool.m4 new file mode 100644 index 0000000..10ab284 --- /dev/null +++ b/libs/shapelib/m4/libtool.m4 @@ -0,0 +1,8388 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +]) + +# serial 58 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_PREPARE_CC_BASENAME +# ----------------------- +m4_defun([_LT_PREPARE_CC_BASENAME], [ +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} +])# _LT_PREPARE_CC_BASENAME + + +# _LT_CC_BASENAME(CC) +# ------------------- +# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, +# but that macro is also expanded into generated libtool script, which +# arranges for $SED and $ECHO to be set by different means. +m4_defun([_LT_CC_BASENAME], +[m4_require([_LT_PREPARE_CC_BASENAME])dnl +AC_REQUIRE([_LT_DECL_SED])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl +func_cc_basename $1 +cc_basename=$func_cc_basename_result +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl +m4_require([_LT_CMD_TRUNCATE])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from 'configure', and 'config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# 'config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain=$ac_aux_dir/ltmain.sh +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the 'libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to 'config.status' so that its +# declaration there will have the same value as in 'configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags='_LT_TAGS'dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into 'config.status', and then the shell code to quote escape them in +# for loops in 'config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# '#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test 0 = "$lt_write_fail" && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +'$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test 0 != $[#] +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try '$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try '$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test yes = "$silent" && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +_LT_COPYING +_LT_LIBTOOL_TAGS + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +_LT_PREPARE_MUNGE_PATH_LIST +_LT_PREPARE_CC_BASENAME + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +m4_ifndef([AC_PROG_GO], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS=$save_LDFLAGS + ]) + + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[[012]][[,.]]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test yes = "$lt_cv_ld_force_load"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + m4_if([$1], [CXX], +[ if test yes != "$lt_cv_apple_cc_single_mod"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script that will find a shell with a builtin +# printf (that we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case $ECHO in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], + [Search for dependent libraries within DIR (or the compiler's sysroot + if not specified).])], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([$with_sysroot]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and where our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test yes = "[$]$2"; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS +]) + +if test yes = "[$]$2"; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n "$lt_cv_sys_max_cmd_len"; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes = "$cross_compiling"; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen=shl_load], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen=dlopen], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links=nottested +if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test no = "$hard_links"; then + AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", + [Define to the sub-directory where libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then + + # We can hardcode non-existent directories. + if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && + test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || + test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_PREPARE_MUNGE_PATH_LIST +# --------------------------- +# Make sure func_munge_path_list() is defined correctly. +m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], +[[# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} +]])# _LT_PREPARE_PATH_LIST + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +AC_ARG_VAR([LT_SYS_LIBRARY_PATH], +[User-defined run-time library search path.]) + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[[4-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a[(]lib.so.V[)]' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[23]].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], + [Detected run-time system search path for libraries]) +_LT_DECL([], [configure_time_lt_sys_library_path], [2], + [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program that can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$1"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac]) +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program that can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test no = "$withval" || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], +[if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi]) +rm -f conftest.i conftest2.i conftest.out]) +])# _LT_PATH_DD + + +# _LT_CMD_TRUNCATE +# ---------------- +# find command to truncate a binary pipe +m4_defun([_LT_CMD_TRUNCATE], +[m4_require([_LT_PATH_DD]) +AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], +[printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) +_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], + [Command to truncate a binary pipe]) +])# _LT_CMD_TRUNCATE + + +# _LT_CHECK_MAGIC_METHOD +# ---------------------- +# how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_MAGIC_METHOD], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +AC_CACHE_CHECK([how to recognize dependent libraries], +lt_cv_deplibs_check_method, +[lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[[4-9]]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[[45]]*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi]) +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# _LT_DLL_DEF_P([FILE]) +# --------------------- +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with func_dll_def_p in the libtool script +AC_DEFUN([_LT_DLL_DEF_P], +[dnl + test DEF = "`$SED -n dnl + -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace + -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments + -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl + -e q dnl Only consider the first "real" line + $1`" dnl +])# _LT_DLL_DEF_P + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM=-lm) + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], + [Transform the output of nm into a list of symbols to manually relocate]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([nm_interface], [lt_cv_nm_interface], [1], + [The name lister interface]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test yes = "$GCC"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS=$save_LDFLAGS]) + if test yes = "$lt_cv_irix_exported_symbol"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + _LT_TAGVAR(link_all_deplibs, $1)=no + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(ld_shlibs, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + osf3*) + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting $shlibpath_var if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC=$CC +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report what library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC=$lt_save_CC +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test yes = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='$wl' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GXX"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + + _LT_TAGVAR(GCC, $1)=$GXX + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test yes != "$_lt_caught_CXX_error" + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case @S|@2 in + .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; + *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)=$prev$p + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)=$p + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)=$p + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test no = "$F77"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_F77"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$G77 + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_F77" + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test no = "$FC"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_FC"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_FC" + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code=$lt_simple_compile_test_code + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f "$lt_ac_sed" && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test 10 -lt "$lt_ac_count" && break + lt_ac_count=`expr $lt_ac_count + 1` + if test "$lt_ac_count" -gt "$lt_ac_max"; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine what file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS diff --git a/libs/shapelib/m4/ltoptions.m4 b/libs/shapelib/m4/ltoptions.m4 new file mode 100644 index 0000000..94b0829 --- /dev/null +++ b/libs/shapelib/m4/ltoptions.m4 @@ -0,0 +1,437 @@ +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 8 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option '$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl 'shared' nor 'disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], + [_LT_WITH_AIX_SONAME([aix])]) + ]) +])# _LT_SET_OPTIONS + + +## --------------------------------- ## +## Macros to handle LT_INIT options. ## +## --------------------------------- ## + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [1], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the 'shared' and +# 'disable-shared' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the 'static' and +# 'disable-static' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the 'fast-install' +# and 'disable-fast-install' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_AIX_SONAME([DEFAULT]) +# ---------------------------------- +# implement the --with-aix-soname flag, and support the `aix-soname=aix' +# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT +# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. +m4_define([_LT_WITH_AIX_SONAME], +[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl +shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[[5-9]]*,yes) + AC_MSG_CHECKING([which variant of shared library versioning to provide]) + AC_ARG_WITH([aix-soname], + [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], + [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], + [case $withval in + aix|svr4|both) + ;; + *) + AC_MSG_ERROR([Unknown argument to --with-aix-soname]) + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname], + [AC_CACHE_VAL([lt_cv_with_aix_soname], + [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) + with_aix_soname=$lt_cv_with_aix_soname]) + AC_MSG_RESULT([$with_aix_soname]) + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + +_LT_DECL([], [shared_archive_member_spec], [0], + [Shared archive member basename, for filename based shared library versioning on AIX])dnl +])# _LT_WITH_AIX_SONAME + +LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the 'pic-only' and 'no-pic' +# LT_INIT options. +# MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [pic_mode=m4_default([$1], [default])]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + +## ----------------- ## +## LTDL_INIT Options ## +## ----------------- ## + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/libs/shapelib/m4/ltsugar.m4 b/libs/shapelib/m4/ltsugar.m4 new file mode 100644 index 0000000..48bc934 --- /dev/null +++ b/libs/shapelib/m4/ltsugar.m4 @@ -0,0 +1,124 @@ +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59, which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) diff --git a/libs/shapelib/m4/ltversion.m4 b/libs/shapelib/m4/ltversion.m4 new file mode 100644 index 0000000..fa04b52 --- /dev/null +++ b/libs/shapelib/m4/ltversion.m4 @@ -0,0 +1,23 @@ +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# @configure_input@ + +# serial 4179 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4.6]) +m4_define([LT_PACKAGE_REVISION], [2.4.6]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4.6' +macro_revision='2.4.6' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) diff --git a/libs/shapelib/m4/lt~obsolete.m4 b/libs/shapelib/m4/lt~obsolete.m4 new file mode 100644 index 0000000..c6b26f8 --- /dev/null +++ b/libs/shapelib/m4/lt~obsolete.m4 @@ -0,0 +1,99 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 5 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) diff --git a/libs/shapelib/makefile.vc b/libs/shapelib/makefile.vc new file mode 100644 index 0000000..33e90ba --- /dev/null +++ b/libs/shapelib/makefile.vc @@ -0,0 +1,90 @@ + +#CFLAGS = /DSHPAPI_CALL=__stdcall +# 4100: 'identifier' : unreferenced formal parameter +CFLAGS = /nologo /Ox /MD /W4 /wd4100 /D_CRT_SECURE_NO_DEPRECATE /DSHAPELIB_DLLEXPORT + +IMPORT_LIB = shapelib_i.lib +STATIC_LIB = shapelib.lib +DLLNAME = shapelib.dll +LINK_LIB = $(IMPORT_LIB) + +OBJ = shpopen.obj dbfopen.obj shptree.obj safileio.obj sbnsearch.obj + +all: $(STATIC_LIB) $(DLLNAME) \ + shpcreate.exe shpadd.exe shpdump.exe shprewind.exe dbfcreate.exe \ + dbfadd.exe dbfdump.exe shptest.exe shptreedump.exe + +shpopen.obj: shpopen.c shapefil.h + $(CC) $(CFLAGS) -c shpopen.c + +shptree.obj: shptree.c shapefil.h + $(CC) $(CFLAGS) -c shptree.c + +dbfopen.obj: dbfopen.c shapefil.h + $(CC) $(CFLAGS) -c dbfopen.c + +safileio.obj: safileio.c shapefil.h + $(CC) $(CFLAGS) -c safileio.c + +sbnsearch.obj: sbnsearch.c shapefil.h + $(CC) $(CFLAGS) -c sbnsearch.c + +shpcreate.exe: shpcreate.c $(LINK_LIB) + $(CC) $(CFLAGS) shpcreate.c $(LINK_LIB) $(LINKOPT) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +shpadd.exe: shpadd.c $(LINK_LIB) + $(CC) $(CFLAGS) shpadd.c $(LINK_LIB) $(LINKOPT) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +shpdump.exe: shpdump.c $(LINK_LIB) + $(CC) $(CFLAGS) shpdump.c $(LINK_LIB) $(LINKOPT) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +shprewind.exe: shprewind.c $(LINK_LIB) + $(CC) $(CFLAGS) shprewind.c $(LINK_LIB) $(LINKOPT) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +dbfcreate.exe: dbfcreate.c $(LINK_LIB) + $(CC) $(CFLAGS) dbfcreate.c $(LINK_LIB) $(LINKOPT) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +dbfadd.exe: dbfadd.c $(LINK_LIB) + $(CC) $(CFLAGS) dbfadd.c $(LINK_LIB) $(LINKOPT) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +dbfdump.exe: dbfdump.c $(LINK_LIB) + $(CC) $(CFLAGS) dbfdump.c $(LINK_LIB) $(LINKOPT) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +shptest.exe: shptest.c $(LINK_LIB) + $(CC) $(CFLAGS) shptest.c $(LINK_LIB) $(LINKOPT) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +shputils.exe: shputils.c $(LINK_LIB) + $(CC) $(CFLAGS) shputils.c $(LINK_LIB) $(LINKOPT) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +shptreedump.exe: shptreedump.c $(LINK_LIB) + $(CC) $(CFLAGS) shptreedump.c $(LINK_LIB) $(LINKOPT) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +shpdiff.exe: shpdiff.c $(LINK_LIB) + $(CC) $(CFLAGS) shpdiff.c $(LINK_LIB) $(LINKOPT) + if exist $@.manifest mt -manifest $@.manifest -outputresource:$@;1 + +clean: + -del *.obj + -del *.exe + -del *.lib + -del *.dll + -del *.manifest + +$(STATIC_LIB): $(OBJ) + lib /nologo /out:$(STATIC_LIB) $(OBJ) + +$(IMPORT_LIB): $(DLLNAME) + +$(DLLNAME): $(OBJ) + link /nologo /dll /out:$(DLLNAME) /implib:$(IMPORT_LIB) $(OBJ) + if exist $(DLLNAME).manifest mt /nologo -manifest $(DLLNAME).manifest -outputresource:$(DLLNAME);2 diff --git a/libs/shapelib/missing b/libs/shapelib/missing new file mode 100755 index 0000000..f62bbae --- /dev/null +++ b/libs/shapelib/missing @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2013-10-28.13; # UTC + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try '$0 --help' for more information" + exit 1 +fi + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" + exit 1 + ;; + +esac + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=http://www.perl.org/ +flex_URL=http://flex.sourceforge.net/ +gnu_software_URL=http://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/libs/shapelib/safileio.c b/libs/shapelib/safileio.c new file mode 100644 index 0000000..533e7ad --- /dev/null +++ b/libs/shapelib/safileio.c @@ -0,0 +1,291 @@ +/****************************************************************************** + * $Id: safileio.c,v 1.5 2016-12-05 12:44:05 erouault Exp $ + * + * Project: Shapelib + * Purpose: Default implementation of file io based on stdio. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 2007, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * $Log: safileio.c,v $ + * Revision 1.5 2016-12-05 12:44:05 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.4 2008-01-16 20:05:14 bram + * Add file hooks that accept UTF-8 encoded filenames on some platforms. Use SASetupUtf8Hooks + * tosetup the hooks and check SHPAPI_UTF8_HOOKS for its availability. Currently, this + * is only available on the Windows platform that decodes the UTF-8 filenames to wide + * character strings and feeds them to _wfopen and _wremove. + * + * Revision 1.3 2007/12/18 18:28:11 bram + * - create hook for client specific atof (bugzilla ticket 1615) + * - check for NULL handle before closing cpCPG file, and close after reading. + * + * Revision 1.2 2007/12/15 20:25:30 bram + * dbfopen.c now reads the Code Page information from the DBF file, and exports + * this information as a string through the DBFGetCodePage function. This is + * either the number from the LDID header field ("LDID/") or as the + * content of an accompanying .CPG file. When creating a DBF file, the code can + * be set using DBFCreateEx. + * + * Revision 1.1 2007/12/06 06:56:41 fwarmerdam + * new + * + */ + +#include "shapefil.h" + +#include +#include +#include +#include +#include +#include + +SHP_CVSID("$Id: safileio.c,v 1.5 2016-12-05 12:44:05 erouault Exp $"); + +#ifdef SHPAPI_UTF8_HOOKS +# ifdef SHPAPI_WINDOWS +# define WIN32_LEAN_AND_MEAN +# define NOMINMAX +# include +# pragma comment(lib, "kernel32.lib") +# endif +#endif + +/************************************************************************/ +/* SADFOpen() */ +/************************************************************************/ + +SAFile SADFOpen( const char *pszFilename, const char *pszAccess ) + +{ + return (SAFile) fopen( pszFilename, pszAccess ); +} + +/************************************************************************/ +/* SADFRead() */ +/************************************************************************/ + +SAOffset SADFRead( void *p, SAOffset size, SAOffset nmemb, SAFile file ) + +{ + return (SAOffset) fread( p, (size_t) size, (size_t) nmemb, + (FILE *) file ); +} + +/************************************************************************/ +/* SADFWrite() */ +/************************************************************************/ + +SAOffset SADFWrite( void *p, SAOffset size, SAOffset nmemb, SAFile file ) + +{ + return (SAOffset) fwrite( p, (size_t) size, (size_t) nmemb, + (FILE *) file ); +} + +/************************************************************************/ +/* SADFSeek() */ +/************************************************************************/ + +SAOffset SADFSeek( SAFile file, SAOffset offset, int whence ) + +{ + return (SAOffset) fseek( (FILE *) file, (long) offset, whence ); +} + +/************************************************************************/ +/* SADFTell() */ +/************************************************************************/ + +SAOffset SADFTell( SAFile file ) + +{ + return (SAOffset) ftell( (FILE *) file ); +} + +/************************************************************************/ +/* SADFFlush() */ +/************************************************************************/ + +int SADFFlush( SAFile file ) + +{ + return fflush( (FILE *) file ); +} + +/************************************************************************/ +/* SADFClose() */ +/************************************************************************/ + +int SADFClose( SAFile file ) + +{ + return fclose( (FILE *) file ); +} + +/************************************************************************/ +/* SADFClose() */ +/************************************************************************/ + +int SADRemove( const char *filename ) + +{ + return remove( filename ); +} + +/************************************************************************/ +/* SADError() */ +/************************************************************************/ + +void SADError( const char *message ) + +{ + fprintf( stderr, "%s\n", message ); +} + +/************************************************************************/ +/* SASetupDefaultHooks() */ +/************************************************************************/ + +void SASetupDefaultHooks( SAHooks *psHooks ) + +{ + psHooks->FOpen = SADFOpen; + psHooks->FRead = SADFRead; + psHooks->FWrite = SADFWrite; + psHooks->FSeek = SADFSeek; + psHooks->FTell = SADFTell; + psHooks->FFlush = SADFFlush; + psHooks->FClose = SADFClose; + psHooks->Remove = SADRemove; + + psHooks->Error = SADError; + psHooks->Atof = atof; +} + + + + +#ifdef SHPAPI_WINDOWS + +/************************************************************************/ +/* Utf8ToWideChar */ +/************************************************************************/ + +const wchar_t* Utf8ToWideChar( const char *pszFilename ) +{ + int nMulti, nWide; + wchar_t *pwszFileName; + + nMulti = strlen(pszFilename) + 1; + nWide = MultiByteToWideChar( CP_UTF8, 0, pszFilename, nMulti, 0, 0); + if( nWide == 0 ) + { + return NULL; + } + pwszFileName = (wchar_t*) malloc(nWide * sizeof(wchar_t)); + if ( pwszFileName == NULL ) + { + return NULL; + } + if( MultiByteToWideChar( CP_UTF8, 0, pszFilename, nMulti, pwszFileName, nWide ) == 0 ) + { + free( pwszFileName ); + return NULL; + } + return pwszFileName; +} + +/************************************************************************/ +/* SAUtf8WFOpen */ +/************************************************************************/ + +SAFile SAUtf8WFOpen( const char *pszFilename, const char *pszAccess ) +{ + SAFile file = NULL; + const wchar_t *pwszFileName, *pwszAccess; + pwszFileName = Utf8ToWideChar( pszFilename ); + pwszAccess = Utf8ToWideChar( pszAccess ); + if( pwszFileName != NULL && pwszFileName != NULL) + { + file = (SAFile) _wfopen( pwszFileName, pwszAccess ); + } + free ((wchar_t*) pwszFileName); + free ((wchar_t*) pwszAccess); + return file; +} + +/************************************************************************/ +/* SAUtf8WRemove() */ +/************************************************************************/ + +int SAUtf8WRemove( const char *pszFilename ) +{ + const wchar_t *pwszFileName = Utf8ToWideChar( pszFilename ); + int rc = -1; + if( pwszFileName != NULL ) + { + rc = _wremove( pwszFileName ); + } + free ((wchar_t*) pwszFileName); + return rc; +} + +#endif + +#ifdef SHPAPI_UTF8_HOOKS + +/************************************************************************/ +/* SASetupUtf8Hooks() */ +/************************************************************************/ + +void SASetupUtf8Hooks( SAHooks *psHooks ) +{ +#ifdef SHPAPI_WINDOWS + psHooks->FOpen = SAUtf8WFOpen; + psHooks->Remove = SAUtf8WRemove; +#else +# error "no implementations of UTF-8 hooks available for this platform" +#endif + psHooks->FRead = SADFRead; + psHooks->FWrite = SADFWrite; + psHooks->FSeek = SADFSeek; + psHooks->FTell = SADFTell; + psHooks->FFlush = SADFFlush; + psHooks->FClose = SADFClose; + + psHooks->Error = SADError; + psHooks->Atof = atof; +} + +#endif diff --git a/libs/shapelib/sbnsearch.c b/libs/shapelib/sbnsearch.c new file mode 100644 index 0000000..acc975b --- /dev/null +++ b/libs/shapelib/sbnsearch.c @@ -0,0 +1,985 @@ +/****************************************************************************** + * $Id: sbnsearch.c,v 1.2 2016-12-05 12:44:05 erouault Exp $ + * + * Project: Shapelib + * Purpose: Implementation of search in ESRI SBN spatial index. + * Author: Even Rouault, even dot rouault at mines dash paris dot org + * + ****************************************************************************** + * Copyright (c) 2012-2014, Even Rouault + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ******************************************************************************/ + +#include "shapefil.h" + +#include +#include +#include +#include + +SHP_CVSID("$Id: sbnsearch.c,v 1.2 2016-12-05 12:44:05 erouault Exp $") + +#ifndef TRUE +# define TRUE 1 +# define FALSE 0 +#endif + +#ifndef USE_CPL +#if defined(_MSC_VER) +# if _MSC_VER < 1900 +# define snprintf _snprintf +# endif +#elif defined(WIN32) || defined(_WIN32) +# ifndef snprintf +# define snprintf _snprintf +# endif +#endif +#endif + +#define READ_MSB_INT(ptr) \ + (((ptr)[0] << 24) | ((ptr)[1] << 16) | ((ptr)[2] << 8) | (ptr)[3]) + +#define CACHED_DEPTH_LIMIT 8 + +typedef unsigned char uchar; + +typedef int coord; +/*typedef uchar coord;*/ + +typedef struct +{ + uchar *pabyShapeDesc; /* Cache of (nShapeCount * 8) bytes of the bins. May be NULL. */ + int nBinStart; /* Index of first bin for this node. */ + int nShapeCount; /* Number of shapes attached to this node. */ + int nBinCount; /* Number of bins for this node. May be 0 if node is empty. */ + int nBinOffset; /* Offset in file of the start of the first bin. May be 0 if node is empty. */ + + int bBBoxInit; /* TRUE if the following bounding box has been computed. */ + coord bMinX; /* Bounding box of the shapes directly attached to this node. */ + coord bMinY; /* This is *not* the theoretical footprint of the node. */ + coord bMaxX; + coord bMaxY; +} SBNNodeDescriptor; + +struct SBNSearchInfo +{ + SAHooks sHooks; + SAFile fpSBN; + SBNNodeDescriptor *pasNodeDescriptor; + int nShapeCount; /* Total number of shapes */ + int nMaxDepth; /* Tree depth */ + double dfMinX; /* Bounding box of all shapes */ + double dfMaxX; + double dfMinY; + double dfMaxY; + +#ifdef DEBUG_IO + int nTotalBytesRead; +#endif +}; + +typedef struct +{ + SBNSearchHandle hSBN; + + coord bMinX; /* Search bounding box */ + coord bMinY; + coord bMaxX; + coord bMaxY; + + int nShapeCount; + int nShapeAlloc; + int *panShapeId; /* 0 based */ + + uchar abyBinShape[8 * 100]; + +#ifdef DEBUG_IO + int nBytesRead; +#endif +} SearchStruct; + +/************************************************************************/ +/* SwapWord() */ +/* */ +/* Swap a 2, 4 or 8 byte word. */ +/************************************************************************/ + +static void SwapWord( int length, void * wordP ) + +{ + int i; + uchar temp; + + for( i=0; i < length/2; i++ ) + { + temp = ((uchar *) wordP)[i]; + ((uchar *)wordP)[i] = ((uchar *) wordP)[length-i-1]; + ((uchar *) wordP)[length-i-1] = temp; + } +} + +/************************************************************************/ +/* SBNOpenDiskTree() */ +/************************************************************************/ + +SBNSearchHandle SBNOpenDiskTree( const char* pszSBNFilename, + SAHooks *psHooks ) +{ + int i; + SBNSearchHandle hSBN; + uchar abyHeader[108]; + int nShapeCount; + int nMaxDepth; + int nMaxNodes; + int nNodeDescSize; + int nNodeDescCount; + uchar* pabyData = NULL; + SBNNodeDescriptor* pasNodeDescriptor = NULL; + uchar abyBinHeader[8]; + int nCurNode; + int nNextNonEmptyNode; + int nExpectedBinId; + int bBigEndian; + +/* -------------------------------------------------------------------- */ +/* Establish the byte order on this machine. */ +/* -------------------------------------------------------------------- */ + i = 1; + if( *((unsigned char *) &i) == 1 ) + bBigEndian = FALSE; + else + bBigEndian = TRUE; + +/* -------------------------------------------------------------------- */ +/* Initialize the handle structure. */ +/* -------------------------------------------------------------------- */ + hSBN = (SBNSearchHandle) + calloc(sizeof(struct SBNSearchInfo),1); + + if (psHooks == NULL) + SASetupDefaultHooks( &(hSBN->sHooks) ); + else + memcpy( &(hSBN->sHooks), psHooks, sizeof(SAHooks) ); + + hSBN->fpSBN = hSBN->sHooks.FOpen(pszSBNFilename, "rb"); + if (hSBN->fpSBN == NULL) + { + free(hSBN); + return NULL; + } + +/* -------------------------------------------------------------------- */ +/* Check file header signature. */ +/* -------------------------------------------------------------------- */ + if (hSBN->sHooks.FRead(abyHeader, 108, 1, hSBN->fpSBN) != 1 || + abyHeader[0] != 0 || + abyHeader[1] != 0 || + abyHeader[2] != 0x27 || + (abyHeader[3] != 0x0A && abyHeader[3] != 0x0D) || + abyHeader[4] != 0xFF || + abyHeader[5] != 0xFF || + abyHeader[6] != 0xFE || + abyHeader[7] != 0x70) + { + hSBN->sHooks.Error( ".sbn file is unreadable, or corrupt." ); + SBNCloseDiskTree(hSBN); + return NULL; + } + +/* -------------------------------------------------------------------- */ +/* Read shapes bounding box. */ +/* -------------------------------------------------------------------- */ + + memcpy(&hSBN->dfMinX, abyHeader + 32, 8); + memcpy(&hSBN->dfMinY, abyHeader + 40, 8); + memcpy(&hSBN->dfMaxX, abyHeader + 48, 8); + memcpy(&hSBN->dfMaxY, abyHeader + 56, 8); + + if( !bBigEndian ) + { + SwapWord(8, &hSBN->dfMinX); + SwapWord(8, &hSBN->dfMinY); + SwapWord(8, &hSBN->dfMaxX); + SwapWord(8, &hSBN->dfMaxY); + } + + if( hSBN->dfMinX > hSBN->dfMaxX || + hSBN->dfMinY > hSBN->dfMaxY ) + { + hSBN->sHooks.Error( "Invalid extent in .sbn file." ); + SBNCloseDiskTree(hSBN); + return NULL; + } + +/* -------------------------------------------------------------------- */ +/* Read and check number of shapes. */ +/* -------------------------------------------------------------------- */ + nShapeCount = READ_MSB_INT(abyHeader + 28); + hSBN->nShapeCount = nShapeCount; + if (nShapeCount < 0 || nShapeCount > 256000000 ) + { + char szErrorMsg[64]; + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Invalid shape count in .sbn : %d", nShapeCount ); + hSBN->sHooks.Error( szErrorMsg ); + SBNCloseDiskTree(hSBN); + return NULL; + } + + /* Empty spatial index */ + if( nShapeCount == 0 ) + { + return hSBN; + } + +/* -------------------------------------------------------------------- */ +/* Compute tree depth. */ +/* It is computed such as in average there are not more than 8 */ +/* shapes per node. With a minimum depth of 2, and a maximum of 24 */ +/* -------------------------------------------------------------------- */ + nMaxDepth = 2; + while( nMaxDepth < 24 && nShapeCount > ((1 << nMaxDepth) - 1) * 8 ) + nMaxDepth ++; + hSBN->nMaxDepth = nMaxDepth; + nMaxNodes = (1 << nMaxDepth) - 1; + +/* -------------------------------------------------------------------- */ +/* Check that the first bin id is 1. */ +/* -------------------------------------------------------------------- */ + + if( READ_MSB_INT(abyHeader + 100) != 1 ) + { + hSBN->sHooks.Error( "Unexpected bin id" ); + SBNCloseDiskTree(hSBN); + return NULL; + } + +/* -------------------------------------------------------------------- */ +/* Read and check number of node descriptors to be read. */ +/* There are at most (2^nMaxDepth) - 1, but all are not necessary */ +/* described. Non described nodes are empty. */ +/* -------------------------------------------------------------------- */ + nNodeDescSize = READ_MSB_INT(abyHeader + 104); + nNodeDescSize *= 2; /* 16-bit words */ + + /* each bin descriptor is made of 2 ints */ + nNodeDescCount = nNodeDescSize / 8; + + if ((nNodeDescSize % 8) != 0 || + nNodeDescCount < 0 || nNodeDescCount > nMaxNodes ) + { + char szErrorMsg[64]; + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Invalid node descriptor size in .sbn : %d", nNodeDescSize ); + hSBN->sHooks.Error( szErrorMsg ); + SBNCloseDiskTree(hSBN); + return NULL; + } + + /* coverity[tainted_data] */ + pabyData = (uchar*) malloc( nNodeDescSize ); + pasNodeDescriptor = (SBNNodeDescriptor*) + calloc ( nMaxNodes, sizeof(SBNNodeDescriptor) ); + if (pabyData == NULL || pasNodeDescriptor == NULL) + { + free(pabyData); + free(pasNodeDescriptor); + hSBN->sHooks.Error( "Out of memory error" ); + SBNCloseDiskTree(hSBN); + return NULL; + } + +/* -------------------------------------------------------------------- */ +/* Read node descriptors. */ +/* -------------------------------------------------------------------- */ + if (hSBN->sHooks.FRead(pabyData, nNodeDescSize, 1, + hSBN->fpSBN) != 1) + { + free(pabyData); + free(pasNodeDescriptor); + hSBN->sHooks.Error( "Cannot read node descriptors" ); + SBNCloseDiskTree(hSBN); + return NULL; + } + + hSBN->pasNodeDescriptor = pasNodeDescriptor; + + for(i = 0; i < nNodeDescCount; i++) + { +/* -------------------------------------------------------------------- */ +/* Each node descriptor contains the index of the first bin that */ +/* described it, and the number of shapes in this first bin and */ +/* the following bins (in the relevant case). */ +/* -------------------------------------------------------------------- */ + int nBinStart = READ_MSB_INT(pabyData + 8 * i); + int nNodeShapeCount = READ_MSB_INT(pabyData + 8 * i + 4); + pasNodeDescriptor[i].nBinStart = nBinStart > 0 ? nBinStart : 0; + pasNodeDescriptor[i].nShapeCount = nNodeShapeCount; + + if ((nBinStart > 0 && nNodeShapeCount == 0) || + nNodeShapeCount < 0 || nNodeShapeCount > nShapeCount) + { + hSBN->sHooks.Error( "Inconsistent shape count in bin" ); + SBNCloseDiskTree(hSBN); + return NULL; + } + } + + free(pabyData); + pabyData = NULL; + + /* Locate first non-empty node */ + nCurNode = 0; + while(nCurNode < nMaxNodes && pasNodeDescriptor[nCurNode].nBinStart <= 0) + nCurNode ++; + + if( nCurNode >= nMaxNodes) + { + hSBN->sHooks.Error( "All nodes are empty" ); + SBNCloseDiskTree(hSBN); + return NULL; + } + + pasNodeDescriptor[nCurNode].nBinOffset = + (int) hSBN->sHooks.FTell(hSBN->fpSBN); + + /* Compute the index of the next non empty node. */ + nNextNonEmptyNode = nCurNode + 1; + while(nNextNonEmptyNode < nMaxNodes && + pasNodeDescriptor[nNextNonEmptyNode].nBinStart <= 0) + nNextNonEmptyNode ++; + + nExpectedBinId = 1; + +/* -------------------------------------------------------------------- */ +/* Traverse bins to compute the offset of the first bin of each */ +/* node. */ +/* Note: we could use the .sbx file to compute the offsets instead.*/ +/* -------------------------------------------------------------------- */ + while( hSBN->sHooks.FRead(abyBinHeader, 8, 1, + hSBN->fpSBN) == 1 ) + { + int nBinId; + int nBinSize; + + nExpectedBinId ++; + + nBinId = READ_MSB_INT(abyBinHeader); + nBinSize = READ_MSB_INT(abyBinHeader + 4); + nBinSize *= 2; /* 16-bit words */ + + if( nBinId != nExpectedBinId ) + { + hSBN->sHooks.Error( "Unexpected bin id" ); + SBNCloseDiskTree(hSBN); + return NULL; + } + + /* Bins are always limited to 100 features */ + /* If there are more, then they are located in continuous bins */ + if( (nBinSize % 8) != 0 || nBinSize <= 0 || nBinSize > 100 * 8) + { + hSBN->sHooks.Error( "Unexpected bin size" ); + SBNCloseDiskTree(hSBN); + return NULL; + } + + if( nNextNonEmptyNode < nMaxNodes && + nBinId == pasNodeDescriptor[nNextNonEmptyNode].nBinStart ) + { + nCurNode = nNextNonEmptyNode; + pasNodeDescriptor[nCurNode].nBinOffset = + (int) hSBN->sHooks.FTell(hSBN->fpSBN) - 8; + + /* Compute the index of the next non empty node. */ + nNextNonEmptyNode = nCurNode + 1; + while(nNextNonEmptyNode < nMaxNodes && + pasNodeDescriptor[nNextNonEmptyNode].nBinStart <= 0) + nNextNonEmptyNode ++; + } + + pasNodeDescriptor[nCurNode].nBinCount ++; + + /* Skip shape description */ + hSBN->sHooks.FSeek(hSBN->fpSBN, nBinSize, SEEK_CUR); + } + + return hSBN; +} + +/***********************************************************************/ +/* SBNCloseDiskTree() */ +/************************************************************************/ + +void SBNCloseDiskTree( SBNSearchHandle hSBN ) +{ + int i; + int nMaxNodes; + + if (hSBN == NULL) + return; + + if( hSBN->pasNodeDescriptor != NULL ) + { + nMaxNodes = (1 << hSBN->nMaxDepth) - 1; + for(i = 0; i < nMaxNodes; i++) + { + if( hSBN->pasNodeDescriptor[i].pabyShapeDesc != NULL ) + free(hSBN->pasNodeDescriptor[i].pabyShapeDesc); + } + } + + /* printf("hSBN->nTotalBytesRead = %d\n", hSBN->nTotalBytesRead); */ + + hSBN->sHooks.FClose(hSBN->fpSBN); + free(hSBN->pasNodeDescriptor); + free(hSBN); +} + + +/************************************************************************/ +/* SfRealloc() */ +/* */ +/* A realloc cover function that will access a NULL pointer as */ +/* a valid input. */ +/************************************************************************/ + +static void * SfRealloc( void * pMem, int nNewSize ) + +{ + if( pMem == NULL ) + return( (void *) malloc(nNewSize) ); + else + return( (void *) realloc(pMem,nNewSize) ); +} + +/************************************************************************/ +/* SBNAddShapeId() */ +/************************************************************************/ + +static int SBNAddShapeId( SearchStruct* psSearch, + int nShapeId ) +{ + if (psSearch->nShapeCount == psSearch->nShapeAlloc) + { + int* pNewPtr; + + psSearch->nShapeAlloc = + (int) (((psSearch->nShapeCount + 100) * 5) / 4); + pNewPtr = + (int *) SfRealloc( psSearch->panShapeId, + psSearch->nShapeAlloc * sizeof(int) ); + if( pNewPtr == NULL ) + { + psSearch->hSBN->sHooks.Error( "Out of memory error" ); + return FALSE; + } + psSearch->panShapeId = pNewPtr; + } + + psSearch->panShapeId[psSearch->nShapeCount] = nShapeId; + psSearch->nShapeCount ++; + return TRUE; +} + +/************************************************************************/ +/* SBNSearchDiskInternal() */ +/************************************************************************/ + +/* Due to the way integer coordinates are rounded, */ +/* we can use a strict intersection test, except when the node */ +/* bounding box or the search bounding box is degenerated. */ +#define SEARCH_BB_INTERSECTS(_bMinX, _bMinY, _bMaxX, _bMaxY) \ + (((bSearchMinX < _bMaxX && bSearchMaxX > _bMinX) || \ + ((_bMinX == _bMaxX || bSearchMinX == bSearchMaxX) && \ + bSearchMinX <= _bMaxX && bSearchMaxX >= _bMinX)) && \ + ((bSearchMinY < _bMaxY && bSearchMaxY > _bMinY) || \ + ((_bMinY == _bMaxY || bSearchMinY == bSearchMaxY ) && \ + bSearchMinY <= _bMaxY && bSearchMaxY >= _bMinY))) + + +static int SBNSearchDiskInternal( SearchStruct* psSearch, + int nDepth, + int nNodeId, + coord bNodeMinX, + coord bNodeMinY, + coord bNodeMaxX, + coord bNodeMaxY ) +{ + SBNSearchHandle hSBN; + SBNNodeDescriptor* psNode; + coord bSearchMinX = psSearch->bMinX; + coord bSearchMinY = psSearch->bMinY; + coord bSearchMaxX = psSearch->bMaxX; + coord bSearchMaxY = psSearch->bMaxY; + + hSBN = psSearch->hSBN; + + psNode = &(hSBN->pasNodeDescriptor[nNodeId]); + +/* -------------------------------------------------------------------- */ +/* Check if this node contains shapes that intersect the search */ +/* bounding box. */ +/* -------------------------------------------------------------------- */ + if ( psNode->bBBoxInit && + !(SEARCH_BB_INTERSECTS(psNode->bMinX, psNode->bMinY, + psNode->bMaxX, psNode->bMaxY)) ) + + { + /* No intersection, then don't try to read the shapes attached */ + /* to this node */ + } + +/* -------------------------------------------------------------------- */ +/* If this node contains shapes that are cached, then read them. */ +/* -------------------------------------------------------------------- */ + else if (psNode->pabyShapeDesc != NULL) + { + int j; + uchar* pabyShapeDesc = psNode->pabyShapeDesc; + + /* printf("nNodeId = %d, nDepth = %d\n", nNodeId, nDepth); */ + + for(j = 0; j < psNode->nShapeCount; j++) + { + coord bMinX = pabyShapeDesc[0]; + coord bMinY = pabyShapeDesc[1]; + coord bMaxX = pabyShapeDesc[2]; + coord bMaxY = pabyShapeDesc[3]; + + if( SEARCH_BB_INTERSECTS(bMinX, bMinY, bMaxX, bMaxY) ) + { + int nShapeId; + + nShapeId = READ_MSB_INT(pabyShapeDesc + 4); + + /* Caution : we count shape id starting from 0, and not 1 */ + nShapeId --; + + /*printf("shape=%d, minx=%d, miny=%d, maxx=%d, maxy=%d\n", + nShapeId, bMinX, bMinY, bMaxX, bMaxY);*/ + + if( !SBNAddShapeId( psSearch, nShapeId ) ) + return FALSE; + } + + pabyShapeDesc += 8; + } + } + +/* -------------------------------------------------------------------- */ +/* If the node has attached shapes (that are not (yet) cached), */ +/* then retrieve them from disk. */ +/* -------------------------------------------------------------------- */ + + else if (psNode->nBinCount > 0) + { + uchar abyBinHeader[8]; + int nBinSize, nShapes; + int nShapeCountAcc = 0; + int i, j; + + /* printf("nNodeId = %d, nDepth = %d\n", nNodeId, nDepth); */ + + hSBN->sHooks.FSeek(hSBN->fpSBN, psNode->nBinOffset, SEEK_SET); + + if (nDepth < CACHED_DEPTH_LIMIT) + psNode->pabyShapeDesc = (uchar*) malloc(psNode->nShapeCount * 8); + + for(i = 0; i < psNode->nBinCount; i++) + { + uchar* pabyBinShape; + +#ifdef DEBUG_IO + psSearch->nBytesRead += 8; +#endif + if( hSBN->sHooks.FRead(abyBinHeader, 8, 1, + hSBN->fpSBN) != 1) + { + hSBN->sHooks.Error( "I/O error" ); + free(psNode->pabyShapeDesc); + psNode->pabyShapeDesc = NULL; + return FALSE; + } + + if ( READ_MSB_INT(abyBinHeader + 0) != psNode->nBinStart + i ) + { + hSBN->sHooks.Error( "Unexpected bin id" ); + free(psNode->pabyShapeDesc); + psNode->pabyShapeDesc = NULL; + return FALSE; + } + + nBinSize = READ_MSB_INT(abyBinHeader + 4); + nBinSize *= 2; /* 16-bit words */ + + nShapes = nBinSize / 8; + + /* Bins are always limited to 100 features */ + if( (nBinSize % 8) != 0 || nShapes <= 0 || nShapes > 100) + { + hSBN->sHooks.Error( "Unexpected bin size" ); + free(psNode->pabyShapeDesc); + psNode->pabyShapeDesc = NULL; + return FALSE; + } + + if( nShapeCountAcc + nShapes > psNode->nShapeCount) + { + free(psNode->pabyShapeDesc); + psNode->pabyShapeDesc = NULL; + hSBN->sHooks.Error( "Inconsistent shape count for bin" ); + return FALSE; + } + + if (nDepth < CACHED_DEPTH_LIMIT && psNode->pabyShapeDesc != NULL) + { + pabyBinShape = psNode->pabyShapeDesc + nShapeCountAcc * 8; + } + else + { + pabyBinShape = psSearch->abyBinShape; + } + +#ifdef DEBUG_IO + psSearch->nBytesRead += nBinSize; +#endif + if (hSBN->sHooks.FRead(pabyBinShape, nBinSize, 1, + hSBN->fpSBN) != 1) + { + hSBN->sHooks.Error( "I/O error" ); + free(psNode->pabyShapeDesc); + psNode->pabyShapeDesc = NULL; + return FALSE; + } + + nShapeCountAcc += nShapes; + + if (i == 0 && !psNode->bBBoxInit) + { + psNode->bMinX = pabyBinShape[0]; + psNode->bMinY = pabyBinShape[1]; + psNode->bMaxX = pabyBinShape[2]; + psNode->bMaxY = pabyBinShape[3]; + } + + for(j = 0; j < nShapes; j++) + { + coord bMinX = pabyBinShape[0]; + coord bMinY = pabyBinShape[1]; + coord bMaxX = pabyBinShape[2]; + coord bMaxY = pabyBinShape[3]; + + if( !psNode->bBBoxInit ) + { +#ifdef sanity_checks +/* -------------------------------------------------------------------- */ +/* Those tests only check that the shape bounding box in the bin */ +/* are consistent (self-consistent and consistent with the node */ +/* they are attached to). They are optional however (as far as */ +/* the safety of runtime is concerned at least). */ +/* -------------------------------------------------------------------- */ + + if( !(((bMinX < bMaxX || + (bMinX == 0 && bMaxX == 0) || + (bMinX == 255 && bMaxX == 255))) && + ((bMinY < bMaxY || + (bMinY == 0 && bMaxY == 0) || + (bMinY == 255 && bMaxY == 255)))) || + bMaxX < bNodeMinX || bMaxY < bNodeMinY || + bMinX > bNodeMaxX || bMinY > bNodeMaxY ) + { + /*printf("shape %d %d %d %d\n", bMinX, bMinY, bMaxX, bMaxY); + printf("node %d %d %d %d\n", bNodeMinX, bNodeMinY, bNodeMaxX, bNodeMaxY);*/ + hSBN->sHooks.Error( + "Invalid shape bounding box in bin" ); + free(psNode->pabyShapeDesc); + psNode->pabyShapeDesc = NULL; + return FALSE; + } +#endif + if (bMinX < psNode->bMinX) psNode->bMinX = bMinX; + if (bMinY < psNode->bMinY) psNode->bMinY = bMinY; + if (bMaxX > psNode->bMaxX) psNode->bMaxX = bMaxX; + if (bMaxY > psNode->bMaxY) psNode->bMaxY = bMaxY; + } + + if( SEARCH_BB_INTERSECTS(bMinX, bMinY, bMaxX, bMaxY) ) + { + int nShapeId; + + nShapeId = READ_MSB_INT(pabyBinShape + 4); + + /* Caution : we count shape id starting from 0, and not 1 */ + nShapeId --; + + /*printf("shape=%d, minx=%d, miny=%d, maxx=%d, maxy=%d\n", + nShapeId, bMinX, bMinY, bMaxX, bMaxY);*/ + + if( !SBNAddShapeId( psSearch, nShapeId ) ) + return FALSE; + } + + pabyBinShape += 8; + } + } + + if( nShapeCountAcc != psNode->nShapeCount) + { + free(psNode->pabyShapeDesc); + psNode->pabyShapeDesc = NULL; + hSBN->sHooks.Error( "Inconsistent shape count for bin" ); + return FALSE; + } + + psNode->bBBoxInit = TRUE; + } + +/* -------------------------------------------------------------------- */ +/* Look up in child nodes. */ +/* -------------------------------------------------------------------- */ + if( nDepth + 1 < hSBN->nMaxDepth ) + { + nNodeId = nNodeId * 2 + 1; + + if( (nDepth % 2) == 0 ) /* x split */ + { + coord bMid = (coord) (1 + ((int)bNodeMinX + bNodeMaxX) / 2); + if( bSearchMinX <= bMid - 1 && + !SBNSearchDiskInternal( psSearch, nDepth + 1, nNodeId + 1, + bNodeMinX, bNodeMinY, + bMid - 1, bNodeMaxY ) ) + { + return FALSE; + } + if( bSearchMaxX >= bMid && + !SBNSearchDiskInternal( psSearch, nDepth + 1, nNodeId, + bMid, bNodeMinY, + bNodeMaxX, bNodeMaxY ) ) + { + return FALSE; + } + } + else /* y split */ + { + coord bMid = (coord) (1 + ((int)bNodeMinY + bNodeMaxY) / 2); + if( bSearchMinY <= bMid - 1 && + !SBNSearchDiskInternal( psSearch, nDepth + 1, nNodeId + 1, + bNodeMinX, bNodeMinY, + bNodeMaxX, bMid - 1 ) ) + { + return FALSE; + } + if( bSearchMaxY >= bMid && + !SBNSearchDiskInternal( psSearch, nDepth + 1, nNodeId, + bNodeMinX, bMid, + bNodeMaxX, bNodeMaxY ) ) + { + return FALSE; + } + } + } + + return TRUE; +} + +/************************************************************************/ +/* compare_ints() */ +/************************************************************************/ + +/* helper for qsort */ +static int +compare_ints( const void * a, const void * b) +{ + return (*(int*)a) - (*(int*)b); +} + +/************************************************************************/ +/* SBNSearchDiskTree() */ +/************************************************************************/ + +int* SBNSearchDiskTree( SBNSearchHandle hSBN, + double *padfBoundsMin, double *padfBoundsMax, + int *pnShapeCount ) +{ + double dfMinX, dfMinY, dfMaxX, dfMaxY; + double dfDiskXExtent, dfDiskYExtent; + int bMinX, bMinY, bMaxX, bMaxY; + + *pnShapeCount = 0; + + dfMinX = padfBoundsMin[0]; + dfMinY = padfBoundsMin[1]; + dfMaxX = padfBoundsMax[0]; + dfMaxY = padfBoundsMax[1]; + + if( dfMinX > dfMaxX || dfMinY > dfMaxY ) + return NULL; + + if( dfMaxX < hSBN->dfMinX || dfMaxY < hSBN->dfMinY || + dfMinX > hSBN->dfMaxX || dfMinY > hSBN->dfMaxY ) + return NULL; + +/* -------------------------------------------------------------------- */ +/* Compute the search coordinates in [0,255]x[0,255] coord. space */ +/* -------------------------------------------------------------------- */ + dfDiskXExtent = hSBN->dfMaxX - hSBN->dfMinX; + dfDiskYExtent = hSBN->dfMaxY - hSBN->dfMinY; + + if ( dfDiskXExtent == 0.0 ) + { + bMinX = 0; + bMaxX = 255; + } + else + { + if( dfMinX < hSBN->dfMinX ) + bMinX = 0; + else + { + double dfMinX_255 = (dfMinX - hSBN->dfMinX) + / dfDiskXExtent * 255.0; + bMinX = (int)floor(dfMinX_255 - 0.005); + if( bMinX < 0 ) bMinX = 0; + } + + if( dfMaxX > hSBN->dfMaxX ) + bMaxX = 255; + else + { + double dfMaxX_255 = (dfMaxX - hSBN->dfMinX) + / dfDiskXExtent * 255.0; + bMaxX = (int)ceil(dfMaxX_255 + 0.005); + if( bMaxX > 255 ) bMaxX = 255; + } + } + + if ( dfDiskYExtent == 0.0 ) + { + bMinY = 0; + bMaxY = 255; + } + else + { + if( dfMinY < hSBN->dfMinY ) + bMinY = 0; + else + { + double dfMinY_255 = (dfMinY - hSBN->dfMinY) + / dfDiskYExtent * 255.0; + bMinY = (int)floor(dfMinY_255 - 0.005); + if( bMinY < 0 ) bMinY = 0; + } + + if( dfMaxY > hSBN->dfMaxY ) + bMaxY = 255; + else + { + double dfMaxY_255 = (dfMaxY - hSBN->dfMinY) + / dfDiskYExtent * 255.0; + bMaxY = (int)ceil(dfMaxY_255 + 0.005); + if( bMaxY > 255 ) bMaxY = 255; + } + } + +/* -------------------------------------------------------------------- */ +/* Run the search. */ +/* -------------------------------------------------------------------- */ + + return SBNSearchDiskTreeInteger(hSBN, + bMinX, bMinY, bMaxX, bMaxY, + pnShapeCount); +} + +/************************************************************************/ +/* SBNSearchDiskTreeInteger() */ +/************************************************************************/ + +int* SBNSearchDiskTreeInteger( SBNSearchHandle hSBN, + int bMinX, int bMinY, int bMaxX, int bMaxY, + int *pnShapeCount ) +{ + SearchStruct sSearch; + int bRet; + + *pnShapeCount = 0; + + if( bMinX > bMaxX || bMinY > bMaxY ) + return NULL; + + if( bMaxX < 0 || bMaxY < 0 || bMinX > 255 || bMinY > 255 ) + return NULL; + + if( hSBN->nShapeCount == 0 ) + return NULL; +/* -------------------------------------------------------------------- */ +/* Run the search. */ +/* -------------------------------------------------------------------- */ + memset( &sSearch, 0, sizeof(sSearch) ); + sSearch.hSBN = hSBN; + sSearch.bMinX = (coord) (bMinX >= 0 ? bMinX : 0); + sSearch.bMinY = (coord) (bMinY >= 0 ? bMinY : 0); + sSearch.bMaxX = (coord) (bMaxX <= 255 ? bMaxX : 255); + sSearch.bMaxY = (coord) (bMaxY <= 255 ? bMaxY : 255); + sSearch.nShapeCount = 0; + sSearch.nShapeAlloc = 0; + sSearch.panShapeId = (int*) calloc(1, sizeof(int)); +#ifdef DEBUG_IO + sSearch.nBytesRead = 0; +#endif + + bRet = SBNSearchDiskInternal(&sSearch, 0, 0, 0, 0, 255, 255); + +#ifdef DEBUG_IO + hSBN->nTotalBytesRead += sSearch.nBytesRead; + /* printf("nBytesRead = %d\n", sSearch.nBytesRead); */ +#endif + + if( !bRet ) + { + free( sSearch.panShapeId ); + *pnShapeCount = 0; + return NULL; + } + + *pnShapeCount = sSearch.nShapeCount; + +/* -------------------------------------------------------------------- */ +/* Sort the id array */ +/* -------------------------------------------------------------------- */ + qsort(sSearch.panShapeId, *pnShapeCount, sizeof(int), compare_ints); + + return sSearch.panShapeId; +} + +/************************************************************************/ +/* SBNSearchFreeIds() */ +/************************************************************************/ + +void SBNSearchFreeIds( int* panShapeId ) +{ + free( panShapeId ); +} diff --git a/libs/shapelib/shapefil.h b/libs/shapelib/shapefil.h new file mode 100644 index 0000000..08c6459 --- /dev/null +++ b/libs/shapelib/shapefil.h @@ -0,0 +1,747 @@ +#ifndef SHAPEFILE_H_INCLUDED +#define SHAPEFILE_H_INCLUDED + +/****************************************************************************** + * $Id: shapefil.h,v 1.55 2016-12-05 18:44:08 erouault Exp $ + * + * Project: Shapelib + * Purpose: Primary include file for Shapelib. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * Copyright (c) 2012-2016, Even Rouault + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * $Log: shapefil.h,v $ + * Revision 1.55 2016-12-05 18:44:08 erouault + * * dbfopen.c, shapefil.h: write DBF end-of-file character 0x1A by default. + * This behaviour can be controlled with the DBFSetWriteEndOfFileChar() + * function. + * + * Revision 1.54 2016-12-05 12:44:05 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.53 2016-12-04 15:30:15 erouault + * * shpopen.c, dbfopen.c, shptree.c, shapefil.h: resync with + * GDAL Shapefile driver. Mostly cleanups. SHPObject and DBFInfo + * structures extended with new members. New functions: + * DBFSetLastModifiedDate, SHPOpenLLEx, SHPRestoreSHX, + * SHPSetFastModeReadObject + * + * * sbnsearch.c: new file to implement original ESRI .sbn spatial + * index reading. (no write support). New functions: + * SBNOpenDiskTree, SBNCloseDiskTree, SBNSearchDiskTree, + * SBNSearchDiskTreeInteger, SBNSearchFreeIds + * + * * Makefile, makefile.vc, CMakeLists.txt, shapelib.def: updates + * with new file and symbols. + * + * * commit: helper script to cvs commit + * + * Revision 1.52 2011-12-11 22:26:46 fwarmerdam + * upgrade .qix access code to use SAHooks (gdal #3365) + * + * Revision 1.51 2011-07-24 05:59:25 fwarmerdam + * minimize use of CPLError in favor of SAHooks.Error() + * + * Revision 1.50 2011-05-13 17:35:17 fwarmerdam + * added DBFReorderFields() and DBFAlterFields() functions (from Even) + * + * Revision 1.49 2011-04-16 14:38:21 fwarmerdam + * avoid warnings with gcc on SHP_CVSID + * + * Revision 1.48 2010-08-27 23:42:52 fwarmerdam + * add SHPAPI_CALL attribute in code + * + * Revision 1.47 2010-01-28 11:34:34 fwarmerdam + * handle the shape file length limits more gracefully (#3236) + * + * Revision 1.46 2008-11-12 14:28:15 fwarmerdam + * DBFCreateField() now works on files with records + * + * Revision 1.45 2008/11/11 17:47:10 fwarmerdam + * added DBFDeleteField() function + * + * Revision 1.44 2008/01/16 20:05:19 bram + * Add file hooks that accept UTF-8 encoded filenames on some platforms. Use SASetupUtf8Hooks + * tosetup the hooks and check SHPAPI_UTF8_HOOKS for its availability. Currently, this + * is only available on the Windows platform that decodes the UTF-8 filenames to wide + * character strings and feeds them to _wfopen and _wremove. + * + * Revision 1.43 2008/01/10 16:35:30 fwarmerdam + * avoid _ prefix on #defined symbols (bug 1840) + * + * Revision 1.42 2007/12/18 18:28:14 bram + * - create hook for client specific atof (bugzilla ticket 1615) + * - check for NULL handle before closing cpCPG file, and close after reading. + * + * Revision 1.41 2007/12/15 20:25:32 bram + * dbfopen.c now reads the Code Page information from the DBF file, and exports + * this information as a string through the DBFGetCodePage function. This is + * either the number from the LDID header field ("LDID/") or as the + * content of an accompanying .CPG file. When creating a DBF file, the code can + * be set using DBFCreateEx. + * + * Revision 1.40 2007/12/06 07:00:25 fwarmerdam + * dbfopen now using SAHooks for fileio + * + * Revision 1.39 2007/12/04 20:37:56 fwarmerdam + * preliminary implementation of hooks api for io and errors + * + * Revision 1.38 2007/11/21 22:39:56 fwarmerdam + * close shx file in readonly mode (GDAL #1956) + * + * Revision 1.37 2007/10/27 03:31:14 fwarmerdam + * limit default depth of tree to 12 levels (gdal ticket #1594) + * + * Revision 1.36 2007/09/10 23:33:15 fwarmerdam + * Upstreamed support for visibility flag in SHPAPI_CALL for the needs + * of GDAL (gdal ticket #1810). + * + * Revision 1.35 2007/09/03 19:48:10 fwarmerdam + * move DBFReadAttribute() static dDoubleField into dbfinfo + * + * Revision 1.34 2006/06/17 15:33:32 fwarmerdam + * added pszWorkField - bug 1202 (rso) + * + * Revision 1.33 2006/02/15 01:14:30 fwarmerdam + * added DBFAddNativeFieldType + * + * Revision 1.32 2006/01/26 15:07:32 fwarmerdam + * add bMeasureIsUsed flag from Craig Bruce: Bug 1249 + * + * Revision 1.31 2006/01/05 01:27:27 fwarmerdam + * added dbf deletion mark/fetch + * + * Revision 1.30 2005/01/03 22:30:13 fwarmerdam + * added support for saved quadtrees + * + * Revision 1.29 2004/09/26 20:09:35 fwarmerdam + * avoid rcsid warnings + * + * Revision 1.28 2003/12/29 06:02:18 fwarmerdam + * added cpl_error.h option + * + * Revision 1.27 2003/04/21 18:30:37 warmerda + * added header write/update public methods + * + * Revision 1.26 2002/09/29 00:00:08 warmerda + * added FTLogical and logical attribute read/write calls + * + * Revision 1.25 2002/05/07 13:46:30 warmerda + * added DBFWriteAttributeDirectly(). + * + * Revision 1.24 2002/04/10 16:59:54 warmerda + * added SHPRewindObject + * + * Revision 1.23 2002/01/15 14:36:07 warmerda + * updated email address + * + * Revision 1.22 2002/01/15 14:32:00 warmerda + * try to improve SHPAPI_CALL docs + */ + +#include + +#ifdef USE_DBMALLOC +#include +#endif + +#ifdef USE_CPL +#include "cpl_conv.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/************************************************************************/ +/* Configuration options. */ +/************************************************************************/ + +/* -------------------------------------------------------------------- */ +/* Should the DBFReadStringAttribute() strip leading and */ +/* trailing white space? */ +/* -------------------------------------------------------------------- */ +#define TRIM_DBF_WHITESPACE + +/* -------------------------------------------------------------------- */ +/* Should we write measure values to the Multipatch object? */ +/* Reportedly ArcView crashes if we do write it, so for now it */ +/* is disabled. */ +/* -------------------------------------------------------------------- */ +#define DISABLE_MULTIPATCH_MEASURE + +/* -------------------------------------------------------------------- */ +/* SHPAPI_CALL */ +/* */ +/* The following two macros are present to allow forcing */ +/* various calling conventions on the Shapelib API. */ +/* */ +/* To force __stdcall conventions (needed to call Shapelib */ +/* from Visual Basic and/or Dephi I believe) the makefile could */ +/* be modified to define: */ +/* */ +/* /DSHPAPI_CALL=__stdcall */ +/* */ +/* If it is desired to force export of the Shapelib API without */ +/* using the shapelib.def file, use the following definition. */ +/* */ +/* /DSHAPELIB_DLLEXPORT */ +/* */ +/* To get both at once it will be necessary to hack this */ +/* include file to define: */ +/* */ +/* #define SHPAPI_CALL __declspec(dllexport) __stdcall */ +/* #define SHPAPI_CALL1 __declspec(dllexport) * __stdcall */ +/* */ +/* The complexity of the situation is partly caused by the */ +/* peculiar requirement of Visual C++ that __stdcall appear */ +/* after any "*"'s in the return value of a function while the */ +/* __declspec(dllexport) must appear before them. */ +/* -------------------------------------------------------------------- */ + +#ifdef SHAPELIB_DLLEXPORT +# define SHPAPI_CALL __declspec(dllexport) +# define SHPAPI_CALL1(x) __declspec(dllexport) x +#endif + +#ifndef SHPAPI_CALL +# if defined(USE_GCC_VISIBILITY_FLAG) +# define SHPAPI_CALL __attribute__ ((visibility("default"))) +# define SHPAPI_CALL1(x) __attribute__ ((visibility("default"))) x +# else +# define SHPAPI_CALL +# endif +#endif + +#ifndef SHPAPI_CALL1 +# define SHPAPI_CALL1(x) x SHPAPI_CALL +#endif + +/* -------------------------------------------------------------------- */ +/* Macros for controlling CVSID and ensuring they don't appear */ +/* as unreferenced variables resulting in lots of warnings. */ +/* -------------------------------------------------------------------- */ +#ifndef DISABLE_CVSID +# if defined(__GNUC__) && __GNUC__ >= 4 +# define SHP_CVSID(string) static const char cpl_cvsid[] __attribute__((used)) = string; +# else +# define SHP_CVSID(string) static const char cpl_cvsid[] = string; \ +static const char *cvsid_aw() { return( cvsid_aw() ? NULL : cpl_cvsid ); } +# endif +#else +# define SHP_CVSID(string) +#endif + +/* -------------------------------------------------------------------- */ +/* On some platforms, additional file IO hooks are defined that */ +/* UTF-8 encoded filenames Unicode filenames */ +/* -------------------------------------------------------------------- */ +#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define SHPAPI_WINDOWS +# define SHPAPI_UTF8_HOOKS +#endif + +/* -------------------------------------------------------------------- */ +/* IO/Error hook functions. */ +/* -------------------------------------------------------------------- */ +typedef int *SAFile; + +#ifndef SAOffset +typedef unsigned long SAOffset; +#endif + +typedef struct { + SAFile (*FOpen) ( const char *filename, const char *access); + SAOffset (*FRead) ( void *p, SAOffset size, SAOffset nmemb, SAFile file); + SAOffset (*FWrite)( void *p, SAOffset size, SAOffset nmemb, SAFile file); + SAOffset (*FSeek) ( SAFile file, SAOffset offset, int whence ); + SAOffset (*FTell) ( SAFile file ); + int (*FFlush)( SAFile file ); + int (*FClose)( SAFile file ); + int (*Remove) ( const char *filename ); + + void (*Error) ( const char *message ); + double (*Atof) ( const char *str ); +} SAHooks; + +void SHPAPI_CALL SASetupDefaultHooks( SAHooks *psHooks ); +#ifdef SHPAPI_UTF8_HOOKS +void SHPAPI_CALL SASetupUtf8Hooks( SAHooks *psHooks ); +#endif + +/************************************************************************/ +/* SHP Support. */ +/************************************************************************/ +typedef struct tagSHPObject SHPObject; + +typedef struct +{ + SAHooks sHooks; + + SAFile fpSHP; + SAFile fpSHX; + + int nShapeType; /* SHPT_* */ + + unsigned int nFileSize; /* SHP file */ + + int nRecords; + int nMaxRecords; + unsigned int*panRecOffset; + unsigned int *panRecSize; + + double adBoundsMin[4]; + double adBoundsMax[4]; + + int bUpdated; + + unsigned char *pabyRec; + int nBufSize; + + int bFastModeReadObject; + unsigned char *pabyObjectBuf; + int nObjectBufSize; + SHPObject* psCachedObject; +} SHPInfo; + +typedef SHPInfo * SHPHandle; + +/* -------------------------------------------------------------------- */ +/* Shape types (nSHPType) */ +/* -------------------------------------------------------------------- */ +#define SHPT_NULL 0 +#define SHPT_POINT 1 +#define SHPT_ARC 3 +#define SHPT_POLYGON 5 +#define SHPT_MULTIPOINT 8 +#define SHPT_POINTZ 11 +#define SHPT_ARCZ 13 +#define SHPT_POLYGONZ 15 +#define SHPT_MULTIPOINTZ 18 +#define SHPT_POINTM 21 +#define SHPT_ARCM 23 +#define SHPT_POLYGONM 25 +#define SHPT_MULTIPOINTM 28 +#define SHPT_MULTIPATCH 31 + +/* -------------------------------------------------------------------- */ +/* Part types - everything but SHPT_MULTIPATCH just uses */ +/* SHPP_RING. */ +/* -------------------------------------------------------------------- */ + +#define SHPP_TRISTRIP 0 +#define SHPP_TRIFAN 1 +#define SHPP_OUTERRING 2 +#define SHPP_INNERRING 3 +#define SHPP_FIRSTRING 4 +#define SHPP_RING 5 + +/* -------------------------------------------------------------------- */ +/* SHPObject - represents on shape (without attributes) read */ +/* from the .shp file. */ +/* -------------------------------------------------------------------- */ +struct tagSHPObject +{ + int nSHPType; + + int nShapeId; /* -1 is unknown/unassigned */ + + int nParts; + int *panPartStart; + int *panPartType; + + int nVertices; + double *padfX; + double *padfY; + double *padfZ; + double *padfM; + + double dfXMin; + double dfYMin; + double dfZMin; + double dfMMin; + + double dfXMax; + double dfYMax; + double dfZMax; + double dfMMax; + + int bMeasureIsUsed; + int bFastModeReadObject; +}; + +/* -------------------------------------------------------------------- */ +/* SHP API Prototypes */ +/* -------------------------------------------------------------------- */ + +/* If pszAccess is read-only, the fpSHX field of the returned structure */ +/* will be NULL as it is not necessary to keep the SHX file open */ +SHPHandle SHPAPI_CALL + SHPOpen( const char * pszShapeFile, const char * pszAccess ); +SHPHandle SHPAPI_CALL + SHPOpenLL( const char *pszShapeFile, const char *pszAccess, + SAHooks *psHooks ); +SHPHandle SHPAPI_CALL + SHPOpenLLEx( const char *pszShapeFile, const char *pszAccess, + SAHooks *psHooks, int bRestoreSHX ); + +int SHPAPI_CALL + SHPRestoreSHX( const char *pszShapeFile, const char *pszAccess, + SAHooks *psHooks ); + +/* If setting bFastMode = TRUE, the content of SHPReadObject() is owned by the SHPHandle. */ +/* So you cannot have 2 valid instances of SHPReadObject() simultaneously. */ +/* The SHPObject padfZ and padfM members may be NULL depending on the geometry */ +/* type. It is illegal to free at hand any of the pointer members of the SHPObject structure */ +void SHPAPI_CALL SHPSetFastModeReadObject( SHPHandle hSHP, int bFastMode ); + +SHPHandle SHPAPI_CALL + SHPCreate( const char * pszShapeFile, int nShapeType ); +SHPHandle SHPAPI_CALL + SHPCreateLL( const char * pszShapeFile, int nShapeType, + SAHooks *psHooks ); +void SHPAPI_CALL + SHPGetInfo( SHPHandle hSHP, int * pnEntities, int * pnShapeType, + double * padfMinBound, double * padfMaxBound ); + +SHPObject SHPAPI_CALL1(*) + SHPReadObject( SHPHandle hSHP, int iShape ); +int SHPAPI_CALL + SHPWriteObject( SHPHandle hSHP, int iShape, SHPObject * psObject ); + +void SHPAPI_CALL + SHPDestroyObject( SHPObject * psObject ); +void SHPAPI_CALL + SHPComputeExtents( SHPObject * psObject ); +SHPObject SHPAPI_CALL1(*) + SHPCreateObject( int nSHPType, int nShapeId, int nParts, + const int * panPartStart, const int * panPartType, + int nVertices, + const double * padfX, const double * padfY, + const double * padfZ, const double * padfM ); +SHPObject SHPAPI_CALL1(*) + SHPCreateSimpleObject( int nSHPType, int nVertices, + const double * padfX, + const double * padfY, + const double * padfZ ); + +int SHPAPI_CALL + SHPRewindObject( SHPHandle hSHP, SHPObject * psObject ); + +void SHPAPI_CALL SHPClose( SHPHandle hSHP ); +void SHPAPI_CALL SHPWriteHeader( SHPHandle hSHP ); + +const char SHPAPI_CALL1(*) + SHPTypeName( int nSHPType ); +const char SHPAPI_CALL1(*) + SHPPartTypeName( int nPartType ); + +/* -------------------------------------------------------------------- */ +/* Shape quadtree indexing API. */ +/* -------------------------------------------------------------------- */ + +/* this can be two or four for binary or quad tree */ +#define MAX_SUBNODE 4 + +/* upper limit of tree levels for automatic estimation */ +#define MAX_DEFAULT_TREE_DEPTH 12 + +typedef struct shape_tree_node +{ + /* region covered by this node */ + double adfBoundsMin[4]; + double adfBoundsMax[4]; + + /* list of shapes stored at this node. The papsShapeObj pointers + or the whole list can be NULL */ + int nShapeCount; + int *panShapeIds; + SHPObject **papsShapeObj; + + int nSubNodes; + struct shape_tree_node *apsSubNode[MAX_SUBNODE]; + +} SHPTreeNode; + +typedef struct +{ + SHPHandle hSHP; + + int nMaxDepth; + int nDimension; + int nTotalCount; + + SHPTreeNode *psRoot; +} SHPTree; + +SHPTree SHPAPI_CALL1(*) + SHPCreateTree( SHPHandle hSHP, int nDimension, int nMaxDepth, + double *padfBoundsMin, double *padfBoundsMax ); +void SHPAPI_CALL + SHPDestroyTree( SHPTree * hTree ); + +int SHPAPI_CALL + SHPWriteTree( SHPTree *hTree, const char * pszFilename ); + +int SHPAPI_CALL + SHPTreeAddShapeId( SHPTree * hTree, SHPObject * psObject ); +int SHPAPI_CALL + SHPTreeRemoveShapeId( SHPTree * hTree, int nShapeId ); + +void SHPAPI_CALL + SHPTreeTrimExtraNodes( SHPTree * hTree ); + +int SHPAPI_CALL1(*) + SHPTreeFindLikelyShapes( SHPTree * hTree, + double * padfBoundsMin, + double * padfBoundsMax, + int * ); +int SHPAPI_CALL + SHPCheckBoundsOverlap( double *, double *, double *, double *, int ); + +int SHPAPI_CALL1(*) +SHPSearchDiskTree( FILE *fp, + double *padfBoundsMin, double *padfBoundsMax, + int *pnShapeCount ); + +typedef struct SHPDiskTreeInfo* SHPTreeDiskHandle; + +SHPTreeDiskHandle SHPAPI_CALL + SHPOpenDiskTree( const char* pszQIXFilename, + SAHooks *psHooks ); + +void SHPAPI_CALL + SHPCloseDiskTree( SHPTreeDiskHandle hDiskTree ); + +int SHPAPI_CALL1(*) +SHPSearchDiskTreeEx( SHPTreeDiskHandle hDiskTree, + double *padfBoundsMin, double *padfBoundsMax, + int *pnShapeCount ); + +int SHPAPI_CALL + SHPWriteTreeLL(SHPTree *hTree, const char *pszFilename, SAHooks *psHooks ); + +/* -------------------------------------------------------------------- */ +/* SBN Search API */ +/* -------------------------------------------------------------------- */ + +typedef struct SBNSearchInfo* SBNSearchHandle; + +SBNSearchHandle SHPAPI_CALL + SBNOpenDiskTree( const char* pszSBNFilename, + SAHooks *psHooks ); + +void SHPAPI_CALL + SBNCloseDiskTree( SBNSearchHandle hSBN ); + +int SHPAPI_CALL1(*) +SBNSearchDiskTree( SBNSearchHandle hSBN, + double *padfBoundsMin, double *padfBoundsMax, + int *pnShapeCount ); + +int SHPAPI_CALL1(*) +SBNSearchDiskTreeInteger( SBNSearchHandle hSBN, + int bMinX, int bMinY, int bMaxX, int bMaxY, + int *pnShapeCount ); + +void SHPAPI_CALL SBNSearchFreeIds( int* panShapeId ); + +/************************************************************************/ +/* DBF Support. */ +/************************************************************************/ +typedef struct +{ + SAHooks sHooks; + + SAFile fp; + + int nRecords; + + int nRecordLength; /* Must fit on uint16 */ + int nHeaderLength; /* File header length (32) + field + descriptor length + spare space. + Must fit on uint16 */ + int nFields; + int *panFieldOffset; + int *panFieldSize; + int *panFieldDecimals; + char *pachFieldType; + + char *pszHeader; /* Field descriptors */ + + int nCurrentRecord; + int bCurrentRecordModified; + char *pszCurrentRecord; + + int nWorkFieldLength; + char *pszWorkField; + + int bNoHeader; + int bUpdated; + + union + { + double dfDoubleField; + int nIntField; + } fieldValue; + + int iLanguageDriver; + char *pszCodePage; + + int nUpdateYearSince1900; /* 0-255 */ + int nUpdateMonth; /* 1-12 */ + int nUpdateDay; /* 1-31 */ + + int bWriteEndOfFileChar; /* defaults to TRUE */ +} DBFInfo; + +typedef DBFInfo * DBFHandle; + +typedef enum { + FTString, + FTInteger, + FTDouble, + FTLogical, + FTInvalid +} DBFFieldType; + +/* Field descriptor/header size */ +#define XBASE_FLDHDR_SZ 32 +/* Shapelib read up to 11 characters, even if only 10 should normally be used */ +#define XBASE_FLDNAME_LEN_READ 11 +/* On writing, we limit to 10 characters */ +#define XBASE_FLDNAME_LEN_WRITE 10 +/* Normally only 254 characters should be used. We tolerate 255 historically */ +#define XBASE_FLD_MAX_WIDTH 255 + +DBFHandle SHPAPI_CALL + DBFOpen( const char * pszDBFFile, const char * pszAccess ); +DBFHandle SHPAPI_CALL + DBFOpenLL( const char * pszDBFFile, const char * pszAccess, + SAHooks *psHooks ); +DBFHandle SHPAPI_CALL + DBFCreate( const char * pszDBFFile ); +DBFHandle SHPAPI_CALL + DBFCreateEx( const char * pszDBFFile, const char * pszCodePage ); +DBFHandle SHPAPI_CALL + DBFCreateLL( const char * pszDBFFile, const char * pszCodePage, SAHooks *psHooks ); + +int SHPAPI_CALL + DBFGetFieldCount( DBFHandle psDBF ); +int SHPAPI_CALL + DBFGetRecordCount( DBFHandle psDBF ); +int SHPAPI_CALL + DBFAddField( DBFHandle hDBF, const char * pszFieldName, + DBFFieldType eType, int nWidth, int nDecimals ); + +int SHPAPI_CALL + DBFAddNativeFieldType( DBFHandle hDBF, const char * pszFieldName, + char chType, int nWidth, int nDecimals ); + +int SHPAPI_CALL + DBFDeleteField( DBFHandle hDBF, int iField ); + +int SHPAPI_CALL + DBFReorderFields( DBFHandle psDBF, int* panMap ); + +int SHPAPI_CALL + DBFAlterFieldDefn( DBFHandle psDBF, int iField, const char * pszFieldName, + char chType, int nWidth, int nDecimals ); + +DBFFieldType SHPAPI_CALL + DBFGetFieldInfo( DBFHandle psDBF, int iField, + char * pszFieldName, int * pnWidth, int * pnDecimals ); + +int SHPAPI_CALL + DBFGetFieldIndex(DBFHandle psDBF, const char *pszFieldName); + +int SHPAPI_CALL + DBFReadIntegerAttribute( DBFHandle hDBF, int iShape, int iField ); +double SHPAPI_CALL + DBFReadDoubleAttribute( DBFHandle hDBF, int iShape, int iField ); +const char SHPAPI_CALL1(*) + DBFReadStringAttribute( DBFHandle hDBF, int iShape, int iField ); +const char SHPAPI_CALL1(*) + DBFReadLogicalAttribute( DBFHandle hDBF, int iShape, int iField ); +int SHPAPI_CALL + DBFIsAttributeNULL( DBFHandle hDBF, int iShape, int iField ); + +int SHPAPI_CALL + DBFWriteIntegerAttribute( DBFHandle hDBF, int iShape, int iField, + int nFieldValue ); +int SHPAPI_CALL + DBFWriteDoubleAttribute( DBFHandle hDBF, int iShape, int iField, + double dFieldValue ); +int SHPAPI_CALL + DBFWriteStringAttribute( DBFHandle hDBF, int iShape, int iField, + const char * pszFieldValue ); +int SHPAPI_CALL + DBFWriteNULLAttribute( DBFHandle hDBF, int iShape, int iField ); + +int SHPAPI_CALL + DBFWriteLogicalAttribute( DBFHandle hDBF, int iShape, int iField, + const char lFieldValue); +int SHPAPI_CALL + DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, int iField, + void * pValue ); +const char SHPAPI_CALL1(*) + DBFReadTuple(DBFHandle psDBF, int hEntity ); +int SHPAPI_CALL + DBFWriteTuple(DBFHandle psDBF, int hEntity, void * pRawTuple ); + +int SHPAPI_CALL DBFIsRecordDeleted( DBFHandle psDBF, int iShape ); +int SHPAPI_CALL DBFMarkRecordDeleted( DBFHandle psDBF, int iShape, + int bIsDeleted ); + +DBFHandle SHPAPI_CALL + DBFCloneEmpty(DBFHandle psDBF, const char * pszFilename ); + +void SHPAPI_CALL + DBFClose( DBFHandle hDBF ); +void SHPAPI_CALL + DBFUpdateHeader( DBFHandle hDBF ); +char SHPAPI_CALL + DBFGetNativeFieldType( DBFHandle hDBF, int iField ); + +const char SHPAPI_CALL1(*) + DBFGetCodePage(DBFHandle psDBF ); + +void SHPAPI_CALL + DBFSetLastModifiedDate( DBFHandle psDBF, int nYYSince1900, int nMM, int nDD ); + +void SHPAPI_CALL DBFSetWriteEndOfFileChar( DBFHandle psDBF, int bWriteFlag ); + +#ifdef __cplusplus +} +#endif + +#endif /* ndef SHAPEFILE_H_INCLUDED */ diff --git a/libs/shapelib/shapelib.pc.in b/libs/shapelib/shapelib.pc.in new file mode 100644 index 0000000..99f0034 --- /dev/null +++ b/libs/shapelib/shapelib.pc.in @@ -0,0 +1,14 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +datarootdir=@datarootdir@ +datadir=@datadir@ +includedir=@includedir@ + +Name: shapelib +Description: C API for processing ESRI Shapefiles +Version: @VERSION@ +Libs.private: @PROJ_LIBS@ +Cflags.private: @PROJ_CFLAGS@ +Libs: -L${libdir} -lshp +Cflags: -I${includedir} diff --git a/libs/shapelib/shpadd.c b/libs/shapelib/shpadd.c new file mode 100644 index 0000000..d18957c --- /dev/null +++ b/libs/shapelib/shpadd.c @@ -0,0 +1,241 @@ +/****************************************************************************** + * $Id: shpadd.c,v 1.18 2016-12-05 12:44:05 erouault Exp $ + * + * Project: Shapelib + * Purpose: Sample application for adding a shape to a shapefile. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * $Log: shpadd.c,v $ + * Revision 1.18 2016-12-05 12:44:05 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.17 2016-12-04 15:30:15 erouault + * * shpopen.c, dbfopen.c, shptree.c, shapefil.h: resync with + * GDAL Shapefile driver. Mostly cleanups. SHPObject and DBFInfo + * structures extended with new members. New functions: + * DBFSetLastModifiedDate, SHPOpenLLEx, SHPRestoreSHX, + * SHPSetFastModeReadObject + * + * * sbnsearch.c: new file to implement original ESRI .sbn spatial + * index reading. (no write support). New functions: + * SBNOpenDiskTree, SBNCloseDiskTree, SBNSearchDiskTree, + * SBNSearchDiskTreeInteger, SBNSearchFreeIds + * + * * Makefile, makefile.vc, CMakeLists.txt, shapelib.def: updates + * with new file and symbols. + * + * * commit: helper script to cvs commit + * + * Revision 1.16 2010-06-21 20:41:52 fwarmerdam + * reformat white space + * + * Revision 1.15 2007-12-30 16:57:32 fwarmerdam + * add support for z and m + * + * Revision 1.14 2004/09/26 20:09:35 fwarmerdam + * avoid rcsid warnings + * + * Revision 1.13 2002/01/15 14:36:07 warmerda + * updated email address + * + * Revision 1.12 2001/05/31 19:35:29 warmerda + * added support for writing null shapes + * + * Revision 1.11 2000/07/07 13:39:45 warmerda + * removed unused variables, and added system include files + * + * Revision 1.10 2000/05/24 15:09:22 warmerda + * Added logic to graw vertex lists of needed. + * + * Revision 1.9 1999/11/05 14:12:04 warmerda + * updated license terms + * + * Revision 1.8 1998/12/03 16:36:26 warmerda + * Use r+b rather than rb+ for binary access. + * + * Revision 1.7 1998/11/09 20:57:04 warmerda + * Fixed SHPGetInfo() call. + * + * Revision 1.6 1998/11/09 20:19:16 warmerda + * Changed to use SHPObject based API. + * + * Revision 1.5 1997/03/06 14:05:02 warmerda + * fixed typo. + * + * Revision 1.4 1997/03/06 14:01:16 warmerda + * added memory allocation checking, and free()s. + * + * Revision 1.3 1995/10/21 03:14:37 warmerda + * Changed to use binary file access + * + * Revision 1.2 1995/08/04 03:18:01 warmerda + * Added header. + * + */ + +#include +#include +#include "shapefil.h" + +SHP_CVSID("$Id: shpadd.c,v 1.18 2016-12-05 12:44:05 erouault Exp $") + +int main( int argc, char ** argv ) + +{ + SHPHandle hSHP; + int nShapeType, nVertices, nParts, *panParts, i, nVMax; + double *padfX, *padfY, *padfZ = NULL, *padfM = NULL; + SHPObject *psObject; + const char *tuple = ""; + const char *filename; + +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( argc < 2 ) + { + printf( "shpadd shp_file [[x y] [+]]*\n" ); + printf( " or\n" ); + printf( "shpadd shp_file -m [[x y m] [+]]*\n" ); + printf( " or\n" ); + printf( "shpadd shp_file -z [[x y z] [+]]*\n" ); + printf( " or\n" ); + printf( "shpadd shp_file -zm [[x y z m] [+]]*\n" ); + exit( 1 ); + } + + filename = argv[1]; + argv++; + argc--; + +/* -------------------------------------------------------------------- */ +/* Check for tuple description options. */ +/* -------------------------------------------------------------------- */ + if( argc > 1 + && (strcmp(argv[1],"-z") == 0 + || strcmp(argv[1],"-m") == 0 + || strcmp(argv[1],"-zm") == 0) ) + { + tuple = argv[1] + 1; + argv++; + argc--; + } + +/* -------------------------------------------------------------------- */ +/* Open the passed shapefile. */ +/* -------------------------------------------------------------------- */ + hSHP = SHPOpen( filename, "r+b" ); + + if( hSHP == NULL ) + { + printf( "Unable to open:%s\n", filename ); + exit( 1 ); + } + + SHPGetInfo( hSHP, NULL, &nShapeType, NULL, NULL ); + + if( argc == 1 ) + nShapeType = SHPT_NULL; + +/* -------------------------------------------------------------------- */ +/* Build a vertex/part list from the command line arguments. */ +/* -------------------------------------------------------------------- */ + nVMax = 1000; + padfX = (double *) malloc(sizeof(double) * nVMax); + padfY = (double *) malloc(sizeof(double) * nVMax); + + if( strchr(tuple,'z') ) + padfZ = (double *) malloc(sizeof(double) * nVMax); + if( strchr(tuple,'m') ) + padfM = (double *) malloc(sizeof(double) * nVMax); + + nVertices = 0; + + if( (panParts = (int *) malloc(sizeof(int) * 1000 )) == NULL ) + { + printf( "Out of memory\n" ); + exit( 1 ); + } + + nParts = 1; + panParts[0] = 0; + + for( i = 1; i < argc; ) + { + if( argv[i][0] == '+' ) + { + panParts[nParts++] = nVertices; + i++; + } + else if( i < argc-1-(int)strlen(tuple) ) + { + if( nVertices == nVMax ) + { + nVMax = nVMax * 2; + padfX = (double *) realloc(padfX,sizeof(double)*nVMax); + padfY = (double *) realloc(padfY,sizeof(double)*nVMax); + if( padfZ ) + padfZ = (double *) realloc(padfZ,sizeof(double)*nVMax); + if( padfM ) + padfM = (double *) realloc(padfM,sizeof(double)*nVMax); + } + + sscanf( argv[i++], "%lg", padfX+nVertices ); + sscanf( argv[i++], "%lg", padfY+nVertices ); + if( padfZ ) + sscanf( argv[i++], "%lg", padfZ+nVertices ); + if( padfM ) + sscanf( argv[i++], "%lg", padfM+nVertices ); + + nVertices += 1; + } + } + +/* -------------------------------------------------------------------- */ +/* Write the new entity to the shape file. */ +/* -------------------------------------------------------------------- */ + psObject = SHPCreateObject( nShapeType, -1, nParts, panParts, NULL, + nVertices, padfX, padfY, padfZ, padfM ); + SHPWriteObject( hSHP, -1, psObject ); + SHPDestroyObject( psObject ); + + SHPClose( hSHP ); + + free( panParts ); + free( padfX ); + free( padfY ); + free( padfZ ); + free( padfM ); + + return 0; +} diff --git a/libs/shapelib/shpcreate.c b/libs/shapelib/shpcreate.c new file mode 100644 index 0000000..69ec267 --- /dev/null +++ b/libs/shapelib/shpcreate.c @@ -0,0 +1,135 @@ +/****************************************************************************** + * $Id: shpcreate.c,v 1.9 2016-12-05 12:44:05 erouault Exp $ + * + * Project: Shapelib + * Purpose: Sample application for creating a new shapefile. + * Author: Frank Warmerdam, warmerdm@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * $Log: shpcreate.c,v $ + * Revision 1.9 2016-12-05 12:44:05 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.8 2007-12-30 16:57:33 fwarmerdam + * add support for z and m + * + * Revision 1.7 2004/09/26 20:09:35 fwarmerdam + * avoid rcsid warnings + * + * Revision 1.6 2004/01/09 16:39:49 fwarmerdam + * include standard include files + * + * Revision 1.5 2002/01/15 14:36:07 warmerda + * updated email address + * + * Revision 1.4 2000/07/07 13:39:45 warmerda + * removed unused variables, and added system include files + * + * Revision 1.3 1999/11/05 14:12:04 warmerda + * updated license terms + * + * Revision 1.2 1995/08/04 03:16:43 warmerda + * Added header. + * + */ + +#include +#include +#include "shapefil.h" + +SHP_CVSID("$Id: shpcreate.c,v 1.9 2016-12-05 12:44:05 erouault Exp $") + +int main( int argc, char ** argv ) + +{ + SHPHandle hSHP; + int nShapeType; + +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( argc != 3 ) + { + printf( "shpcreate shp_file [point/arc/polygon/multipoint][/m/z]\n" ); + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Figure out the shape type. */ +/* -------------------------------------------------------------------- */ + if( strcmp(argv[2],"POINT") == 0 || strcmp(argv[2],"point") == 0 ) + nShapeType = SHPT_POINT; + else if( strcmp(argv[2],"ARC") == 0 || strcmp(argv[2],"arc") == 0 ) + nShapeType = SHPT_ARC; + else if( strcmp(argv[2],"POLYGON") == 0 || strcmp(argv[2],"polygon") == 0 ) + nShapeType = SHPT_POLYGON; + else if( strcmp(argv[2],"MULTIPOINT")==0 ||strcmp(argv[2],"multipoint")==0) + nShapeType = SHPT_MULTIPOINT; + else if( strcmp(argv[2],"POINTZ") == 0 || strcmp(argv[2],"pointz") == 0 ) + nShapeType = SHPT_POINTZ; + else if( strcmp(argv[2],"ARCZ") == 0 || strcmp(argv[2],"arcz") == 0 ) + nShapeType = SHPT_ARCZ; + else if( strcmp(argv[2],"POLYGONZ") == 0 || strcmp(argv[2],"polygonz") == 0) + nShapeType = SHPT_POLYGONZ; + else if( strcmp(argv[2],"MULTIPOINTZ") == 0 + || strcmp(argv[2],"multipointz") == 0) + nShapeType = SHPT_MULTIPOINTZ; + else if( strcmp(argv[2],"POINTM") == 0 || strcmp(argv[2],"pointm") == 0 ) + nShapeType = SHPT_POINTM; + else if( strcmp(argv[2],"ARCM") == 0 || strcmp(argv[2],"arcm") == 0 ) + nShapeType = SHPT_ARCM; + else if( strcmp(argv[2],"POLYGONM") == 0 || strcmp(argv[2],"polygonm") == 0) + nShapeType = SHPT_POLYGONM; + else if( strcmp(argv[2],"MULTIPOINTM") == 0 + || strcmp(argv[2],"multipointm") == 0 ) + nShapeType = SHPT_MULTIPOINTM; + else + { + printf( "Shape Type `%s' not recognised.\n", argv[2] ); + exit( 2 ); + } + +/* -------------------------------------------------------------------- */ +/* Create the requested layer. */ +/* -------------------------------------------------------------------- */ + hSHP = SHPCreate( argv[1], nShapeType ); + + if( hSHP == NULL ) + { + printf( "Unable to create:%s\n", argv[1] ); + exit( 3 ); + } + + SHPClose( hSHP ); + + return 0; +} diff --git a/libs/shapelib/shpdump.c b/libs/shapelib/shpdump.c new file mode 100644 index 0000000..d0f2ec5 --- /dev/null +++ b/libs/shapelib/shpdump.c @@ -0,0 +1,284 @@ +/****************************************************************************** + * $Id: shpdump.c,v 1.19 2016-12-05 12:44:05 erouault Exp $ + * + * Project: Shapelib + * Purpose: Sample application for dumping contents of a shapefile to + * the terminal in human readable form. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * $Log: shpdump.c,v $ + * Revision 1.19 2016-12-05 12:44:05 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.18 2011-07-24 03:05:14 fwarmerdam + * use %.15g for formatting coordiantes in shpdump + * + * Revision 1.17 2010-07-01 07:33:04 fwarmerdam + * do not crash in shpdump if null object returned + * + * Revision 1.16 2010-07-01 07:27:13 fwarmerdam + * white space formatting adjustments + * + * Revision 1.15 2006-01-26 15:07:32 fwarmerdam + * add bMeasureIsUsed flag from Craig Bruce: Bug 1249 + * + * Revision 1.14 2005/02/11 17:17:46 fwarmerdam + * added panPartStart[0] validation + * + * Revision 1.13 2004/09/26 20:09:35 fwarmerdam + * avoid rcsid warnings + * + * Revision 1.12 2004/01/27 18:05:35 fwarmerdam + * Added the -ho (header only) switch. + * + * Revision 1.11 2004/01/09 16:39:49 fwarmerdam + * include standard include files + * + * Revision 1.10 2002/04/10 16:59:29 warmerda + * added -validate switch + * + * Revision 1.9 2002/01/15 14:36:07 warmerda + * updated email address + * + * Revision 1.8 2000/07/07 13:39:45 warmerda + * removed unused variables, and added system include files + * + * Revision 1.7 1999/11/05 14:12:04 warmerda + * updated license terms + * + * Revision 1.6 1998/12/03 15:48:48 warmerda + * Added report of shapefile type, and total number of shapes. + * + * Revision 1.5 1998/11/09 20:57:36 warmerda + * use SHPObject. + * + * Revision 1.4 1995/10/21 03:14:49 warmerda + * Changed to use binary file access. + * + * Revision 1.3 1995/08/23 02:25:25 warmerda + * Added support for bounds. + * + * Revision 1.2 1995/08/04 03:18:11 warmerda + * Added header. + * + */ + +#include +#include +#include "shapefil.h" + +SHP_CVSID("$Id: shpdump.c,v 1.19 2016-12-05 12:44:05 erouault Exp $") + +int main( int argc, char ** argv ) + +{ + SHPHandle hSHP; + int nShapeType, nEntities, i, iPart, bValidate = 0,nInvalidCount=0; + int bHeaderOnly = 0; + const char *pszPlus; + double adfMinBound[4], adfMaxBound[4]; + int nPrecision = 15; + + if( argc > 1 && strcmp(argv[1],"-validate") == 0 ) + { + bValidate = 1; + argv++; + argc--; + } + + if( argc > 1 && strcmp(argv[1],"-ho") == 0 ) + { + bHeaderOnly = 1; + argv++; + argc--; + } + + if( argc > 2 && strcmp(argv[1],"-precision") == 0 ) + { + nPrecision = atoi(argv[2]); + argv+=2; + argc-=2; + } + +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( argc != 2 ) + { + printf( "shpdump [-validate] [-ho] [-precision number] shp_file\n" ); + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Open the passed shapefile. */ +/* -------------------------------------------------------------------- */ + hSHP = SHPOpen( argv[1], "rb" ); + + if( hSHP == NULL ) + { + printf( "Unable to open:%s\n", argv[1] ); + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Print out the file bounds. */ +/* -------------------------------------------------------------------- */ + SHPGetInfo( hSHP, &nEntities, &nShapeType, adfMinBound, adfMaxBound ); + + printf( "Shapefile Type: %s # of Shapes: %d\n\n", + SHPTypeName( nShapeType ), nEntities ); + + printf( "File Bounds: (%.*g,%.*g,%.*g,%.*g)\n" + " to (%.*g,%.*g,%.*g,%.*g)\n", + nPrecision, adfMinBound[0], + nPrecision, adfMinBound[1], + nPrecision, adfMinBound[2], + nPrecision, adfMinBound[3], + nPrecision, adfMaxBound[0], + nPrecision, adfMaxBound[1], + nPrecision, adfMaxBound[2], + nPrecision, adfMaxBound[3] ); + +/* -------------------------------------------------------------------- */ +/* Skim over the list of shapes, printing all the vertices. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < nEntities && !bHeaderOnly; i++ ) + { + int j; + SHPObject *psShape; + + psShape = SHPReadObject( hSHP, i ); + + if( psShape == NULL ) + { + fprintf( stderr, + "Unable to read shape %d, terminating object reading.\n", + i ); + break; + } + + if( psShape->bMeasureIsUsed ) + printf( "\nShape:%d (%s) nVertices=%d, nParts=%d\n" + " Bounds:(%.*g,%.*g, %.*g, %.*g)\n" + " to (%.*g,%.*g, %.*g, %.*g)\n", + i, SHPTypeName(psShape->nSHPType), + psShape->nVertices, psShape->nParts, + nPrecision, psShape->dfXMin, + nPrecision, psShape->dfYMin, + nPrecision, psShape->dfZMin, + nPrecision, psShape->dfMMin, + nPrecision, psShape->dfXMax, + nPrecision, psShape->dfYMax, + nPrecision, psShape->dfZMax, + nPrecision, psShape->dfMMax ); + else + printf( "\nShape:%d (%s) nVertices=%d, nParts=%d\n" + " Bounds:(%.*g,%.*g, %.*g)\n" + " to (%.*g,%.*g, %.*g)\n", + i, SHPTypeName(psShape->nSHPType), + psShape->nVertices, psShape->nParts, + nPrecision, psShape->dfXMin, + nPrecision, psShape->dfYMin, + nPrecision, psShape->dfZMin, + nPrecision, psShape->dfXMax, + nPrecision, psShape->dfYMax, + nPrecision, psShape->dfZMax ); + + if( psShape->nParts > 0 && psShape->panPartStart[0] != 0 ) + { + fprintf( stderr, "panPartStart[0] = %d, not zero as expected.\n", + psShape->panPartStart[0] ); + } + + for( j = 0, iPart = 1; j < psShape->nVertices; j++ ) + { + const char *pszPartType = ""; + + if( j == 0 && psShape->nParts > 0 ) + pszPartType = SHPPartTypeName( psShape->panPartType[0] ); + + if( iPart < psShape->nParts + && psShape->panPartStart[iPart] == j ) + { + pszPartType = SHPPartTypeName( psShape->panPartType[iPart] ); + iPart++; + pszPlus = "+"; + } + else + pszPlus = " "; + + if( psShape->bMeasureIsUsed ) + printf(" %s (%.*g,%.*g, %.*g, %.*g) %s \n", + pszPlus, + nPrecision, psShape->padfX[j], + nPrecision, psShape->padfY[j], + nPrecision, psShape->padfZ[j], + nPrecision, psShape->padfM[j], + pszPartType ); + else + printf(" %s (%.*g,%.*g, %.*g) %s \n", + pszPlus, + nPrecision, psShape->padfX[j], + nPrecision, psShape->padfY[j], + nPrecision, psShape->padfZ[j], + pszPartType ); + } + + if( bValidate ) + { + int nAltered = SHPRewindObject( hSHP, psShape ); + + if( nAltered > 0 ) + { + printf( " %d rings wound in the wrong direction.\n", + nAltered ); + nInvalidCount++; + } + } + + SHPDestroyObject( psShape ); + } + + SHPClose( hSHP ); + + if( bValidate ) + { + printf( "%d object has invalid ring orderings.\n", nInvalidCount ); + } + +#ifdef USE_DBMALLOC + malloc_dump(2); +#endif + + exit( 0 ); +} diff --git a/libs/shapelib/shpopen.c b/libs/shapelib/shpopen.c new file mode 100644 index 0000000..f9d28c2 --- /dev/null +++ b/libs/shapelib/shpopen.c @@ -0,0 +1,3086 @@ +/****************************************************************************** + * $Id: shpopen.c,v 1.76 2017-09-10 10:11:36 erouault Exp $ + * + * Project: Shapelib + * Purpose: Implementation of core Shapefile read/write functions. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, 2001, Frank Warmerdam + * Copyright (c) 2011-2013, Even Rouault + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * $Log: shpopen.c,v $ + * Revision 1.76 2017-09-10 10:11:36 erouault + * * shpopen.c: resync with GDAL copy. Make sure to zero terminate all + * error messages. And fix regression regarding re-writing the last shape + * of a file (https://trac.osgeo.org/gdal/ticket/7031) + * + * Revision 1.75 2016-12-05 12:44:05 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.74 2016-12-04 15:30:15 erouault + * * shpopen.c, dbfopen.c, shptree.c, shapefil.h: resync with + * GDAL Shapefile driver. Mostly cleanups. SHPObject and DBFInfo + * structures extended with new members. New functions: + * DBFSetLastModifiedDate, SHPOpenLLEx, SHPRestoreSHX, + * SHPSetFastModeReadObject + * + * * sbnsearch.c: new file to implement original ESRI .sbn spatial + * index reading. (no write support). New functions: + * SBNOpenDiskTree, SBNCloseDiskTree, SBNSearchDiskTree, + * SBNSearchDiskTreeInteger, SBNSearchFreeIds + * + * * Makefile, makefile.vc, CMakeLists.txt, shapelib.def: updates + * with new file and symbols. + * + * * commit: helper script to cvs commit + * + * Revision 1.73 2012-01-24 22:33:01 fwarmerdam + * fix memory leak on failure to open .shp (gdal #4410) + * + * Revision 1.72 2011-12-11 22:45:28 fwarmerdam + * fix failure return from SHPOpenLL. + * + * Revision 1.71 2011-09-15 03:33:58 fwarmerdam + * fix missing cast (#2344) + * + * Revision 1.70 2011-07-24 05:59:25 fwarmerdam + * minimize use of CPLError in favor of SAHooks.Error() + * + * Revision 1.69 2011-07-24 03:24:22 fwarmerdam + * fix memory leaks in error cases creating shapefiles (#2061) + * + * Revision 1.68 2010-08-27 23:42:52 fwarmerdam + * add SHPAPI_CALL attribute in code + * + * Revision 1.67 2010-07-01 08:15:48 fwarmerdam + * do not error out on an object with zero vertices + * + * Revision 1.66 2010-07-01 07:58:57 fwarmerdam + * minor cleanup of error handling + * + * Revision 1.65 2010-07-01 07:27:13 fwarmerdam + * white space formatting adjustments + * + * Revision 1.64 2010-01-28 11:34:34 fwarmerdam + * handle the shape file length limits more gracefully (#3236) + * + * Revision 1.63 2010-01-28 04:04:40 fwarmerdam + * improve numerical accuracy of SHPRewind() algs (gdal #3363) + * + * Revision 1.62 2010-01-17 05:34:13 fwarmerdam + * Remove asserts on x/y being null (#2148). + * + * Revision 1.61 2010-01-16 05:07:42 fwarmerdam + * allow 0/nulls in shpcreateobject (#2148) + * + * Revision 1.60 2009-09-17 20:50:02 bram + * on Win32, define snprintf as alias to _snprintf + * + * Revision 1.59 2008-03-14 05:25:31 fwarmerdam + * Correct crash on buggy geometries (gdal #2218) + * + * Revision 1.58 2008/01/08 23:28:26 bram + * on line 2095, use a float instead of a double to avoid a compiler warning + * + * Revision 1.57 2007/12/06 07:00:25 fwarmerdam + * dbfopen now using SAHooks for fileio + * + * Revision 1.56 2007/12/04 20:37:56 fwarmerdam + * preliminary implementation of hooks api for io and errors + * + * Revision 1.55 2007/11/21 22:39:56 fwarmerdam + * close shx file in readonly mode (GDAL #1956) + * + * Revision 1.54 2007/11/15 00:12:47 mloskot + * Backported recent changes from GDAL (Ticket #1415) to Shapelib. + * + * Revision 1.53 2007/11/14 22:31:08 fwarmerdam + * checks after mallocs to detect for corrupted/voluntary broken shapefiles. + * http://trac.osgeo.org/gdal/ticket/1991 + * + * Revision 1.52 2007/06/21 15:58:33 fwarmerdam + * fix for SHPRewindObject when rings touch at one vertex (gdal #976) + * + * Revision 1.51 2006/09/04 15:24:01 fwarmerdam + * Fixed up log message for 1.49. + * + * Revision 1.50 2006/09/04 15:21:39 fwarmerdam + * fix of last fix + * + * Revision 1.49 2006/09/04 15:21:00 fwarmerdam + * MLoskot: Added stronger test of Shapefile reading failures, e.g. truncated + * files. The problem was discovered by Tim Sutton and reported here + * https://svn.qgis.org/trac/ticket/200 + * + * Revision 1.48 2006/01/26 15:07:32 fwarmerdam + * add bMeasureIsUsed flag from Craig Bruce: Bug 1249 + * + * Revision 1.47 2006/01/04 20:07:23 fwarmerdam + * In SHPWriteObject() make sure that the record length is updated + * when rewriting an existing record. + * + * Revision 1.46 2005/02/11 17:17:46 fwarmerdam + * added panPartStart[0] validation + * + * Revision 1.45 2004/09/26 20:09:48 fwarmerdam + * const correctness changes + * + * Revision 1.44 2003/12/29 00:18:39 fwarmerdam + * added error checking for failed IO and optional CPL error reporting + * + * Revision 1.43 2003/12/01 16:20:08 warmerda + * be careful of zero vertex shapes + * + * Revision 1.42 2003/12/01 14:58:27 warmerda + * added degenerate object check in SHPRewindObject() + * + * Revision 1.41 2003/07/08 15:22:43 warmerda + * avoid warning + * + * Revision 1.40 2003/04/21 18:30:37 warmerda + * added header write/update public methods + * + * Revision 1.39 2002/08/26 06:46:56 warmerda + * avoid c++ comments + * + * Revision 1.38 2002/05/07 16:43:39 warmerda + * Removed debugging printf() + * + * Revision 1.37 2002/04/10 17:35:22 warmerda + * fixed bug in ring reversal code + * + * Revision 1.36 2002/04/10 16:59:54 warmerda + * added SHPRewindObject + * + * Revision 1.35 2001/12/07 15:10:44 warmerda + * fix if .shx fails to open + * + * Revision 1.34 2001/11/01 16:29:55 warmerda + * move pabyRec into SHPInfo for thread safety + * + * Revision 1.33 2001/07/03 12:18:15 warmerda + * Improved cleanup if SHX not found, provided by Riccardo Cohen. + * + * Revision 1.32 2001/06/22 01:58:07 warmerda + * be more careful about establishing initial bounds in face of NULL shapes + * + * Revision 1.31 2001/05/31 19:35:29 warmerda + * added support for writing null shapes + * + * Revision 1.30 2001/05/28 12:46:29 warmerda + * Add some checking on reasonableness of record count when opening. + * + * Revision 1.29 2001/05/23 13:36:52 warmerda + * added use of SHPAPI_CALL + * + * Revision 1.28 2001/02/06 22:25:06 warmerda + * fixed memory leaks when SHPOpen() fails + * + * Revision 1.27 2000/07/18 15:21:33 warmerda + * added better enforcement of -1 for append in SHPWriteObject + * + * Revision 1.26 2000/02/16 16:03:51 warmerda + * added null shape support + * + * Revision 1.25 1999/12/15 13:47:07 warmerda + * Fixed record size settings in .shp file (was 4 words too long) + * Added stdlib.h. + * + * Revision 1.24 1999/11/05 14:12:04 warmerda + * updated license terms + * + * Revision 1.23 1999/07/27 00:53:46 warmerda + * added support for rewriting shapes + * + * Revision 1.22 1999/06/11 19:19:11 warmerda + * Cleanup pabyRec static buffer on SHPClose(). + * + * Revision 1.21 1999/06/02 14:57:56 kshih + * Remove unused variables + * + * Revision 1.20 1999/04/19 21:04:17 warmerda + * Fixed syntax error. + * + * Revision 1.19 1999/04/19 21:01:57 warmerda + * Force access string to binary in SHPOpen(). + * + * Revision 1.18 1999/04/01 18:48:07 warmerda + * Try upper case extensions if lower case doesn't work. + * + * Revision 1.17 1998/12/31 15:29:39 warmerda + * Disable writing measure values to multipatch objects if + * DISABLE_MULTIPATCH_MEASURE is defined. + * + * Revision 1.16 1998/12/16 05:14:33 warmerda + * Added support to write MULTIPATCH. Fixed reading Z coordinate of + * MULTIPATCH. Fixed record size written for all feature types. + * + * Revision 1.15 1998/12/03 16:35:29 warmerda + * r+b is proper binary access string, not rb+. + * + * Revision 1.14 1998/12/03 15:47:56 warmerda + * Fixed setting of nVertices in SHPCreateObject(). + * + * Revision 1.13 1998/12/03 15:33:54 warmerda + * Made SHPCalculateExtents() separately callable. + * + * Revision 1.12 1998/11/11 20:01:50 warmerda + * Fixed bug writing ArcM/Z, and PolygonM/Z for big endian machines. + * + * Revision 1.11 1998/11/09 20:56:44 warmerda + * Fixed up handling of file wide bounds. + * + * Revision 1.10 1998/11/09 20:18:51 warmerda + * Converted to support 3D shapefiles, and use of SHPObject. + * + * Revision 1.9 1998/02/24 15:09:05 warmerda + * Fixed memory leak. + * + * Revision 1.8 1997/12/04 15:40:29 warmerda + * Fixed byte swapping of record number, and record length fields in the + * .shp file. + * + * Revision 1.7 1995/10/21 03:15:58 warmerda + * Added support for binary file access, the magic cookie 9997 + * and tried to improve the int32 selection logic for 16bit systems. + * + * Revision 1.6 1995/09/04 04:19:41 warmerda + * Added fix for file bounds. + * + * Revision 1.5 1995/08/25 15:16:44 warmerda + * Fixed a couple of problems with big endian systems ... one with bounds + * and the other with multipart polygons. + * + * Revision 1.4 1995/08/24 18:10:17 warmerda + * Switch to use SfRealloc() to avoid problems with pre-ANSI realloc() + * functions (such as on the Sun). + * + * Revision 1.3 1995/08/23 02:23:15 warmerda + * Added support for reading bounds, and fixed up problems in setting the + * file wide bounds. + * + * Revision 1.2 1995/08/04 03:16:57 warmerda + * Added header. + * + */ + +#include "shapefil.h" + +#include +#include +#include +#include +#include +#include +#include + +SHP_CVSID("$Id: shpopen.c,v 1.76 2017-09-10 10:11:36 erouault Exp $") + +typedef unsigned char uchar; + +#if UINT_MAX == 65535 +typedef unsigned long int32; +#else +typedef unsigned int int32; +#endif + +#ifndef FALSE +# define FALSE 0 +# define TRUE 1 +#endif + +#define ByteCopy( a, b, c ) memcpy( b, a, c ) +#ifndef MAX +# define MIN(a,b) ((ab) ? a : b) +#endif + +#ifndef USE_CPL +#if defined(_MSC_VER) +# if _MSC_VER < 1900 +# define snprintf _snprintf +# endif +#elif defined(WIN32) || defined(_WIN32) +# ifndef snprintf +# define snprintf _snprintf +# endif +#endif +#endif + +#ifndef CPL_UNUSED +#if defined(__GNUC__) && __GNUC__ >= 4 +# define CPL_UNUSED __attribute((__unused__)) +#else +# define CPL_UNUSED +#endif +#endif + +#if defined(CPL_LSB) +#define bBigEndian FALSE +#elif defined(CPL_MSB) +#define bBigEndian TRUE +#else +static int bBigEndian; +#endif + +/************************************************************************/ +/* SwapWord() */ +/* */ +/* Swap a 2, 4 or 8 byte word. */ +/************************************************************************/ + +static void SwapWord( int length, void * wordP ) + +{ + int i; + uchar temp; + + for( i=0; i < length/2; i++ ) + { + temp = ((uchar *) wordP)[i]; + ((uchar *)wordP)[i] = ((uchar *) wordP)[length-i-1]; + ((uchar *) wordP)[length-i-1] = temp; + } +} + +/************************************************************************/ +/* SfRealloc() */ +/* */ +/* A realloc cover function that will access a NULL pointer as */ +/* a valid input. */ +/************************************************************************/ + +static void * SfRealloc( void * pMem, int nNewSize ) + +{ + if( pMem == NULL ) + return( (void *) malloc(nNewSize) ); + else + return( (void *) realloc(pMem,nNewSize) ); +} + +/************************************************************************/ +/* SHPWriteHeader() */ +/* */ +/* Write out a header for the .shp and .shx files as well as the */ +/* contents of the index (.shx) file. */ +/************************************************************************/ + +void SHPAPI_CALL SHPWriteHeader( SHPHandle psSHP ) + +{ + uchar abyHeader[100] = { 0 }; + int i; + int32 i32; + double dValue; + int32 *panSHX; + + if (psSHP->fpSHX == NULL) + { + psSHP->sHooks.Error( "SHPWriteHeader failed : SHX file is closed"); + return; + } + +/* -------------------------------------------------------------------- */ +/* Prepare header block for .shp file. */ +/* -------------------------------------------------------------------- */ + + abyHeader[2] = 0x27; /* magic cookie */ + abyHeader[3] = 0x0a; + + i32 = psSHP->nFileSize/2; /* file size */ + ByteCopy( &i32, abyHeader+24, 4 ); + if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); + + i32 = 1000; /* version */ + ByteCopy( &i32, abyHeader+28, 4 ); + if( bBigEndian ) SwapWord( 4, abyHeader+28 ); + + i32 = psSHP->nShapeType; /* shape type */ + ByteCopy( &i32, abyHeader+32, 4 ); + if( bBigEndian ) SwapWord( 4, abyHeader+32 ); + + dValue = psSHP->adBoundsMin[0]; /* set bounds */ + ByteCopy( &dValue, abyHeader+36, 8 ); + if( bBigEndian ) SwapWord( 8, abyHeader+36 ); + + dValue = psSHP->adBoundsMin[1]; + ByteCopy( &dValue, abyHeader+44, 8 ); + if( bBigEndian ) SwapWord( 8, abyHeader+44 ); + + dValue = psSHP->adBoundsMax[0]; + ByteCopy( &dValue, abyHeader+52, 8 ); + if( bBigEndian ) SwapWord( 8, abyHeader+52 ); + + dValue = psSHP->adBoundsMax[1]; + ByteCopy( &dValue, abyHeader+60, 8 ); + if( bBigEndian ) SwapWord( 8, abyHeader+60 ); + + dValue = psSHP->adBoundsMin[2]; /* z */ + ByteCopy( &dValue, abyHeader+68, 8 ); + if( bBigEndian ) SwapWord( 8, abyHeader+68 ); + + dValue = psSHP->adBoundsMax[2]; + ByteCopy( &dValue, abyHeader+76, 8 ); + if( bBigEndian ) SwapWord( 8, abyHeader+76 ); + + dValue = psSHP->adBoundsMin[3]; /* m */ + ByteCopy( &dValue, abyHeader+84, 8 ); + if( bBigEndian ) SwapWord( 8, abyHeader+84 ); + + dValue = psSHP->adBoundsMax[3]; + ByteCopy( &dValue, abyHeader+92, 8 ); + if( bBigEndian ) SwapWord( 8, abyHeader+92 ); + +/* -------------------------------------------------------------------- */ +/* Write .shp file header. */ +/* -------------------------------------------------------------------- */ + if( psSHP->sHooks.FSeek( psSHP->fpSHP, 0, 0 ) != 0 + || psSHP->sHooks.FWrite( abyHeader, 100, 1, psSHP->fpSHP ) != 1 ) + { + char szErrorMsg[200]; + + snprintf( szErrorMsg, sizeof(szErrorMsg), + "Failure writing .shp header: %s", strerror(errno) ); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); + return; + } + +/* -------------------------------------------------------------------- */ +/* Prepare, and write .shx file header. */ +/* -------------------------------------------------------------------- */ + i32 = (psSHP->nRecords * 2 * sizeof(int32) + 100)/2; /* file size */ + ByteCopy( &i32, abyHeader+24, 4 ); + if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); + + if( psSHP->sHooks.FSeek( psSHP->fpSHX, 0, 0 ) != 0 + || psSHP->sHooks.FWrite( abyHeader, 100, 1, psSHP->fpSHX ) != 1 ) + { + char szErrorMsg[200]; + + snprintf( szErrorMsg, sizeof(szErrorMsg), + "Failure writing .shx header: %s", strerror(errno) ); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); + + return; + } + +/* -------------------------------------------------------------------- */ +/* Write out the .shx contents. */ +/* -------------------------------------------------------------------- */ + panSHX = (int32 *) malloc(sizeof(int32) * 2 * psSHP->nRecords); + if( panSHX == NULL ) + { + psSHP->sHooks.Error( "Failure allocatin panSHX" ); + return; + } + + for( i = 0; i < psSHP->nRecords; i++ ) + { + panSHX[i*2 ] = psSHP->panRecOffset[i]/2; + panSHX[i*2+1] = psSHP->panRecSize[i]/2; + if( !bBigEndian ) SwapWord( 4, panSHX+i*2 ); + if( !bBigEndian ) SwapWord( 4, panSHX+i*2+1 ); + } + + if( (int)psSHP->sHooks.FWrite( panSHX, sizeof(int32)*2, psSHP->nRecords, psSHP->fpSHX ) + != psSHP->nRecords ) + { + char szErrorMsg[200]; + + snprintf( szErrorMsg, sizeof(szErrorMsg), + "Failure writing .shx contents: %s", strerror(errno) ); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); + } + + free( panSHX ); + +/* -------------------------------------------------------------------- */ +/* Flush to disk. */ +/* -------------------------------------------------------------------- */ + psSHP->sHooks.FFlush( psSHP->fpSHP ); + psSHP->sHooks.FFlush( psSHP->fpSHX ); +} + +/************************************************************************/ +/* SHPOpen() */ +/************************************************************************/ + +SHPHandle SHPAPI_CALL +SHPOpen( const char * pszLayer, const char * pszAccess ) + +{ + SAHooks sHooks; + + SASetupDefaultHooks( &sHooks ); + + return SHPOpenLL( pszLayer, pszAccess, &sHooks ); +} + +/************************************************************************/ +/* SHPOpen() */ +/* */ +/* Open the .shp and .shx files based on the basename of the */ +/* files or either file name. */ +/************************************************************************/ + +SHPHandle SHPAPI_CALL +SHPOpenLL( const char * pszLayer, const char * pszAccess, SAHooks *psHooks ) + +{ + char *pszFullname, *pszBasename; + SHPHandle psSHP; + + uchar *pabyBuf; + int i; + double dValue; + int bLazySHXLoading = FALSE; + size_t nFullnameLen; + +/* -------------------------------------------------------------------- */ +/* Ensure the access string is one of the legal ones. We */ +/* ensure the result string indicates binary to avoid common */ +/* problems on Windows. */ +/* -------------------------------------------------------------------- */ + if( strcmp(pszAccess,"rb+") == 0 || strcmp(pszAccess,"r+b") == 0 + || strcmp(pszAccess,"r+") == 0 ) + pszAccess = "r+b"; + else + { + bLazySHXLoading = strchr(pszAccess, 'l') != NULL; + pszAccess = "rb"; + } + +/* -------------------------------------------------------------------- */ +/* Establish the byte order on this machine. */ +/* -------------------------------------------------------------------- */ +#if !defined(bBigEndian) + i = 1; + if( *((uchar *) &i) == 1 ) + bBigEndian = FALSE; + else + bBigEndian = TRUE; +#endif + +/* -------------------------------------------------------------------- */ +/* Initialize the info structure. */ +/* -------------------------------------------------------------------- */ + psSHP = (SHPHandle) calloc(sizeof(SHPInfo),1); + + psSHP->bUpdated = FALSE; + memcpy( &(psSHP->sHooks), psHooks, sizeof(SAHooks) ); + +/* -------------------------------------------------------------------- */ +/* Compute the base (layer) name. If there is any extension */ +/* on the passed in filename we will strip it off. */ +/* -------------------------------------------------------------------- */ + pszBasename = (char *) malloc(strlen(pszLayer)+5); + strcpy( pszBasename, pszLayer ); + for( i = (int)strlen(pszBasename)-1; + i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' + && pszBasename[i] != '\\'; + i-- ) {} + + if( pszBasename[i] == '.' ) + pszBasename[i] = '\0'; + +/* -------------------------------------------------------------------- */ +/* Open the .shp and .shx files. Note that files pulled from */ +/* a PC to Unix with upper case filenames won't work! */ +/* -------------------------------------------------------------------- */ + nFullnameLen = strlen(pszBasename) + 5; + pszFullname = (char *) malloc(nFullnameLen); + snprintf( pszFullname, nFullnameLen, "%s.shp", pszBasename ) ; + psSHP->fpSHP = psSHP->sHooks.FOpen(pszFullname, pszAccess ); + if( psSHP->fpSHP == NULL ) + { + snprintf( pszFullname, nFullnameLen, "%s.SHP", pszBasename ); + psSHP->fpSHP = psSHP->sHooks.FOpen(pszFullname, pszAccess ); + } + + if( psSHP->fpSHP == NULL ) + { + size_t nMessageLen = strlen(pszBasename)*2+256; + char *pszMessage = (char *) malloc(nMessageLen); + snprintf( pszMessage, nMessageLen, "Unable to open %s.shp or %s.SHP.", + pszBasename, pszBasename ); + psHooks->Error( pszMessage ); + free( pszMessage ); + + free( psSHP ); + free( pszBasename ); + free( pszFullname ); + + return NULL; + } + + snprintf( pszFullname, nFullnameLen, "%s.shx", pszBasename ); + psSHP->fpSHX = psSHP->sHooks.FOpen(pszFullname, pszAccess ); + if( psSHP->fpSHX == NULL ) + { + snprintf( pszFullname, nFullnameLen, "%s.SHX", pszBasename ); + psSHP->fpSHX = psSHP->sHooks.FOpen(pszFullname, pszAccess ); + } + + if( psSHP->fpSHX == NULL ) + { + size_t nMessageLen = strlen(pszBasename)*2+256; + char *pszMessage = (char *) malloc(nMessageLen); + snprintf( pszMessage, nMessageLen, "Unable to open %s.shx or %s.SHX." + "Try --config SHAPE_RESTORE_SHX true to restore or create it", + pszBasename, pszBasename ); + psHooks->Error( pszMessage ); + free( pszMessage ); + + psSHP->sHooks.FClose( psSHP->fpSHP ); + free( psSHP ); + free( pszBasename ); + free( pszFullname ); + return( NULL ); + } + + free( pszFullname ); + free( pszBasename ); + +/* -------------------------------------------------------------------- */ +/* Read the file size from the SHP file. */ +/* -------------------------------------------------------------------- */ + pabyBuf = (uchar *) malloc(100); + psSHP->sHooks.FRead( pabyBuf, 100, 1, psSHP->fpSHP ); + + psSHP->nFileSize = ((unsigned int)pabyBuf[24]<<24)|(pabyBuf[25]<<16)| + (pabyBuf[26]<<8)|pabyBuf[27]; + if( psSHP->nFileSize < UINT_MAX / 2 ) + psSHP->nFileSize *= 2; + else + psSHP->nFileSize = (UINT_MAX / 2) * 2; + +/* -------------------------------------------------------------------- */ +/* Read SHX file Header info */ +/* -------------------------------------------------------------------- */ + if( psSHP->sHooks.FRead( pabyBuf, 100, 1, psSHP->fpSHX ) != 1 + || pabyBuf[0] != 0 + || pabyBuf[1] != 0 + || pabyBuf[2] != 0x27 + || (pabyBuf[3] != 0x0a && pabyBuf[3] != 0x0d) ) + { + psSHP->sHooks.Error( ".shx file is unreadable, or corrupt." ); + psSHP->sHooks.FClose( psSHP->fpSHP ); + psSHP->sHooks.FClose( psSHP->fpSHX ); + free( pabyBuf ); + free( psSHP ); + + return( NULL ); + } + + psSHP->nRecords = pabyBuf[27]|(pabyBuf[26]<<8)|(pabyBuf[25]<<16)| + ((pabyBuf[24] & 0x7F)<<24); + psSHP->nRecords = (psSHP->nRecords - 50) / 4; + + psSHP->nShapeType = pabyBuf[32]; + + if( psSHP->nRecords < 0 || psSHP->nRecords > 256000000 ) + { + char szErrorMsg[200]; + + snprintf( szErrorMsg, sizeof(szErrorMsg), + "Record count in .shp header is %d, which seems\n" + "unreasonable. Assuming header is corrupt.", + psSHP->nRecords ); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); + psSHP->sHooks.FClose( psSHP->fpSHP ); + psSHP->sHooks.FClose( psSHP->fpSHX ); + free( psSHP ); + free(pabyBuf); + + return( NULL ); + } + + /* If a lot of records are advertized, check that the file is big enough */ + /* to hold them */ + if( psSHP->nRecords >= 1024 * 1024 ) + { + SAOffset nFileSize; + psSHP->sHooks.FSeek( psSHP->fpSHX, 0, 2 ); + nFileSize = psSHP->sHooks.FTell( psSHP->fpSHX ); + if( nFileSize > 100 && + nFileSize/2 < (SAOffset)(psSHP->nRecords * 4 + 50) ) + { + psSHP->nRecords = (int)((nFileSize - 100) / 8); + } + psSHP->sHooks.FSeek( psSHP->fpSHX, 100, 0 ); + } + +/* -------------------------------------------------------------------- */ +/* Read the bounds. */ +/* -------------------------------------------------------------------- */ + if( bBigEndian ) SwapWord( 8, pabyBuf+36 ); + memcpy( &dValue, pabyBuf+36, 8 ); + psSHP->adBoundsMin[0] = dValue; + + if( bBigEndian ) SwapWord( 8, pabyBuf+44 ); + memcpy( &dValue, pabyBuf+44, 8 ); + psSHP->adBoundsMin[1] = dValue; + + if( bBigEndian ) SwapWord( 8, pabyBuf+52 ); + memcpy( &dValue, pabyBuf+52, 8 ); + psSHP->adBoundsMax[0] = dValue; + + if( bBigEndian ) SwapWord( 8, pabyBuf+60 ); + memcpy( &dValue, pabyBuf+60, 8 ); + psSHP->adBoundsMax[1] = dValue; + + if( bBigEndian ) SwapWord( 8, pabyBuf+68 ); /* z */ + memcpy( &dValue, pabyBuf+68, 8 ); + psSHP->adBoundsMin[2] = dValue; + + if( bBigEndian ) SwapWord( 8, pabyBuf+76 ); + memcpy( &dValue, pabyBuf+76, 8 ); + psSHP->adBoundsMax[2] = dValue; + + if( bBigEndian ) SwapWord( 8, pabyBuf+84 ); /* z */ + memcpy( &dValue, pabyBuf+84, 8 ); + psSHP->adBoundsMin[3] = dValue; + + if( bBigEndian ) SwapWord( 8, pabyBuf+92 ); + memcpy( &dValue, pabyBuf+92, 8 ); + psSHP->adBoundsMax[3] = dValue; + + free( pabyBuf ); + +/* -------------------------------------------------------------------- */ +/* Read the .shx file to get the offsets to each record in */ +/* the .shp file. */ +/* -------------------------------------------------------------------- */ + psSHP->nMaxRecords = psSHP->nRecords; + + psSHP->panRecOffset = (unsigned int *) + malloc(sizeof(unsigned int) * MAX(1,psSHP->nMaxRecords) ); + psSHP->panRecSize = (unsigned int *) + malloc(sizeof(unsigned int) * MAX(1,psSHP->nMaxRecords) ); + if( bLazySHXLoading ) + pabyBuf = NULL; + else + pabyBuf = (uchar *) malloc(8 * MAX(1,psSHP->nRecords) ); + + if (psSHP->panRecOffset == NULL || + psSHP->panRecSize == NULL || + (!bLazySHXLoading && pabyBuf == NULL)) + { + char szErrorMsg[200]; + + snprintf( szErrorMsg, sizeof(szErrorMsg), + "Not enough memory to allocate requested memory (nRecords=%d).\n" + "Probably broken SHP file", + psSHP->nRecords ); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); + psSHP->sHooks.FClose( psSHP->fpSHP ); + psSHP->sHooks.FClose( psSHP->fpSHX ); + if (psSHP->panRecOffset) free( psSHP->panRecOffset ); + if (psSHP->panRecSize) free( psSHP->panRecSize ); + if (pabyBuf) free( pabyBuf ); + free( psSHP ); + return( NULL ); + } + + if( bLazySHXLoading ) + { + memset(psSHP->panRecOffset, 0, sizeof(unsigned int) * MAX(1,psSHP->nMaxRecords) ); + memset(psSHP->panRecSize, 0, sizeof(unsigned int) * MAX(1,psSHP->nMaxRecords) ); + return( psSHP ); + } + + if( (int) psSHP->sHooks.FRead( pabyBuf, 8, psSHP->nRecords, psSHP->fpSHX ) + != psSHP->nRecords ) + { + char szErrorMsg[200]; + + snprintf( szErrorMsg, sizeof(szErrorMsg), + "Failed to read all values for %d records in .shx file: %s.", + psSHP->nRecords, strerror(errno) ); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); + + /* SHX is short or unreadable for some reason. */ + psSHP->sHooks.FClose( psSHP->fpSHP ); + psSHP->sHooks.FClose( psSHP->fpSHX ); + free( psSHP->panRecOffset ); + free( psSHP->panRecSize ); + free( pabyBuf ); + free( psSHP ); + + return( NULL ); + } + + /* In read-only mode, we can close the SHX now */ + if (strcmp(pszAccess, "rb") == 0) + { + psSHP->sHooks.FClose( psSHP->fpSHX ); + psSHP->fpSHX = NULL; + } + + for( i = 0; i < psSHP->nRecords; i++ ) + { + unsigned int nOffset, nLength; + + memcpy( &nOffset, pabyBuf + i * 8, 4 ); + if( !bBigEndian ) SwapWord( 4, &nOffset ); + + memcpy( &nLength, pabyBuf + i * 8 + 4, 4 ); + if( !bBigEndian ) SwapWord( 4, &nLength ); + + if( nOffset > (unsigned int)INT_MAX ) + { + char str[128]; + snprintf( str, sizeof(str), + "Invalid offset for entity %d", i); + str[sizeof(str)-1] = '\0'; + + psSHP->sHooks.Error( str ); + SHPClose(psSHP); + free( pabyBuf ); + return NULL; + } + if( nLength > (unsigned int)(INT_MAX / 2 - 4) ) + { + char str[128]; + snprintf( str, sizeof(str), + "Invalid length for entity %d", i); + str[sizeof(str)-1] = '\0'; + + psSHP->sHooks.Error( str ); + SHPClose(psSHP); + free( pabyBuf ); + return NULL; + } + psSHP->panRecOffset[i] = nOffset*2; + psSHP->panRecSize[i] = nLength*2; + } + free( pabyBuf ); + + return( psSHP ); +} + +/************************************************************************/ +/* SHPOpenLLEx() */ +/* */ +/* Open the .shp and .shx files based on the basename of the */ +/* files or either file name. It generally invokes SHPRestoreSHX() */ +/* in case when bRestoreSHX equals true. */ +/************************************************************************/ + +SHPHandle SHPAPI_CALL +SHPOpenLLEx( const char * pszLayer, const char * pszAccess, SAHooks *psHooks, + int bRestoreSHX ) + +{ + if ( !bRestoreSHX ) return SHPOpenLL ( pszLayer, pszAccess, psHooks ); + else + { + if ( SHPRestoreSHX ( pszLayer, pszAccess, psHooks ) ) + { + return SHPOpenLL ( pszLayer, pszAccess, psHooks ); + } + } + + return( NULL ); +} + +/************************************************************************/ +/* SHPRestoreSHX() */ +/* */ +/* Restore .SHX file using associated .SHP file. */ +/* */ +/************************************************************************/ + +int SHPAPI_CALL +SHPRestoreSHX ( const char * pszLayer, const char * pszAccess, SAHooks *psHooks ) + +{ + char *pszFullname, *pszBasename; + SAFile fpSHP, fpSHX; + + + uchar *pabyBuf; + int i; + size_t nFullnameLen; + unsigned int nSHPFilesize; + + size_t nMessageLen; + char *pszMessage; + + unsigned int nCurrentRecordOffset = 0; + unsigned int nCurrentSHPOffset = 100; + size_t nRealSHXContentSize = 100; + + const char pszSHXAccess[] = "w+b"; + char *pabySHXHeader; + char abyReadedRecord[8]; + unsigned int niRecord = 0; + unsigned int nRecordLength = 0; + unsigned int nRecordOffset = 50; + +/* -------------------------------------------------------------------- */ +/* Ensure the access string is one of the legal ones. We */ +/* ensure the result string indicates binary to avoid common */ +/* problems on Windows. */ +/* -------------------------------------------------------------------- */ + if( strcmp(pszAccess,"rb+") == 0 || strcmp(pszAccess,"r+b") == 0 + || strcmp(pszAccess,"r+") == 0 ) + pszAccess = "r+b"; + else + { + pszAccess = "rb"; + } + +/* -------------------------------------------------------------------- */ +/* Establish the byte order on this machine. */ +/* -------------------------------------------------------------------- */ +#if !defined(bBigEndian) + i = 1; + if( *((uchar *) &i) == 1 ) + bBigEndian = FALSE; + else + bBigEndian = TRUE; +#endif + +/* -------------------------------------------------------------------- */ +/* Compute the base (layer) name. If there is any extension */ +/* on the passed in filename we will strip it off. */ +/* -------------------------------------------------------------------- */ + pszBasename = (char *) malloc(strlen(pszLayer)+5); + strcpy( pszBasename, pszLayer ); + for( i = (int)strlen(pszBasename)-1; + i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' + && pszBasename[i] != '\\'; + i-- ) {} + + if( pszBasename[i] == '.' ) + pszBasename[i] = '\0'; + +/* -------------------------------------------------------------------- */ +/* Open the .shp file. Note that files pulled from */ +/* a PC to Unix with upper case filenames won't work! */ +/* -------------------------------------------------------------------- */ + nFullnameLen = strlen(pszBasename) + 5; + pszFullname = (char *) malloc(nFullnameLen); + snprintf( pszFullname, nFullnameLen, "%s.shp", pszBasename ) ; + fpSHP = psHooks->FOpen(pszFullname, pszAccess ); + if( fpSHP == NULL ) + { + snprintf( pszFullname, nFullnameLen, "%s.SHP", pszBasename ); + fpSHP = psHooks->FOpen(pszFullname, pszAccess ); + } + + if( fpSHP == NULL ) + { + nMessageLen = strlen(pszBasename)*2+256; + pszMessage = (char *) malloc(nMessageLen); + snprintf( pszMessage, nMessageLen, "Unable to open %s.shp or %s.SHP.", + pszBasename, pszBasename ); + psHooks->Error( pszMessage ); + free( pszMessage ); + + free( pszBasename ); + free( pszFullname ); + + return( 0 ); + } + +/* -------------------------------------------------------------------- */ +/* Read the file size from the SHP file. */ +/* -------------------------------------------------------------------- */ + pabyBuf = (uchar *) malloc(100); + psHooks->FRead( pabyBuf, 100, 1, fpSHP ); + + nSHPFilesize = ((unsigned int)pabyBuf[24]<<24)|(pabyBuf[25]<<16)| + (pabyBuf[26]<<8)|pabyBuf[27]; + if( nSHPFilesize < UINT_MAX / 2 ) + nSHPFilesize *= 2; + else + nSHPFilesize = (UINT_MAX / 2) * 2; + + snprintf( pszFullname, nFullnameLen, "%s.shx", pszBasename ); + fpSHX = psHooks->FOpen( pszFullname, pszSHXAccess ); + + if( fpSHX == NULL ) + { + nMessageLen = strlen( pszBasename ) * 2 + 256; + pszMessage = (char *) malloc( nMessageLen ); + snprintf( pszMessage, nMessageLen, "Error opening file %s.shx for writing", + pszBasename ); + psHooks->Error( pszMessage ); + free( pszMessage ); + + psHooks->FClose( fpSHX ); + + free( pabyBuf ); + free( pszBasename ); + free( pszFullname ); + + return( 0 ); + } + +/* -------------------------------------------------------------------- */ +/* Open SHX and create it using SHP file content. */ +/* -------------------------------------------------------------------- */ + psHooks->FSeek( fpSHP, 100, 0 ); + pabySHXHeader = (char *) malloc ( 100 ); + memcpy( pabySHXHeader, pabyBuf, 100 ); + psHooks->FWrite( pabySHXHeader, 100, 1, fpSHX ); + + while( nCurrentSHPOffset < nSHPFilesize ) + { + if( psHooks->FRead( &niRecord, 4, 1, fpSHP ) == 1 && + psHooks->FRead( &nRecordLength, 4, 1, fpSHP ) == 1) + { + if( !bBigEndian ) SwapWord( 4, &nRecordOffset ); + memcpy( abyReadedRecord, &nRecordOffset, 4 ); + memcpy( abyReadedRecord + 4, &nRecordLength, 4 ); + + psHooks->FWrite( abyReadedRecord, 8, 1, fpSHX ); + + if ( !bBigEndian ) SwapWord( 4, &nRecordOffset ); + if ( !bBigEndian ) SwapWord( 4, &nRecordLength ); + nRecordOffset += nRecordLength + 4; + nCurrentRecordOffset += 8; + nCurrentSHPOffset += 8 + nRecordLength * 2; + + psHooks->FSeek( fpSHP, nCurrentSHPOffset, 0 ); + nRealSHXContentSize += 8; + } + else + { + psHooks->Error( "Error parsing .shp to restore .shx" ); + + psHooks->FClose( fpSHX ); + psHooks->FClose( fpSHP ); + + free( pabySHXHeader ); + free( pszBasename ); + free( pszFullname ); + + return( 0 ); + } + } + + nRealSHXContentSize /= 2; // Bytes counted -> WORDs + if( !bBigEndian ) SwapWord( 4, &nRealSHXContentSize ); + psHooks->FSeek( fpSHX, 24, 0 ); + psHooks->FWrite( &nRealSHXContentSize, 4, 1, fpSHX ); + + psHooks->FClose( fpSHP ); + psHooks->FClose( fpSHX ); + + free ( pabyBuf ); + free ( pszFullname ); + free ( pszBasename ); + free ( pabySHXHeader ); + + return( 1 ); +} + +/************************************************************************/ +/* SHPClose() */ +/* */ +/* Close the .shp and .shx files. */ +/************************************************************************/ + +void SHPAPI_CALL +SHPClose(SHPHandle psSHP ) + +{ + if( psSHP == NULL ) + return; + +/* -------------------------------------------------------------------- */ +/* Update the header if we have modified anything. */ +/* -------------------------------------------------------------------- */ + if( psSHP->bUpdated ) + SHPWriteHeader( psSHP ); + +/* -------------------------------------------------------------------- */ +/* Free all resources, and close files. */ +/* -------------------------------------------------------------------- */ + free( psSHP->panRecOffset ); + free( psSHP->panRecSize ); + + if ( psSHP->fpSHX != NULL) + psSHP->sHooks.FClose( psSHP->fpSHX ); + psSHP->sHooks.FClose( psSHP->fpSHP ); + + if( psSHP->pabyRec != NULL ) + { + free( psSHP->pabyRec ); + } + + if( psSHP->pabyObjectBuf != NULL ) + { + free( psSHP->pabyObjectBuf ); + } + if( psSHP->psCachedObject != NULL ) + { + free( psSHP->psCachedObject ); + } + + free( psSHP ); +} + +/************************************************************************/ +/* SHPSetFastModeReadObject() */ +/************************************************************************/ + +/* If setting bFastMode = TRUE, the content of SHPReadObject() is owned by the SHPHandle. */ +/* So you cannot have 2 valid instances of SHPReadObject() simultaneously. */ +/* The SHPObject padfZ and padfM members may be NULL depending on the geometry */ +/* type. It is illegal to free at hand any of the pointer members of the SHPObject structure */ +void SHPAPI_CALL SHPSetFastModeReadObject( SHPHandle hSHP, int bFastMode ) +{ + if( bFastMode ) + { + if( hSHP->psCachedObject == NULL ) + { + hSHP->psCachedObject = (SHPObject*) calloc(1, sizeof(SHPObject)); + assert( hSHP->psCachedObject != NULL ); + } + } + + hSHP->bFastModeReadObject = bFastMode; +} + +/************************************************************************/ +/* SHPGetInfo() */ +/* */ +/* Fetch general information about the shape file. */ +/************************************************************************/ + +void SHPAPI_CALL +SHPGetInfo(SHPHandle psSHP, int * pnEntities, int * pnShapeType, + double * padfMinBound, double * padfMaxBound ) + +{ + int i; + + if( psSHP == NULL ) + return; + + if( pnEntities != NULL ) + *pnEntities = psSHP->nRecords; + + if( pnShapeType != NULL ) + *pnShapeType = psSHP->nShapeType; + + for( i = 0; i < 4; i++ ) + { + if( padfMinBound != NULL ) + padfMinBound[i] = psSHP->adBoundsMin[i]; + if( padfMaxBound != NULL ) + padfMaxBound[i] = psSHP->adBoundsMax[i]; + } +} + +/************************************************************************/ +/* SHPCreate() */ +/* */ +/* Create a new shape file and return a handle to the open */ +/* shape file with read/write access. */ +/************************************************************************/ + +SHPHandle SHPAPI_CALL +SHPCreate( const char * pszLayer, int nShapeType ) + +{ + SAHooks sHooks; + + SASetupDefaultHooks( &sHooks ); + + return SHPCreateLL( pszLayer, nShapeType, &sHooks ); +} + +/************************************************************************/ +/* SHPCreate() */ +/* */ +/* Create a new shape file and return a handle to the open */ +/* shape file with read/write access. */ +/************************************************************************/ + +SHPHandle SHPAPI_CALL +SHPCreateLL( const char * pszLayer, int nShapeType, SAHooks *psHooks ) + +{ + char *pszBasename = NULL, *pszFullname = NULL; + int i; + SAFile fpSHP = NULL, fpSHX = NULL; + uchar abyHeader[100]; + int32 i32; + double dValue; + size_t nFullnameLen; + +/* -------------------------------------------------------------------- */ +/* Establish the byte order on this system. */ +/* -------------------------------------------------------------------- */ +#if !defined(bBigEndian) + i = 1; + if( *((uchar *) &i) == 1 ) + bBigEndian = FALSE; + else + bBigEndian = TRUE; +#endif + +/* -------------------------------------------------------------------- */ +/* Compute the base (layer) name. If there is any extension */ +/* on the passed in filename we will strip it off. */ +/* -------------------------------------------------------------------- */ + pszBasename = (char *) malloc(strlen(pszLayer)+5); + strcpy( pszBasename, pszLayer ); + for( i = (int)strlen(pszBasename)-1; + i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' + && pszBasename[i] != '\\'; + i-- ) {} + + if( pszBasename[i] == '.' ) + pszBasename[i] = '\0'; + +/* -------------------------------------------------------------------- */ +/* Open the two files so we can write their headers. */ +/* -------------------------------------------------------------------- */ + nFullnameLen = strlen(pszBasename) + 5; + pszFullname = (char *) malloc(nFullnameLen); + snprintf( pszFullname, nFullnameLen, "%s.shp", pszBasename ); + fpSHP = psHooks->FOpen(pszFullname, "wb" ); + if( fpSHP == NULL ) + { + char szErrorMsg[200]; + snprintf( szErrorMsg, sizeof(szErrorMsg), + "Failed to create file %s: %s", + pszFullname, strerror(errno) ); + psHooks->Error( szErrorMsg ); + + goto error; + } + + snprintf( pszFullname, nFullnameLen, "%s.shx", pszBasename ); + fpSHX = psHooks->FOpen(pszFullname, "wb" ); + if( fpSHX == NULL ) + { + char szErrorMsg[200]; + snprintf( szErrorMsg, sizeof(szErrorMsg), + "Failed to create file %s: %s", + pszFullname, strerror(errno) ); + psHooks->Error( szErrorMsg ); + goto error; + } + + free( pszFullname ); pszFullname = NULL; + free( pszBasename ); pszBasename = NULL; + +/* -------------------------------------------------------------------- */ +/* Prepare header block for .shp file. */ +/* -------------------------------------------------------------------- */ + memset( abyHeader, 0, sizeof(abyHeader) ); + + abyHeader[2] = 0x27; /* magic cookie */ + abyHeader[3] = 0x0a; + + i32 = 50; /* file size */ + ByteCopy( &i32, abyHeader+24, 4 ); + if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); + + i32 = 1000; /* version */ + ByteCopy( &i32, abyHeader+28, 4 ); + if( bBigEndian ) SwapWord( 4, abyHeader+28 ); + + i32 = nShapeType; /* shape type */ + ByteCopy( &i32, abyHeader+32, 4 ); + if( bBigEndian ) SwapWord( 4, abyHeader+32 ); + + dValue = 0.0; /* set bounds */ + ByteCopy( &dValue, abyHeader+36, 8 ); + ByteCopy( &dValue, abyHeader+44, 8 ); + ByteCopy( &dValue, abyHeader+52, 8 ); + ByteCopy( &dValue, abyHeader+60, 8 ); + +/* -------------------------------------------------------------------- */ +/* Write .shp file header. */ +/* -------------------------------------------------------------------- */ + if( psHooks->FWrite( abyHeader, 100, 1, fpSHP ) != 1 ) + { + char szErrorMsg[200]; + + snprintf( szErrorMsg, sizeof(szErrorMsg), + "Failed to write .shp header: %s", strerror(errno) ); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psHooks->Error( szErrorMsg ); + + goto error; + } + +/* -------------------------------------------------------------------- */ +/* Prepare, and write .shx file header. */ +/* -------------------------------------------------------------------- */ + i32 = 50; /* file size */ + ByteCopy( &i32, abyHeader+24, 4 ); + if( !bBigEndian ) SwapWord( 4, abyHeader+24 ); + + if( psHooks->FWrite( abyHeader, 100, 1, fpSHX ) != 1 ) + { + char szErrorMsg[200]; + + snprintf( szErrorMsg, sizeof(szErrorMsg), + "Failure writing .shx header: %s", strerror(errno) ); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psHooks->Error( szErrorMsg ); + + goto error; + } + +/* -------------------------------------------------------------------- */ +/* Close the files, and then open them as regular existing files. */ +/* -------------------------------------------------------------------- */ + psHooks->FClose( fpSHP ); + psHooks->FClose( fpSHX ); + + return( SHPOpenLL( pszLayer, "r+b", psHooks ) ); + +error: + if (pszFullname) free(pszFullname); + if (pszBasename) free(pszBasename); + if (fpSHP) psHooks->FClose( fpSHP ); + if (fpSHX) psHooks->FClose( fpSHX ); + return NULL; +} + +/************************************************************************/ +/* _SHPSetBounds() */ +/* */ +/* Compute a bounds rectangle for a shape, and set it into the */ +/* indicated location in the record. */ +/************************************************************************/ + +static void _SHPSetBounds( uchar * pabyRec, SHPObject * psShape ) + +{ + ByteCopy( &(psShape->dfXMin), pabyRec + 0, 8 ); + ByteCopy( &(psShape->dfYMin), pabyRec + 8, 8 ); + ByteCopy( &(psShape->dfXMax), pabyRec + 16, 8 ); + ByteCopy( &(psShape->dfYMax), pabyRec + 24, 8 ); + + if( bBigEndian ) + { + SwapWord( 8, pabyRec + 0 ); + SwapWord( 8, pabyRec + 8 ); + SwapWord( 8, pabyRec + 16 ); + SwapWord( 8, pabyRec + 24 ); + } +} + +/************************************************************************/ +/* SHPComputeExtents() */ +/* */ +/* Recompute the extents of a shape. Automatically done by */ +/* SHPCreateObject(). */ +/************************************************************************/ + +void SHPAPI_CALL +SHPComputeExtents( SHPObject * psObject ) + +{ + int i; + +/* -------------------------------------------------------------------- */ +/* Build extents for this object. */ +/* -------------------------------------------------------------------- */ + if( psObject->nVertices > 0 ) + { + psObject->dfXMin = psObject->dfXMax = psObject->padfX[0]; + psObject->dfYMin = psObject->dfYMax = psObject->padfY[0]; + psObject->dfZMin = psObject->dfZMax = psObject->padfZ[0]; + psObject->dfMMin = psObject->dfMMax = psObject->padfM[0]; + } + + for( i = 0; i < psObject->nVertices; i++ ) + { + psObject->dfXMin = MIN(psObject->dfXMin, psObject->padfX[i]); + psObject->dfYMin = MIN(psObject->dfYMin, psObject->padfY[i]); + psObject->dfZMin = MIN(psObject->dfZMin, psObject->padfZ[i]); + psObject->dfMMin = MIN(psObject->dfMMin, psObject->padfM[i]); + + psObject->dfXMax = MAX(psObject->dfXMax, psObject->padfX[i]); + psObject->dfYMax = MAX(psObject->dfYMax, psObject->padfY[i]); + psObject->dfZMax = MAX(psObject->dfZMax, psObject->padfZ[i]); + psObject->dfMMax = MAX(psObject->dfMMax, psObject->padfM[i]); + } +} + +/************************************************************************/ +/* SHPCreateObject() */ +/* */ +/* Create a shape object. It should be freed with */ +/* SHPDestroyObject(). */ +/************************************************************************/ + +SHPObject SHPAPI_CALL1(*) +SHPCreateObject( int nSHPType, int nShapeId, int nParts, + const int * panPartStart, const int * panPartType, + int nVertices, const double *padfX, const double *padfY, + const double * padfZ, const double * padfM ) + +{ + SHPObject *psObject; + int i, bHasM, bHasZ; + + psObject = (SHPObject *) calloc(1,sizeof(SHPObject)); + psObject->nSHPType = nSHPType; + psObject->nShapeId = nShapeId; + psObject->bMeasureIsUsed = FALSE; + +/* -------------------------------------------------------------------- */ +/* Establish whether this shape type has M, and Z values. */ +/* -------------------------------------------------------------------- */ + if( nSHPType == SHPT_ARCM + || nSHPType == SHPT_POINTM + || nSHPType == SHPT_POLYGONM + || nSHPType == SHPT_MULTIPOINTM ) + { + bHasM = TRUE; + bHasZ = FALSE; + } + else if( nSHPType == SHPT_ARCZ + || nSHPType == SHPT_POINTZ + || nSHPType == SHPT_POLYGONZ + || nSHPType == SHPT_MULTIPOINTZ + || nSHPType == SHPT_MULTIPATCH ) + { + bHasM = TRUE; + bHasZ = TRUE; + } + else + { + bHasM = FALSE; + bHasZ = FALSE; + } + +/* -------------------------------------------------------------------- */ +/* Capture parts. Note that part type is optional, and */ +/* defaults to ring. */ +/* -------------------------------------------------------------------- */ + if( nSHPType == SHPT_ARC || nSHPType == SHPT_POLYGON + || nSHPType == SHPT_ARCM || nSHPType == SHPT_POLYGONM + || nSHPType == SHPT_ARCZ || nSHPType == SHPT_POLYGONZ + || nSHPType == SHPT_MULTIPATCH ) + { + psObject->nParts = MAX(1,nParts); + + psObject->panPartStart = (int *) + calloc(sizeof(int), psObject->nParts); + psObject->panPartType = (int *) + malloc(sizeof(int) * psObject->nParts); + + psObject->panPartStart[0] = 0; + psObject->panPartType[0] = SHPP_RING; + + for( i = 0; i < nParts; i++ ) + { + if( panPartStart != NULL ) + psObject->panPartStart[i] = panPartStart[i]; + + if( panPartType != NULL ) + psObject->panPartType[i] = panPartType[i]; + else + psObject->panPartType[i] = SHPP_RING; + } + + if( psObject->panPartStart[0] != 0 ) + psObject->panPartStart[0] = 0; + } + +/* -------------------------------------------------------------------- */ +/* Capture vertices. Note that X, Y, Z and M are optional. */ +/* -------------------------------------------------------------------- */ + if( nVertices > 0 ) + { + size_t nSize = sizeof(double) * nVertices; + psObject->padfX = (double *) padfX ? malloc(nSize) : + calloc(sizeof(double),nVertices); + psObject->padfY = (double *) padfY ? malloc(nSize) : + calloc(sizeof(double),nVertices); + psObject->padfZ = (double *) padfZ && bHasZ ? malloc(nSize) : + calloc(sizeof(double),nVertices); + psObject->padfM = (double *) padfM && bHasM ? malloc(nSize) : + calloc(sizeof(double),nVertices); + if( padfX != NULL ) + memcpy(psObject->padfX, padfX, nSize); + if( padfY != NULL ) + memcpy(psObject->padfY, padfY, nSize); + if( padfZ != NULL && bHasZ ) + memcpy(psObject->padfZ, padfZ, nSize); + if( padfM != NULL && bHasM ) + { + memcpy(psObject->padfM, padfM, nSize); + psObject->bMeasureIsUsed = TRUE; + } + } + +/* -------------------------------------------------------------------- */ +/* Compute the extents. */ +/* -------------------------------------------------------------------- */ + psObject->nVertices = nVertices; + SHPComputeExtents( psObject ); + + return( psObject ); +} + +/************************************************************************/ +/* SHPCreateSimpleObject() */ +/* */ +/* Create a simple (common) shape object. Destroy with */ +/* SHPDestroyObject(). */ +/************************************************************************/ + +SHPObject SHPAPI_CALL1(*) +SHPCreateSimpleObject( int nSHPType, int nVertices, + const double * padfX, const double * padfY, + const double * padfZ ) + +{ + return( SHPCreateObject( nSHPType, -1, 0, NULL, NULL, + nVertices, padfX, padfY, padfZ, NULL ) ); +} + +/************************************************************************/ +/* SHPWriteObject() */ +/* */ +/* Write out the vertices of a new structure. Note that it is */ +/* only possible to write vertices at the end of the file. */ +/************************************************************************/ + +int SHPAPI_CALL +SHPWriteObject(SHPHandle psSHP, int nShapeId, SHPObject * psObject ) + +{ + unsigned int nRecordOffset, nRecordSize=0; + int i; + uchar *pabyRec; + int32 i32; + int bAppendToLastRecord = FALSE; + int bAppendToFile = FALSE; + + psSHP->bUpdated = TRUE; + +/* -------------------------------------------------------------------- */ +/* Ensure that shape object matches the type of the file it is */ +/* being written to. */ +/* -------------------------------------------------------------------- */ + assert( psObject->nSHPType == psSHP->nShapeType + || psObject->nSHPType == SHPT_NULL ); + +/* -------------------------------------------------------------------- */ +/* Ensure that -1 is used for appends. Either blow an */ +/* assertion, or if they are disabled, set the shapeid to -1 */ +/* for appends. */ +/* -------------------------------------------------------------------- */ + assert( nShapeId == -1 + || (nShapeId >= 0 && nShapeId < psSHP->nRecords) ); + + if( nShapeId != -1 && nShapeId >= psSHP->nRecords ) + nShapeId = -1; + +/* -------------------------------------------------------------------- */ +/* Add the new entity to the in memory index. */ +/* -------------------------------------------------------------------- */ + if( nShapeId == -1 && psSHP->nRecords+1 > psSHP->nMaxRecords ) + { + int nNewMaxRecords = psSHP->nMaxRecords + psSHP->nMaxRecords / 3 + 100; + unsigned int* panRecOffsetNew; + unsigned int* panRecSizeNew; + + panRecOffsetNew = (unsigned int *) + SfRealloc(psSHP->panRecOffset,sizeof(unsigned int) * nNewMaxRecords ); + if( panRecOffsetNew == NULL ) + return -1; + psSHP->panRecOffset = panRecOffsetNew; + + panRecSizeNew = (unsigned int *) + SfRealloc(psSHP->panRecSize,sizeof(unsigned int) * nNewMaxRecords ); + if( panRecSizeNew == NULL ) + return -1; + psSHP->panRecSize = panRecSizeNew; + + psSHP->nMaxRecords = nNewMaxRecords; + } + +/* -------------------------------------------------------------------- */ +/* Initialize record. */ +/* -------------------------------------------------------------------- */ + pabyRec = (uchar *) malloc(psObject->nVertices * 4 * sizeof(double) + + psObject->nParts * 8 + 128); + if( pabyRec == NULL ) + return -1; + +/* -------------------------------------------------------------------- */ +/* Extract vertices for a Polygon or Arc. */ +/* -------------------------------------------------------------------- */ + if( psObject->nSHPType == SHPT_POLYGON + || psObject->nSHPType == SHPT_POLYGONZ + || psObject->nSHPType == SHPT_POLYGONM + || psObject->nSHPType == SHPT_ARC + || psObject->nSHPType == SHPT_ARCZ + || psObject->nSHPType == SHPT_ARCM + || psObject->nSHPType == SHPT_MULTIPATCH ) + { + int32 nPoints, nParts; + + nPoints = psObject->nVertices; + nParts = psObject->nParts; + + _SHPSetBounds( pabyRec + 12, psObject ); + + if( bBigEndian ) SwapWord( 4, &nPoints ); + if( bBigEndian ) SwapWord( 4, &nParts ); + + ByteCopy( &nPoints, pabyRec + 40 + 8, 4 ); + ByteCopy( &nParts, pabyRec + 36 + 8, 4 ); + + nRecordSize = 52; + + /* + * Write part start positions. + */ + ByteCopy( psObject->panPartStart, pabyRec + 44 + 8, + 4 * psObject->nParts ); + for( i = 0; i < psObject->nParts; i++ ) + { + if( bBigEndian ) SwapWord( 4, pabyRec + 44 + 8 + 4*i ); + nRecordSize += 4; + } + + /* + * Write multipatch part types if needed. + */ + if( psObject->nSHPType == SHPT_MULTIPATCH ) + { + memcpy( pabyRec + nRecordSize, psObject->panPartType, + 4*psObject->nParts ); + for( i = 0; i < psObject->nParts; i++ ) + { + if( bBigEndian ) SwapWord( 4, pabyRec + nRecordSize ); + nRecordSize += 4; + } + } + + /* + * Write the (x,y) vertex values. + */ + for( i = 0; i < psObject->nVertices; i++ ) + { + ByteCopy( psObject->padfX + i, pabyRec + nRecordSize, 8 ); + ByteCopy( psObject->padfY + i, pabyRec + nRecordSize + 8, 8 ); + + if( bBigEndian ) + SwapWord( 8, pabyRec + nRecordSize ); + + if( bBigEndian ) + SwapWord( 8, pabyRec + nRecordSize + 8 ); + + nRecordSize += 2 * 8; + } + + /* + * Write the Z coordinates (if any). + */ + if( psObject->nSHPType == SHPT_POLYGONZ + || psObject->nSHPType == SHPT_ARCZ + || psObject->nSHPType == SHPT_MULTIPATCH ) + { + ByteCopy( &(psObject->dfZMin), pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + + ByteCopy( &(psObject->dfZMax), pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + + for( i = 0; i < psObject->nVertices; i++ ) + { + ByteCopy( psObject->padfZ + i, pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + } + } + + /* + * Write the M values, if any. + */ + if( psObject->bMeasureIsUsed + && (psObject->nSHPType == SHPT_POLYGONM + || psObject->nSHPType == SHPT_ARCM +#ifndef DISABLE_MULTIPATCH_MEASURE + || psObject->nSHPType == SHPT_MULTIPATCH +#endif + || psObject->nSHPType == SHPT_POLYGONZ + || psObject->nSHPType == SHPT_ARCZ) ) + { + ByteCopy( &(psObject->dfMMin), pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + + ByteCopy( &(psObject->dfMMax), pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + + for( i = 0; i < psObject->nVertices; i++ ) + { + ByteCopy( psObject->padfM + i, pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + } + } + } + +/* -------------------------------------------------------------------- */ +/* Extract vertices for a MultiPoint. */ +/* -------------------------------------------------------------------- */ + else if( psObject->nSHPType == SHPT_MULTIPOINT + || psObject->nSHPType == SHPT_MULTIPOINTZ + || psObject->nSHPType == SHPT_MULTIPOINTM ) + { + int32 nPoints; + + nPoints = psObject->nVertices; + + _SHPSetBounds( pabyRec + 12, psObject ); + + if( bBigEndian ) SwapWord( 4, &nPoints ); + ByteCopy( &nPoints, pabyRec + 44, 4 ); + + for( i = 0; i < psObject->nVertices; i++ ) + { + ByteCopy( psObject->padfX + i, pabyRec + 48 + i*16, 8 ); + ByteCopy( psObject->padfY + i, pabyRec + 48 + i*16 + 8, 8 ); + + if( bBigEndian ) SwapWord( 8, pabyRec + 48 + i*16 ); + if( bBigEndian ) SwapWord( 8, pabyRec + 48 + i*16 + 8 ); + } + + nRecordSize = 48 + 16 * psObject->nVertices; + + if( psObject->nSHPType == SHPT_MULTIPOINTZ ) + { + ByteCopy( &(psObject->dfZMin), pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + + ByteCopy( &(psObject->dfZMax), pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + + for( i = 0; i < psObject->nVertices; i++ ) + { + ByteCopy( psObject->padfZ + i, pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + } + } + + if( psObject->bMeasureIsUsed + && (psObject->nSHPType == SHPT_MULTIPOINTZ + || psObject->nSHPType == SHPT_MULTIPOINTM) ) + { + ByteCopy( &(psObject->dfMMin), pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + + ByteCopy( &(psObject->dfMMax), pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + + for( i = 0; i < psObject->nVertices; i++ ) + { + ByteCopy( psObject->padfM + i, pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + } + } + } + +/* -------------------------------------------------------------------- */ +/* Write point. */ +/* -------------------------------------------------------------------- */ + else if( psObject->nSHPType == SHPT_POINT + || psObject->nSHPType == SHPT_POINTZ + || psObject->nSHPType == SHPT_POINTM ) + { + ByteCopy( psObject->padfX, pabyRec + 12, 8 ); + ByteCopy( psObject->padfY, pabyRec + 20, 8 ); + + if( bBigEndian ) SwapWord( 8, pabyRec + 12 ); + if( bBigEndian ) SwapWord( 8, pabyRec + 20 ); + + nRecordSize = 28; + + if( psObject->nSHPType == SHPT_POINTZ ) + { + ByteCopy( psObject->padfZ, pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + } + + if( psObject->bMeasureIsUsed + && (psObject->nSHPType == SHPT_POINTZ + || psObject->nSHPType == SHPT_POINTM) ) + { + ByteCopy( psObject->padfM, pabyRec + nRecordSize, 8 ); + if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize ); + nRecordSize += 8; + } + } + +/* -------------------------------------------------------------------- */ +/* Not much to do for null geometries. */ +/* -------------------------------------------------------------------- */ + else if( psObject->nSHPType == SHPT_NULL ) + { + nRecordSize = 12; + } + + else + { + /* unknown type */ + assert( FALSE ); + } + +/* -------------------------------------------------------------------- */ +/* Establish where we are going to put this record. If we are */ +/* rewriting the last record of the file, then we can update it in */ +/* place. Otherwise if rewriting an existing record, and it will */ +/* fit, then put it back where the original came from. Otherwise */ +/* write at the end. */ +/* -------------------------------------------------------------------- */ + if( nShapeId != -1 && psSHP->panRecOffset[nShapeId] + + psSHP->panRecSize[nShapeId] + 8 == psSHP->nFileSize ) + { + nRecordOffset = psSHP->panRecOffset[nShapeId]; + bAppendToLastRecord = TRUE; + } + else if( nShapeId == -1 || psSHP->panRecSize[nShapeId] < nRecordSize-8 ) + { + if( psSHP->nFileSize > UINT_MAX - nRecordSize) + { + char str[128]; + snprintf( str, sizeof(str), "Failed to write shape object. " + "File size cannot reach %u + %u.", + psSHP->nFileSize, nRecordSize ); + str[sizeof(str)-1] = '\0'; + psSHP->sHooks.Error( str ); + free( pabyRec ); + return -1; + } + + bAppendToFile = TRUE; + nRecordOffset = psSHP->nFileSize; + } + else + { + nRecordOffset = psSHP->panRecOffset[nShapeId]; + } + +/* -------------------------------------------------------------------- */ +/* Set the shape type, record number, and record size. */ +/* -------------------------------------------------------------------- */ + i32 = (nShapeId < 0) ? psSHP->nRecords+1 : nShapeId+1; /* record # */ + if( !bBigEndian ) SwapWord( 4, &i32 ); + ByteCopy( &i32, pabyRec, 4 ); + + i32 = (nRecordSize-8)/2; /* record size */ + if( !bBigEndian ) SwapWord( 4, &i32 ); + ByteCopy( &i32, pabyRec + 4, 4 ); + + i32 = psObject->nSHPType; /* shape type */ + if( bBigEndian ) SwapWord( 4, &i32 ); + ByteCopy( &i32, pabyRec + 8, 4 ); + +/* -------------------------------------------------------------------- */ +/* Write out record. */ +/* -------------------------------------------------------------------- */ + if( psSHP->sHooks.FSeek( psSHP->fpSHP, nRecordOffset, 0 ) != 0 ) + { + char szErrorMsg[200]; + + snprintf( szErrorMsg, sizeof(szErrorMsg), + "Error in psSHP->sHooks.FSeek() while writing object to .shp file: %s", + strerror(errno) ); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); + + free( pabyRec ); + return -1; + } + if( psSHP->sHooks.FWrite( pabyRec, nRecordSize, 1, psSHP->fpSHP ) < 1 ) + { + char szErrorMsg[200]; + + snprintf( szErrorMsg, sizeof(szErrorMsg), + "Error in psSHP->sHooks.FWrite() while writing object of %u bytes to .shp file: %s", + nRecordSize, strerror(errno) ); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); + + free( pabyRec ); + return -1; + } + + free( pabyRec ); + + if( bAppendToLastRecord ) + { + psSHP->nFileSize = psSHP->panRecOffset[nShapeId] + nRecordSize; + } + else if( bAppendToFile ) + { + if( nShapeId == -1 ) + nShapeId = psSHP->nRecords++; + + psSHP->panRecOffset[nShapeId] = psSHP->nFileSize; + psSHP->nFileSize += nRecordSize; + } + psSHP->panRecSize[nShapeId] = nRecordSize-8; + +/* -------------------------------------------------------------------- */ +/* Expand file wide bounds based on this shape. */ +/* -------------------------------------------------------------------- */ + if( psSHP->adBoundsMin[0] == 0.0 + && psSHP->adBoundsMax[0] == 0.0 + && psSHP->adBoundsMin[1] == 0.0 + && psSHP->adBoundsMax[1] == 0.0 ) + { + if( psObject->nSHPType == SHPT_NULL || psObject->nVertices == 0 ) + { + psSHP->adBoundsMin[0] = psSHP->adBoundsMax[0] = 0.0; + psSHP->adBoundsMin[1] = psSHP->adBoundsMax[1] = 0.0; + psSHP->adBoundsMin[2] = psSHP->adBoundsMax[2] = 0.0; + psSHP->adBoundsMin[3] = psSHP->adBoundsMax[3] = 0.0; + } + else + { + psSHP->adBoundsMin[0] = psSHP->adBoundsMax[0] = psObject->padfX[0]; + psSHP->adBoundsMin[1] = psSHP->adBoundsMax[1] = psObject->padfY[0]; + psSHP->adBoundsMin[2] = psSHP->adBoundsMax[2] = psObject->padfZ ? psObject->padfZ[0] : 0.0; + psSHP->adBoundsMin[3] = psSHP->adBoundsMax[3] = psObject->padfM ? psObject->padfM[0] : 0.0; + } + } + + for( i = 0; i < psObject->nVertices; i++ ) + { + psSHP->adBoundsMin[0] = MIN(psSHP->adBoundsMin[0],psObject->padfX[i]); + psSHP->adBoundsMin[1] = MIN(psSHP->adBoundsMin[1],psObject->padfY[i]); + psSHP->adBoundsMax[0] = MAX(psSHP->adBoundsMax[0],psObject->padfX[i]); + psSHP->adBoundsMax[1] = MAX(psSHP->adBoundsMax[1],psObject->padfY[i]); + if( psObject->padfZ ) + { + psSHP->adBoundsMin[2] = MIN(psSHP->adBoundsMin[2],psObject->padfZ[i]); + psSHP->adBoundsMax[2] = MAX(psSHP->adBoundsMax[2],psObject->padfZ[i]); + } + if( psObject->padfM ) + { + psSHP->adBoundsMin[3] = MIN(psSHP->adBoundsMin[3],psObject->padfM[i]); + psSHP->adBoundsMax[3] = MAX(psSHP->adBoundsMax[3],psObject->padfM[i]); + } + } + + return( nShapeId ); +} + +/************************************************************************/ +/* SHPAllocBuffer() */ +/************************************************************************/ + +static void* SHPAllocBuffer(unsigned char** pBuffer, int nSize) +{ + unsigned char* pRet; + + if( pBuffer == NULL ) + return calloc(1, nSize); + + pRet = *pBuffer; + if( pRet == NULL ) + return NULL; + + (*pBuffer) += nSize; + return pRet; +} + +/************************************************************************/ +/* SHPReallocObjectBufIfNecessary() */ +/************************************************************************/ + +static unsigned char* SHPReallocObjectBufIfNecessary ( SHPHandle psSHP, + int nObjectBufSize ) +{ + unsigned char* pBuffer; + if( nObjectBufSize == 0 ) + { + nObjectBufSize = 4 * sizeof(double); + } + if( nObjectBufSize > psSHP->nObjectBufSize ) + { + pBuffer = (unsigned char*) realloc( psSHP->pabyObjectBuf, nObjectBufSize ); + if( pBuffer != NULL ) + { + psSHP->pabyObjectBuf = pBuffer; + psSHP->nObjectBufSize = nObjectBufSize; + } + } + else + pBuffer = psSHP->pabyObjectBuf; + return pBuffer; +} + +/************************************************************************/ +/* SHPReadObject() */ +/* */ +/* Read the vertices, parts, and other non-attribute information */ +/* for one shape. */ +/************************************************************************/ + +SHPObject SHPAPI_CALL1(*) +SHPReadObject( SHPHandle psSHP, int hEntity ) + +{ + int nEntitySize, nRequiredSize; + SHPObject *psShape; + char szErrorMsg[128]; + int nSHPType; + int nBytesRead; + +/* -------------------------------------------------------------------- */ +/* Validate the record/entity number. */ +/* -------------------------------------------------------------------- */ + if( hEntity < 0 || hEntity >= psSHP->nRecords ) + return( NULL ); + +/* -------------------------------------------------------------------- */ +/* Read offset/length from SHX loading if necessary. */ +/* -------------------------------------------------------------------- */ + if( psSHP->panRecOffset[hEntity] == 0 && psSHP->fpSHX != NULL ) + { + unsigned int nOffset, nLength; + + if( psSHP->sHooks.FSeek( psSHP->fpSHX, 100 + 8 * hEntity, 0 ) != 0 || + psSHP->sHooks.FRead( &nOffset, 1, 4, psSHP->fpSHX ) != 4 || + psSHP->sHooks.FRead( &nLength, 1, 4, psSHP->fpSHX ) != 4 ) + { + char str[128]; + snprintf( str, sizeof(str), + "Error in fseek()/fread() reading object from .shx file at offset %d", + 100 + 8 * hEntity); + str[sizeof(str)-1] = '\0'; + + psSHP->sHooks.Error( str ); + return NULL; + } + if( !bBigEndian ) SwapWord( 4, &nOffset ); + if( !bBigEndian ) SwapWord( 4, &nLength ); + + if( nOffset > (unsigned int)INT_MAX ) + { + char str[128]; + snprintf( str, sizeof(str), + "Invalid offset for entity %d", hEntity); + str[sizeof(str)-1] = '\0'; + + psSHP->sHooks.Error( str ); + return NULL; + } + if( nLength > (unsigned int)(INT_MAX / 2 - 4) ) + { + char str[128]; + snprintf( str, sizeof(str), + "Invalid length for entity %d", hEntity); + str[sizeof(str)-1] = '\0'; + + psSHP->sHooks.Error( str ); + return NULL; + } + + psSHP->panRecOffset[hEntity] = nOffset*2; + psSHP->panRecSize[hEntity] = nLength*2; + } + +/* -------------------------------------------------------------------- */ +/* Ensure our record buffer is large enough. */ +/* -------------------------------------------------------------------- */ + nEntitySize = psSHP->panRecSize[hEntity]+8; + if( nEntitySize > psSHP->nBufSize ) + { + uchar* pabyRecNew; + int nNewBufSize = nEntitySize; + if( nNewBufSize < INT_MAX - nNewBufSize / 3 ) + nNewBufSize += nNewBufSize / 3; + else + nNewBufSize = INT_MAX; + + /* Before allocating too much memory, check that the file is big enough */ + /* and do not trust the file size in the header the first time we */ + /* need to allocate more than 10 MB */ + if( nNewBufSize >= 10 * 1024 * 1024 && + psSHP->nBufSize < 10 * 1024 * 1024 ) + { + SAOffset nFileSize; + psSHP->sHooks.FSeek( psSHP->fpSHP, 0, 2 ); + nFileSize = psSHP->sHooks.FTell(psSHP->fpSHP); + if( nFileSize >= UINT_MAX ) + psSHP->nFileSize = UINT_MAX; + else + psSHP->nFileSize = (unsigned int)nFileSize; + } + + if( psSHP->panRecOffset[hEntity] >= psSHP->nFileSize || + /* We should normally use nEntitySize instead of*/ + /* psSHP->panRecSize[hEntity] in the below test, but because of */ + /* the case of non conformant .shx files detailed a bit below, */ + /* let be more tolerant */ + psSHP->panRecSize[hEntity] > psSHP->nFileSize - psSHP->panRecOffset[hEntity] ) + { + char str[128]; + snprintf( str, sizeof(str), + "Error in fread() reading object of size %d at offset %u from .shp file", + nEntitySize, psSHP->panRecOffset[hEntity] ); + str[sizeof(str)-1] = '\0'; + + psSHP->sHooks.Error( str ); + return NULL; + } + + pabyRecNew = (uchar *) SfRealloc(psSHP->pabyRec,nNewBufSize); + if (pabyRecNew == NULL) + { + snprintf( szErrorMsg, sizeof(szErrorMsg), + "Not enough memory to allocate requested memory (nNewBufSize=%d). " + "Probably broken SHP file", nNewBufSize); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); + return NULL; + } + + /* Only set new buffer size after successful alloc */ + psSHP->pabyRec = pabyRecNew; + psSHP->nBufSize = nNewBufSize; + } + + /* In case we were not able to reallocate the buffer on a previous step */ + if (psSHP->pabyRec == NULL) + { + return NULL; + } + +/* -------------------------------------------------------------------- */ +/* Read the record. */ +/* -------------------------------------------------------------------- */ + if( psSHP->sHooks.FSeek( psSHP->fpSHP, psSHP->panRecOffset[hEntity], 0 ) != 0 ) + { + /* + * TODO - mloskot: Consider detailed diagnostics of shape file, + * for example to detect if file is truncated. + */ + char str[128]; + snprintf( str, sizeof(str), + "Error in fseek() reading object from .shp file at offset %u", + psSHP->panRecOffset[hEntity]); + str[sizeof(str)-1] = '\0'; + + psSHP->sHooks.Error( str ); + return NULL; + } + + nBytesRead = (int)psSHP->sHooks.FRead( psSHP->pabyRec, 1, nEntitySize, psSHP->fpSHP ); + + /* Special case for a shapefile whose .shx content length field is not equal */ + /* to the content length field of the .shp, which is a violation of "The */ + /* content length stored in the index record is the same as the value stored in the main */ + /* file record header." (http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf, page 24) */ + /* Actually in that case the .shx content length is equal to the .shp content length + */ + /* 4 (16 bit words), representing the 8 bytes of the record header... */ + if( nBytesRead >= 8 && nBytesRead == nEntitySize - 8 ) + { + /* Do a sanity check */ + int nSHPContentLength; + memcpy( &nSHPContentLength, psSHP->pabyRec + 4, 4 ); + if( !bBigEndian ) SwapWord( 4, &(nSHPContentLength) ); + if( nSHPContentLength < 0 || + nSHPContentLength > INT_MAX / 2 - 4 || + 2 * nSHPContentLength + 8 != nBytesRead ) + { + char str[128]; + snprintf( str, sizeof(str), + "Sanity check failed when trying to recover from inconsistent .shx/.shp with shape %d", + hEntity ); + str[sizeof(str)-1] = '\0'; + + psSHP->sHooks.Error( str ); + return NULL; + } + } + else if( nBytesRead != nEntitySize ) + { + /* + * TODO - mloskot: Consider detailed diagnostics of shape file, + * for example to detect if file is truncated. + */ + char str[128]; + snprintf( str, sizeof(str), + "Error in fread() reading object of size %d at offset %u from .shp file", + nEntitySize, psSHP->panRecOffset[hEntity] ); + str[sizeof(str)-1] = '\0'; + + psSHP->sHooks.Error( str ); + return NULL; + } + + if ( 8 + 4 > nEntitySize ) + { + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Corrupted .shp file : shape %d : nEntitySize = %d", + hEntity, nEntitySize); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); + return NULL; + } + memcpy( &nSHPType, psSHP->pabyRec + 8, 4 ); + + if( bBigEndian ) SwapWord( 4, &(nSHPType) ); + +/* -------------------------------------------------------------------- */ +/* Allocate and minimally initialize the object. */ +/* -------------------------------------------------------------------- */ + if( psSHP->bFastModeReadObject ) + { + if( psSHP->psCachedObject->bFastModeReadObject ) + { + psSHP->sHooks.Error( "Invalid read pattern in fast read mode. " + "SHPDestroyObject() should be called." ); + return NULL; + } + + psShape = psSHP->psCachedObject; + memset(psShape, 0, sizeof(SHPObject)); + } + else + psShape = (SHPObject *) calloc(1,sizeof(SHPObject)); + psShape->nShapeId = hEntity; + psShape->nSHPType = nSHPType; + psShape->bMeasureIsUsed = FALSE; + psShape->bFastModeReadObject = psSHP->bFastModeReadObject; + +/* ==================================================================== */ +/* Extract vertices for a Polygon or Arc. */ +/* ==================================================================== */ + if( psShape->nSHPType == SHPT_POLYGON || psShape->nSHPType == SHPT_ARC + || psShape->nSHPType == SHPT_POLYGONZ + || psShape->nSHPType == SHPT_POLYGONM + || psShape->nSHPType == SHPT_ARCZ + || psShape->nSHPType == SHPT_ARCM + || psShape->nSHPType == SHPT_MULTIPATCH ) + { + int32 nPoints, nParts; + int i, nOffset; + unsigned char* pBuffer = NULL; + unsigned char** ppBuffer = NULL; + + if ( 40 + 8 + 4 > nEntitySize ) + { + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Corrupted .shp file : shape %d : nEntitySize = %d", + hEntity, nEntitySize); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } +/* -------------------------------------------------------------------- */ +/* Get the X/Y bounds. */ +/* -------------------------------------------------------------------- */ + memcpy( &(psShape->dfXMin), psSHP->pabyRec + 8 + 4, 8 ); + memcpy( &(psShape->dfYMin), psSHP->pabyRec + 8 + 12, 8 ); + memcpy( &(psShape->dfXMax), psSHP->pabyRec + 8 + 20, 8 ); + memcpy( &(psShape->dfYMax), psSHP->pabyRec + 8 + 28, 8 ); + + if( bBigEndian ) SwapWord( 8, &(psShape->dfXMin) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfYMin) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfXMax) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfYMax) ); + +/* -------------------------------------------------------------------- */ +/* Extract part/point count, and build vertex and part arrays */ +/* to proper size. */ +/* -------------------------------------------------------------------- */ + memcpy( &nPoints, psSHP->pabyRec + 40 + 8, 4 ); + memcpy( &nParts, psSHP->pabyRec + 36 + 8, 4 ); + + if( bBigEndian ) SwapWord( 4, &nPoints ); + if( bBigEndian ) SwapWord( 4, &nParts ); + + /* nPoints and nParts are unsigned */ + if (/* nPoints < 0 || nParts < 0 || */ + nPoints > 50 * 1000 * 1000 || nParts > 10 * 1000 * 1000) + { + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Corrupted .shp file : shape %d, nPoints=%u, nParts=%u.", + hEntity, nPoints, nParts); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + + /* With the previous checks on nPoints and nParts, */ + /* we should not overflow here and after */ + /* since 50 M * (16 + 8 + 8) = 1 600 MB */ + nRequiredSize = 44 + 8 + 4 * nParts + 16 * nPoints; + if ( psShape->nSHPType == SHPT_POLYGONZ + || psShape->nSHPType == SHPT_ARCZ + || psShape->nSHPType == SHPT_MULTIPATCH ) + { + nRequiredSize += 16 + 8 * nPoints; + } + if( psShape->nSHPType == SHPT_MULTIPATCH ) + { + nRequiredSize += 4 * nParts; + } + if (nRequiredSize > nEntitySize) + { + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Corrupted .shp file : shape %d, nPoints=%u, nParts=%u, nEntitySize=%d.", + hEntity, nPoints, nParts, nEntitySize); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + + if( psShape->bFastModeReadObject ) + { + int nObjectBufSize = 4 * sizeof(double) * nPoints + 2 * sizeof(int) * nParts; + pBuffer = SHPReallocObjectBufIfNecessary(psSHP, nObjectBufSize); + ppBuffer = &pBuffer; + } + + psShape->nVertices = nPoints; + psShape->padfX = (double *) SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints); + psShape->padfY = (double *) SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints); + psShape->padfZ = (double *) SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints); + psShape->padfM = (double *) SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints); + + psShape->nParts = nParts; + psShape->panPartStart = (int *) SHPAllocBuffer(ppBuffer, nParts * sizeof(int)); + psShape->panPartType = (int *) SHPAllocBuffer(ppBuffer, nParts * sizeof(int)); + + if (psShape->padfX == NULL || + psShape->padfY == NULL || + psShape->padfZ == NULL || + psShape->padfM == NULL || + psShape->panPartStart == NULL || + psShape->panPartType == NULL) + { + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Not enough memory to allocate requested memory (nPoints=%u, nParts=%u) for shape %d. " + "Probably broken SHP file", nPoints, nParts, hEntity ); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + + for( i = 0; (int32)i < nParts; i++ ) + psShape->panPartType[i] = SHPP_RING; + +/* -------------------------------------------------------------------- */ +/* Copy out the part array from the record. */ +/* -------------------------------------------------------------------- */ + memcpy( psShape->panPartStart, psSHP->pabyRec + 44 + 8, 4 * nParts ); + for( i = 0; (int32)i < nParts; i++ ) + { + if( bBigEndian ) SwapWord( 4, psShape->panPartStart+i ); + + /* We check that the offset is inside the vertex array */ + if (psShape->panPartStart[i] < 0 + || (psShape->panPartStart[i] >= psShape->nVertices + && psShape->nVertices > 0) + || (psShape->panPartStart[i] > 0 && psShape->nVertices == 0) ) + { + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Corrupted .shp file : shape %d : panPartStart[%d] = %d, nVertices = %d", + hEntity, i, psShape->panPartStart[i], psShape->nVertices); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + if (i > 0 && psShape->panPartStart[i] <= psShape->panPartStart[i-1]) + { + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Corrupted .shp file : shape %d : panPartStart[%d] = %d, panPartStart[%d] = %d", + hEntity, i, psShape->panPartStart[i], i - 1, psShape->panPartStart[i - 1]); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + } + + nOffset = 44 + 8 + 4*nParts; + +/* -------------------------------------------------------------------- */ +/* If this is a multipatch, we will also have parts types. */ +/* -------------------------------------------------------------------- */ + if( psShape->nSHPType == SHPT_MULTIPATCH ) + { + memcpy( psShape->panPartType, psSHP->pabyRec + nOffset, 4*nParts ); + for( i = 0; (int32)i < nParts; i++ ) + { + if( bBigEndian ) SwapWord( 4, psShape->panPartType+i ); + } + + nOffset += 4*nParts; + } + +/* -------------------------------------------------------------------- */ +/* Copy out the vertices from the record. */ +/* -------------------------------------------------------------------- */ + for( i = 0; (int32)i < nPoints; i++ ) + { + memcpy(psShape->padfX + i, + psSHP->pabyRec + nOffset + i * 16, + 8 ); + + memcpy(psShape->padfY + i, + psSHP->pabyRec + nOffset + i * 16 + 8, + 8 ); + + if( bBigEndian ) SwapWord( 8, psShape->padfX + i ); + if( bBigEndian ) SwapWord( 8, psShape->padfY + i ); + } + + nOffset += 16*nPoints; + +/* -------------------------------------------------------------------- */ +/* If we have a Z coordinate, collect that now. */ +/* -------------------------------------------------------------------- */ + if( psShape->nSHPType == SHPT_POLYGONZ + || psShape->nSHPType == SHPT_ARCZ + || psShape->nSHPType == SHPT_MULTIPATCH ) + { + memcpy( &(psShape->dfZMin), psSHP->pabyRec + nOffset, 8 ); + memcpy( &(psShape->dfZMax), psSHP->pabyRec + nOffset + 8, 8 ); + + if( bBigEndian ) SwapWord( 8, &(psShape->dfZMin) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfZMax) ); + + for( i = 0; (int32)i < nPoints; i++ ) + { + memcpy( psShape->padfZ + i, + psSHP->pabyRec + nOffset + 16 + i*8, 8 ); + if( bBigEndian ) SwapWord( 8, psShape->padfZ + i ); + } + + nOffset += 16 + 8*nPoints; + } + else if( psShape->bFastModeReadObject ) + { + psShape->padfZ = NULL; + } + +/* -------------------------------------------------------------------- */ +/* If we have a M measure value, then read it now. We assume */ +/* that the measure can be present for any shape if the size is */ +/* big enough, but really it will only occur for the Z shapes */ +/* (options), and the M shapes. */ +/* -------------------------------------------------------------------- */ + if( nEntitySize >= (int)(nOffset + 16 + 8*nPoints) ) + { + memcpy( &(psShape->dfMMin), psSHP->pabyRec + nOffset, 8 ); + memcpy( &(psShape->dfMMax), psSHP->pabyRec + nOffset + 8, 8 ); + + if( bBigEndian ) SwapWord( 8, &(psShape->dfMMin) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfMMax) ); + + for( i = 0; (int32)i < nPoints; i++ ) + { + memcpy( psShape->padfM + i, + psSHP->pabyRec + nOffset + 16 + i*8, 8 ); + if( bBigEndian ) SwapWord( 8, psShape->padfM + i ); + } + psShape->bMeasureIsUsed = TRUE; + } + else if( psShape->bFastModeReadObject ) + { + psShape->padfM = NULL; + } + } + +/* ==================================================================== */ +/* Extract vertices for a MultiPoint. */ +/* ==================================================================== */ + else if( psShape->nSHPType == SHPT_MULTIPOINT + || psShape->nSHPType == SHPT_MULTIPOINTM + || psShape->nSHPType == SHPT_MULTIPOINTZ ) + { + int32 nPoints; + int i, nOffset; + unsigned char* pBuffer = NULL; + unsigned char** ppBuffer = NULL; + + if ( 44 + 4 > nEntitySize ) + { + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Corrupted .shp file : shape %d : nEntitySize = %d", + hEntity, nEntitySize); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + memcpy( &nPoints, psSHP->pabyRec + 44, 4 ); + + if( bBigEndian ) SwapWord( 4, &nPoints ); + + /* nPoints is unsigned */ + if (/* nPoints < 0 || */ nPoints > 50 * 1000 * 1000) + { + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Corrupted .shp file : shape %d : nPoints = %u", + hEntity, nPoints); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + + nRequiredSize = 48 + nPoints * 16; + if( psShape->nSHPType == SHPT_MULTIPOINTZ ) + { + nRequiredSize += 16 + nPoints * 8; + } + if (nRequiredSize > nEntitySize) + { + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Corrupted .shp file : shape %d : nPoints = %u, nEntitySize = %d", + hEntity, nPoints, nEntitySize); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + + if( psShape->bFastModeReadObject ) + { + int nObjectBufSize = 4 * sizeof(double) * nPoints; + pBuffer = SHPReallocObjectBufIfNecessary(psSHP, nObjectBufSize); + ppBuffer = &pBuffer; + } + + psShape->nVertices = nPoints; + + psShape->padfX = (double *) SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints); + psShape->padfY = (double *) SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints); + psShape->padfZ = (double *) SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints); + psShape->padfM = (double *) SHPAllocBuffer(ppBuffer, sizeof(double) * nPoints); + + if (psShape->padfX == NULL || + psShape->padfY == NULL || + psShape->padfZ == NULL || + psShape->padfM == NULL) + { + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Not enough memory to allocate requested memory (nPoints=%u) for shape %d. " + "Probably broken SHP file", nPoints, hEntity ); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + + for( i = 0; (int32)i < nPoints; i++ ) + { + memcpy(psShape->padfX+i, psSHP->pabyRec + 48 + 16 * i, 8 ); + memcpy(psShape->padfY+i, psSHP->pabyRec + 48 + 16 * i + 8, 8 ); + + if( bBigEndian ) SwapWord( 8, psShape->padfX + i ); + if( bBigEndian ) SwapWord( 8, psShape->padfY + i ); + } + + nOffset = 48 + 16*nPoints; + +/* -------------------------------------------------------------------- */ +/* Get the X/Y bounds. */ +/* -------------------------------------------------------------------- */ + memcpy( &(psShape->dfXMin), psSHP->pabyRec + 8 + 4, 8 ); + memcpy( &(psShape->dfYMin), psSHP->pabyRec + 8 + 12, 8 ); + memcpy( &(psShape->dfXMax), psSHP->pabyRec + 8 + 20, 8 ); + memcpy( &(psShape->dfYMax), psSHP->pabyRec + 8 + 28, 8 ); + + if( bBigEndian ) SwapWord( 8, &(psShape->dfXMin) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfYMin) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfXMax) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfYMax) ); + +/* -------------------------------------------------------------------- */ +/* If we have a Z coordinate, collect that now. */ +/* -------------------------------------------------------------------- */ + if( psShape->nSHPType == SHPT_MULTIPOINTZ ) + { + memcpy( &(psShape->dfZMin), psSHP->pabyRec + nOffset, 8 ); + memcpy( &(psShape->dfZMax), psSHP->pabyRec + nOffset + 8, 8 ); + + if( bBigEndian ) SwapWord( 8, &(psShape->dfZMin) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfZMax) ); + + for( i = 0; (int32)i < nPoints; i++ ) + { + memcpy( psShape->padfZ + i, + psSHP->pabyRec + nOffset + 16 + i*8, 8 ); + if( bBigEndian ) SwapWord( 8, psShape->padfZ + i ); + } + + nOffset += 16 + 8*nPoints; + } + else if( psShape->bFastModeReadObject ) + psShape->padfZ = NULL; + +/* -------------------------------------------------------------------- */ +/* If we have a M measure value, then read it now. We assume */ +/* that the measure can be present for any shape if the size is */ +/* big enough, but really it will only occur for the Z shapes */ +/* (options), and the M shapes. */ +/* -------------------------------------------------------------------- */ + if( nEntitySize >= (int)(nOffset + 16 + 8*nPoints) ) + { + memcpy( &(psShape->dfMMin), psSHP->pabyRec + nOffset, 8 ); + memcpy( &(psShape->dfMMax), psSHP->pabyRec + nOffset + 8, 8 ); + + if( bBigEndian ) SwapWord( 8, &(psShape->dfMMin) ); + if( bBigEndian ) SwapWord( 8, &(psShape->dfMMax) ); + + for( i = 0; (int32)i < nPoints; i++ ) + { + memcpy( psShape->padfM + i, + psSHP->pabyRec + nOffset + 16 + i*8, 8 ); + if( bBigEndian ) SwapWord( 8, psShape->padfM + i ); + } + psShape->bMeasureIsUsed = TRUE; + } + else if( psShape->bFastModeReadObject ) + psShape->padfM = NULL; + } + +/* ==================================================================== */ +/* Extract vertices for a point. */ +/* ==================================================================== */ + else if( psShape->nSHPType == SHPT_POINT + || psShape->nSHPType == SHPT_POINTM + || psShape->nSHPType == SHPT_POINTZ ) + { + int nOffset; + + psShape->nVertices = 1; + if( psShape->bFastModeReadObject ) + { + psShape->padfX = &(psShape->dfXMin); + psShape->padfY = &(psShape->dfYMin); + psShape->padfZ = &(psShape->dfZMin); + psShape->padfM = &(psShape->dfMMin); + psShape->padfZ[0] = 0.0; + psShape->padfM[0] = 0.0; + } + else + { + psShape->padfX = (double *) calloc(1,sizeof(double)); + psShape->padfY = (double *) calloc(1,sizeof(double)); + psShape->padfZ = (double *) calloc(1,sizeof(double)); + psShape->padfM = (double *) calloc(1,sizeof(double)); + } + + if (20 + 8 + (( psShape->nSHPType == SHPT_POINTZ ) ? 8 : 0)> nEntitySize) + { + snprintf(szErrorMsg, sizeof(szErrorMsg), + "Corrupted .shp file : shape %d : nEntitySize = %d", + hEntity, nEntitySize); + szErrorMsg[sizeof(szErrorMsg)-1] = '\0'; + psSHP->sHooks.Error( szErrorMsg ); + SHPDestroyObject(psShape); + return NULL; + } + memcpy( psShape->padfX, psSHP->pabyRec + 12, 8 ); + memcpy( psShape->padfY, psSHP->pabyRec + 20, 8 ); + + if( bBigEndian ) SwapWord( 8, psShape->padfX ); + if( bBigEndian ) SwapWord( 8, psShape->padfY ); + + nOffset = 20 + 8; + +/* -------------------------------------------------------------------- */ +/* If we have a Z coordinate, collect that now. */ +/* -------------------------------------------------------------------- */ + if( psShape->nSHPType == SHPT_POINTZ ) + { + memcpy( psShape->padfZ, psSHP->pabyRec + nOffset, 8 ); + + if( bBigEndian ) SwapWord( 8, psShape->padfZ ); + + nOffset += 8; + } + +/* -------------------------------------------------------------------- */ +/* If we have a M measure value, then read it now. We assume */ +/* that the measure can be present for any shape if the size is */ +/* big enough, but really it will only occur for the Z shapes */ +/* (options), and the M shapes. */ +/* -------------------------------------------------------------------- */ + if( nEntitySize >= nOffset + 8 ) + { + memcpy( psShape->padfM, psSHP->pabyRec + nOffset, 8 ); + + if( bBigEndian ) SwapWord( 8, psShape->padfM ); + psShape->bMeasureIsUsed = TRUE; + } + +/* -------------------------------------------------------------------- */ +/* Since no extents are supplied in the record, we will apply */ +/* them from the single vertex. */ +/* -------------------------------------------------------------------- */ + psShape->dfXMin = psShape->dfXMax = psShape->padfX[0]; + psShape->dfYMin = psShape->dfYMax = psShape->padfY[0]; + psShape->dfZMin = psShape->dfZMax = psShape->padfZ[0]; + psShape->dfMMin = psShape->dfMMax = psShape->padfM[0]; + } + + return( psShape ); +} + +/************************************************************************/ +/* SHPTypeName() */ +/************************************************************************/ + +const char SHPAPI_CALL1(*) +SHPTypeName( int nSHPType ) + +{ + switch( nSHPType ) + { + case SHPT_NULL: + return "NullShape"; + + case SHPT_POINT: + return "Point"; + + case SHPT_ARC: + return "Arc"; + + case SHPT_POLYGON: + return "Polygon"; + + case SHPT_MULTIPOINT: + return "MultiPoint"; + + case SHPT_POINTZ: + return "PointZ"; + + case SHPT_ARCZ: + return "ArcZ"; + + case SHPT_POLYGONZ: + return "PolygonZ"; + + case SHPT_MULTIPOINTZ: + return "MultiPointZ"; + + case SHPT_POINTM: + return "PointM"; + + case SHPT_ARCM: + return "ArcM"; + + case SHPT_POLYGONM: + return "PolygonM"; + + case SHPT_MULTIPOINTM: + return "MultiPointM"; + + case SHPT_MULTIPATCH: + return "MultiPatch"; + + default: + return "UnknownShapeType"; + } +} + +/************************************************************************/ +/* SHPPartTypeName() */ +/************************************************************************/ + +const char SHPAPI_CALL1(*) +SHPPartTypeName( int nPartType ) + +{ + switch( nPartType ) + { + case SHPP_TRISTRIP: + return "TriangleStrip"; + + case SHPP_TRIFAN: + return "TriangleFan"; + + case SHPP_OUTERRING: + return "OuterRing"; + + case SHPP_INNERRING: + return "InnerRing"; + + case SHPP_FIRSTRING: + return "FirstRing"; + + case SHPP_RING: + return "Ring"; + + default: + return "UnknownPartType"; + } +} + +/************************************************************************/ +/* SHPDestroyObject() */ +/************************************************************************/ + +void SHPAPI_CALL +SHPDestroyObject( SHPObject * psShape ) + +{ + if( psShape == NULL ) + return; + + if( psShape->bFastModeReadObject ) + { + psShape->bFastModeReadObject = FALSE; + return; + } + + if( psShape->padfX != NULL ) + free( psShape->padfX ); + if( psShape->padfY != NULL ) + free( psShape->padfY ); + if( psShape->padfZ != NULL ) + free( psShape->padfZ ); + if( psShape->padfM != NULL ) + free( psShape->padfM ); + + if( psShape->panPartStart != NULL ) + free( psShape->panPartStart ); + if( psShape->panPartType != NULL ) + free( psShape->panPartType ); + + free( psShape ); +} + +/************************************************************************/ +/* SHPRewindObject() */ +/* */ +/* Reset the winding of polygon objects to adhere to the */ +/* specification. */ +/************************************************************************/ + +int SHPAPI_CALL +SHPRewindObject( CPL_UNUSED SHPHandle hSHP, + SHPObject * psObject ) +{ + int iOpRing, bAltered = 0; + +/* -------------------------------------------------------------------- */ +/* Do nothing if this is not a polygon object. */ +/* -------------------------------------------------------------------- */ + if( psObject->nSHPType != SHPT_POLYGON + && psObject->nSHPType != SHPT_POLYGONZ + && psObject->nSHPType != SHPT_POLYGONM ) + return 0; + + if( psObject->nVertices == 0 || psObject->nParts == 0 ) + return 0; + +/* -------------------------------------------------------------------- */ +/* Process each of the rings. */ +/* -------------------------------------------------------------------- */ + for( iOpRing = 0; iOpRing < psObject->nParts; iOpRing++ ) + { + int bInner, iVert, nVertCount, nVertStart, iCheckRing; + double dfSum, dfTestX, dfTestY; + +/* -------------------------------------------------------------------- */ +/* Determine if this ring is an inner ring or an outer ring */ +/* relative to all the other rings. For now we assume the */ +/* first ring is outer and all others are inner, but eventually */ +/* we need to fix this to handle multiple island polygons and */ +/* unordered sets of rings. */ +/* */ +/* -------------------------------------------------------------------- */ + + /* Use point in the middle of segment to avoid testing + * common points of rings. + */ + dfTestX = ( psObject->padfX[psObject->panPartStart[iOpRing]] + + psObject->padfX[psObject->panPartStart[iOpRing] + 1] ) / 2; + dfTestY = ( psObject->padfY[psObject->panPartStart[iOpRing]] + + psObject->padfY[psObject->panPartStart[iOpRing] + 1] ) / 2; + + bInner = FALSE; + for( iCheckRing = 0; iCheckRing < psObject->nParts; iCheckRing++ ) + { + int iEdge; + + if( iCheckRing == iOpRing ) + continue; + + nVertStart = psObject->panPartStart[iCheckRing]; + + if( iCheckRing == psObject->nParts-1 ) + nVertCount = psObject->nVertices + - psObject->panPartStart[iCheckRing]; + else + nVertCount = psObject->panPartStart[iCheckRing+1] + - psObject->panPartStart[iCheckRing]; + + for( iEdge = 0; iEdge < nVertCount; iEdge++ ) + { + int iNext; + + if( iEdge < nVertCount-1 ) + iNext = iEdge+1; + else + iNext = 0; + + /* Rule #1: + * Test whether the edge 'straddles' the horizontal ray from the test point (dfTestY,dfTestY) + * The rule #1 also excludes edges colinear with the ray. + */ + if ( ( psObject->padfY[iEdge+nVertStart] < dfTestY + && dfTestY <= psObject->padfY[iNext+nVertStart] ) + || ( psObject->padfY[iNext+nVertStart] < dfTestY + && dfTestY <= psObject->padfY[iEdge+nVertStart] ) ) + { + /* Rule #2: + * Test if edge-ray intersection is on the right from the test point (dfTestY,dfTestY) + */ + double const intersect = + ( psObject->padfX[iEdge+nVertStart] + + ( dfTestY - psObject->padfY[iEdge+nVertStart] ) + / ( psObject->padfY[iNext+nVertStart] - psObject->padfY[iEdge+nVertStart] ) + * ( psObject->padfX[iNext+nVertStart] - psObject->padfX[iEdge+nVertStart] ) ); + + if (intersect < dfTestX) + { + bInner = !bInner; + } + } + } + } /* for iCheckRing */ + +/* -------------------------------------------------------------------- */ +/* Determine the current order of this ring so we will know if */ +/* it has to be reversed. */ +/* -------------------------------------------------------------------- */ + nVertStart = psObject->panPartStart[iOpRing]; + + if( iOpRing == psObject->nParts-1 ) + nVertCount = psObject->nVertices - psObject->panPartStart[iOpRing]; + else + nVertCount = psObject->panPartStart[iOpRing+1] + - psObject->panPartStart[iOpRing]; + + if (nVertCount < 2) + continue; + + dfSum = psObject->padfX[nVertStart] * (psObject->padfY[nVertStart+1] - psObject->padfY[nVertStart+nVertCount-1]); + for( iVert = nVertStart + 1; iVert < nVertStart+nVertCount-1; iVert++ ) + { + dfSum += psObject->padfX[iVert] * (psObject->padfY[iVert+1] - psObject->padfY[iVert-1]); + } + + dfSum += psObject->padfX[iVert] * (psObject->padfY[nVertStart] - psObject->padfY[iVert-1]); + +/* -------------------------------------------------------------------- */ +/* Reverse if necessary. */ +/* -------------------------------------------------------------------- */ + if( (dfSum < 0.0 && bInner) || (dfSum > 0.0 && !bInner) ) + { + int i; + + bAltered++; + for( i = 0; i < nVertCount/2; i++ ) + { + double dfSaved; + + /* Swap X */ + dfSaved = psObject->padfX[nVertStart+i]; + psObject->padfX[nVertStart+i] = + psObject->padfX[nVertStart+nVertCount-i-1]; + psObject->padfX[nVertStart+nVertCount-i-1] = dfSaved; + + /* Swap Y */ + dfSaved = psObject->padfY[nVertStart+i]; + psObject->padfY[nVertStart+i] = + psObject->padfY[nVertStart+nVertCount-i-1]; + psObject->padfY[nVertStart+nVertCount-i-1] = dfSaved; + + /* Swap Z */ + if( psObject->padfZ ) + { + dfSaved = psObject->padfZ[nVertStart+i]; + psObject->padfZ[nVertStart+i] = + psObject->padfZ[nVertStart+nVertCount-i-1]; + psObject->padfZ[nVertStart+nVertCount-i-1] = dfSaved; + } + + /* Swap M */ + if( psObject->padfM ) + { + dfSaved = psObject->padfM[nVertStart+i]; + psObject->padfM[nVertStart+i] = + psObject->padfM[nVertStart+nVertCount-i-1]; + psObject->padfM[nVertStart+nVertCount-i-1] = dfSaved; + } + } + } + } + + return bAltered; +} diff --git a/libs/shapelib/shprewind.c b/libs/shapelib/shprewind.c new file mode 100644 index 0000000..20acc01 --- /dev/null +++ b/libs/shapelib/shprewind.c @@ -0,0 +1,121 @@ +/****************************************************************************** + * $Id: shprewind.c,v 1.5 2016-12-05 12:44:05 erouault Exp $ + * + * Project: Shapelib + * Purpose: Utility to validate and reset the winding order of rings in + * polygon geometries to match the ordering required by spec. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 2002, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * $Log: shprewind.c,v $ + * Revision 1.5 2016-12-05 12:44:05 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.4 2004-09-26 20:09:35 fwarmerdam + * avoid rcsid warnings + * + * Revision 1.3 2004/01/09 16:39:49 fwarmerdam + * include standard include files + * + * Revision 1.2 2002/04/10 17:23:11 warmerda + * copy from source to destination now + * + * Revision 1.1 2002/04/10 16:56:36 warmerda + * New + * + */ + +#include +#include +#include "shapefil.h" + +int main( int argc, char ** argv ) + +{ + SHPHandle hSHP, hSHPOut; + int nShapeType, nEntities, i, nInvalidCount=0; + double adfMinBound[4], adfMaxBound[4]; + +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( argc != 3 ) + { + printf( "shprewind in_shp_file out_shp_file\n" ); + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Open the passed shapefile. */ +/* -------------------------------------------------------------------- */ + hSHP = SHPOpen( argv[1], "rb" ); + + if( hSHP == NULL ) + { + printf( "Unable to open:%s\n", argv[1] ); + exit( 1 ); + } + + SHPGetInfo( hSHP, &nEntities, &nShapeType, adfMinBound, adfMaxBound ); + +/* -------------------------------------------------------------------- */ +/* Create output shapefile. */ +/* -------------------------------------------------------------------- */ + hSHPOut = SHPCreate( argv[2], nShapeType ); + + if( hSHPOut == NULL ) + { + printf( "Unable to create:%s\n", argv[2] ); + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Skim over the list of shapes, printing all the vertices. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < nEntities; i++ ) + { + SHPObject *psShape; + + psShape = SHPReadObject( hSHP, i ); + if( SHPRewindObject( hSHP, psShape ) ) + nInvalidCount++; + SHPWriteObject( hSHPOut, -1, psShape ); + SHPDestroyObject( psShape ); + } + + SHPClose( hSHP ); + SHPClose( hSHPOut ); + + printf( "%d objects rewound.\n", nInvalidCount ); + + exit( 0 ); +} diff --git a/libs/shapelib/shptest.c b/libs/shapelib/shptest.c new file mode 100644 index 0000000..f600867 --- /dev/null +++ b/libs/shapelib/shptest.c @@ -0,0 +1,314 @@ +/****************************************************************************** + * $Id: shptest.c,v 1.8 2016-12-05 12:44:06 erouault Exp $ + * + * Project: Shapelib + * Purpose: Application for generating sample Shapefiles of various types. + * Used by the stream2.sh test script. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * $Log: shptest.c,v $ + * Revision 1.8 2016-12-05 12:44:06 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.7 2004-09-26 20:09:35 fwarmerdam + * avoid rcsid warnings + * + * Revision 1.6 2002/01/15 14:36:07 warmerda + * updated email address + * + * Revision 1.5 2001/06/22 02:18:20 warmerda + * Added null shape support + * + * Revision 1.4 2000/07/07 13:39:45 warmerda + * removed unused variables, and added system include files + * + * Revision 1.3 1999/11/05 14:12:05 warmerda + * updated license terms + * + * Revision 1.2 1998/12/16 05:15:20 warmerda + * Added support for writing multipatch. + * + * Revision 1.1 1998/11/09 20:18:42 warmerda + * Initial revision + * + */ + +#include +#include +#include "shapefil.h" + +SHP_CVSID("$Id: shptest.c,v 1.8 2016-12-05 12:44:06 erouault Exp $") + +/************************************************************************/ +/* Test_WritePoints() */ +/* */ +/* Write a small point file. */ +/************************************************************************/ + +static void Test_WritePoints( int nSHPType, const char *pszFilename ) + +{ + SHPHandle hSHPHandle; + SHPObject *psShape; + double x, y, z, m; + + hSHPHandle = SHPCreate( pszFilename, nSHPType ); + + x = 1.0; + y = 2.0; + z = 3.0; + m = 4.0; + psShape = SHPCreateObject( nSHPType, -1, 0, NULL, NULL, + 1, &x, &y, &z, &m ); + SHPWriteObject( hSHPHandle, -1, psShape ); + SHPDestroyObject( psShape ); + + x = 10.0; + y = 20.0; + z = 30.0; + m = 40.0; + psShape = SHPCreateObject( nSHPType, -1, 0, NULL, NULL, + 1, &x, &y, &z, &m ); + SHPWriteObject( hSHPHandle, -1, psShape ); + SHPDestroyObject( psShape ); + + SHPClose( hSHPHandle ); +} + +/************************************************************************/ +/* Test_WriteMultiPoints() */ +/* */ +/* Write a small multipoint file. */ +/************************************************************************/ + +static void Test_WriteMultiPoints( int nSHPType, const char *pszFilename ) + +{ + SHPHandle hSHPHandle; + SHPObject *psShape; + double x[4], y[4], z[4], m[4]; + int i, iShape; + + hSHPHandle = SHPCreate( pszFilename, nSHPType ); + + for( iShape = 0; iShape < 3; iShape++ ) + { + for( i = 0; i < 4; i++ ) + { + x[i] = iShape * 10 + i + 1.15; + y[i] = iShape * 10 + i + 2.25; + z[i] = iShape * 10 + i + 3.35; + m[i] = iShape * 10 + i + 4.45; + } + + psShape = SHPCreateObject( nSHPType, -1, 0, NULL, NULL, + 4, x, y, z, m ); + SHPWriteObject( hSHPHandle, -1, psShape ); + SHPDestroyObject( psShape ); + } + + SHPClose( hSHPHandle ); +} + +/************************************************************************/ +/* Test_WriteArcPoly() */ +/* */ +/* Write a small arc or polygon file. */ +/************************************************************************/ + +static void Test_WriteArcPoly( int nSHPType, const char *pszFilename ) + +{ + SHPHandle hSHPHandle; + SHPObject *psShape; + double x[100], y[100], z[100], m[100]; + int anPartStart[100]; + int anPartType[100], *panPartType; + int i, iShape; + + hSHPHandle = SHPCreate( pszFilename, nSHPType ); + + if( nSHPType == SHPT_MULTIPATCH ) + panPartType = anPartType; + else + panPartType = NULL; + + for( iShape = 0; iShape < 3; iShape++ ) + { + x[0] = 1.0; + y[0] = 1.0+iShape*3; + x[1] = 2.0; + y[1] = 1.0+iShape*3; + x[2] = 2.0; + y[2] = 2.0+iShape*3; + x[3] = 1.0; + y[3] = 2.0+iShape*3; + x[4] = 1.0; + y[4] = 1.0+iShape*3; + + for( i = 0; i < 5; i++ ) + { + z[i] = iShape * 10 + i + 3.35; + m[i] = iShape * 10 + i + 4.45; + } + + psShape = SHPCreateObject( nSHPType, -1, 0, NULL, NULL, + 5, x, y, z, m ); + SHPWriteObject( hSHPHandle, -1, psShape ); + SHPDestroyObject( psShape ); + } + +/* -------------------------------------------------------------------- */ +/* Do a multi part polygon (shape). We close it, and have two */ +/* inner rings. */ +/* -------------------------------------------------------------------- */ + x[0] = 0.0; + y[0] = 0.0; + x[1] = 0; + y[1] = 100; + x[2] = 100; + y[2] = 100; + x[3] = 100; + y[3] = 0; + x[4] = 0; + y[4] = 0; + + x[5] = 10; + y[5] = 20; + x[6] = 30; + y[6] = 20; + x[7] = 30; + y[7] = 40; + x[8] = 10; + y[8] = 40; + x[9] = 10; + y[9] = 20; + + x[10] = 60; + y[10] = 20; + x[11] = 90; + y[11] = 20; + x[12] = 90; + y[12] = 40; + x[13] = 60; + y[13] = 40; + x[14] = 60; + y[14] = 20; + + for( i = 0; i < 15; i++ ) + { + z[i] = i; + m[i] = i*2; + } + + anPartStart[0] = 0; + anPartStart[1] = 5; + anPartStart[2] = 10; + + anPartType[0] = SHPP_RING; + anPartType[1] = SHPP_INNERRING; + anPartType[2] = SHPP_INNERRING; + + psShape = SHPCreateObject( nSHPType, -1, 3, anPartStart, panPartType, + 15, x, y, z, m ); + SHPWriteObject( hSHPHandle, -1, psShape ); + SHPDestroyObject( psShape ); + + + SHPClose( hSHPHandle ); +} + +/************************************************************************/ +/* main() */ +/************************************************************************/ +int main( int argc, char ** argv ) + +{ +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( argc != 2 ) + { + printf( "shptest test_number\n" ); + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Figure out which test to run. */ +/* -------------------------------------------------------------------- */ + + if( atoi(argv[1]) == 0 ) + Test_WritePoints( SHPT_NULL, "test0.shp" ); + + else if( atoi(argv[1]) == 1 ) + Test_WritePoints( SHPT_POINT, "test1.shp" ); + else if( atoi(argv[1]) == 2 ) + Test_WritePoints( SHPT_POINTZ, "test2.shp" ); + else if( atoi(argv[1]) == 3 ) + Test_WritePoints( SHPT_POINTM, "test3.shp" ); + + else if( atoi(argv[1]) == 4 ) + Test_WriteMultiPoints( SHPT_MULTIPOINT, "test4.shp" ); + else if( atoi(argv[1]) == 5 ) + Test_WriteMultiPoints( SHPT_MULTIPOINTZ, "test5.shp" ); + else if( atoi(argv[1]) == 6 ) + Test_WriteMultiPoints( SHPT_MULTIPOINTM, "test6.shp" ); + + else if( atoi(argv[1]) == 7 ) + Test_WriteArcPoly( SHPT_ARC, "test7.shp" ); + else if( atoi(argv[1]) == 8 ) + Test_WriteArcPoly( SHPT_ARCZ, "test8.shp" ); + else if( atoi(argv[1]) == 9 ) + Test_WriteArcPoly( SHPT_ARCM, "test9.shp" ); + + else if( atoi(argv[1]) == 10 ) + Test_WriteArcPoly( SHPT_POLYGON, "test10.shp" ); + else if( atoi(argv[1]) == 11 ) + Test_WriteArcPoly( SHPT_POLYGONZ, "test11.shp" ); + else if( atoi(argv[1]) == 12 ) + Test_WriteArcPoly( SHPT_POLYGONM, "test12.shp" ); + + else if( atoi(argv[1]) == 13 ) + Test_WriteArcPoly( SHPT_MULTIPATCH, "test13.shp" ); + else + { + printf( "Test `%s' not recognised.\n", argv[1] ); + exit( 10 ); + } + +#ifdef USE_DBMALLOC + malloc_dump(2); +#endif + + exit( 0 ); +} diff --git a/libs/shapelib/shptree.c b/libs/shapelib/shptree.c new file mode 100644 index 0000000..d81533c --- /dev/null +++ b/libs/shapelib/shptree.c @@ -0,0 +1,1266 @@ +/****************************************************************************** + * $Id: shptree.c,v 1.19 2016-12-05 12:44:06 erouault Exp $ + * + * Project: Shapelib + * Purpose: Implementation of quadtree building and searching functions. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * Copyright (c) 2012, Even Rouault + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * $Log: shptree.c,v $ + * Revision 1.19 2016-12-05 12:44:06 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.18 2016-12-04 15:30:15 erouault + * * shpopen.c, dbfopen.c, shptree.c, shapefil.h: resync with + * GDAL Shapefile driver. Mostly cleanups. SHPObject and DBFInfo + * structures extended with new members. New functions: + * DBFSetLastModifiedDate, SHPOpenLLEx, SHPRestoreSHX, + * SHPSetFastModeReadObject + * + * * sbnsearch.c: new file to implement original ESRI .sbn spatial + * index reading. (no write support). New functions: + * SBNOpenDiskTree, SBNCloseDiskTree, SBNSearchDiskTree, + * SBNSearchDiskTreeInteger, SBNSearchFreeIds + * + * * Makefile, makefile.vc, CMakeLists.txt, shapelib.def: updates + * with new file and symbols. + * + * * commit: helper script to cvs commit + * + * Revision 1.17 2012-01-27 21:09:26 fwarmerdam + * optimize .qix output (gdal #4472) + * + * Revision 1.16 2011-12-11 22:26:46 fwarmerdam + * upgrade .qix access code to use SAHooks (gdal #3365) + * + * Revision 1.15 2011-07-24 05:59:25 fwarmerdam + * minimize use of CPLError in favor of SAHooks.Error() + * + * Revision 1.14 2010-08-27 23:43:27 fwarmerdam + * add SHPAPI_CALL attribute in code + * + * Revision 1.13 2010-06-29 05:50:15 fwarmerdam + * fix sign of Z/M comparisons in SHPCheckObjectContained (#2223) + * + * Revision 1.12 2008-11-12 15:39:50 fwarmerdam + * improve safety in face of buggy .shp file. + * + * Revision 1.11 2007/10/27 03:31:14 fwarmerdam + * limit default depth of tree to 12 levels (gdal ticket #1594) + * + * Revision 1.10 2005/01/03 22:30:13 fwarmerdam + * added support for saved quadtrees + * + * Revision 1.9 2003/01/28 15:53:41 warmerda + * Avoid build warnings. + * + * Revision 1.8 2002/05/07 13:07:45 warmerda + * use qsort() - patch from Bernhard Herzog + * + * Revision 1.7 2002/01/15 14:36:07 warmerda + * updated email address + * + * Revision 1.6 2001/05/23 13:36:52 warmerda + * added use of SHPAPI_CALL + * + * Revision 1.5 1999/11/05 14:12:05 warmerda + * updated license terms + * + * Revision 1.4 1999/06/02 18:24:21 warmerda + * added trimming code + * + * Revision 1.3 1999/06/02 17:56:12 warmerda + * added quad'' subnode support for trees + * + * Revision 1.2 1999/05/18 19:11:11 warmerda + * Added example searching capability + * + * Revision 1.1 1999/05/18 17:49:20 warmerda + * New + * + */ + +#include "shapefil.h" + +#include +#include +#include +#include +#include + +#ifdef USE_CPL +#include "cpl_error.h" +#endif + +SHP_CVSID("$Id: shptree.c,v 1.19 2016-12-05 12:44:06 erouault Exp $") + +#ifndef TRUE +# define TRUE 1 +# define FALSE 0 +#endif + +static int bBigEndian = 0; + + +/* -------------------------------------------------------------------- */ +/* If the following is 0.5, nodes will be split in half. If it */ +/* is 0.6 then each subnode will contain 60% of the parent */ +/* node, with 20% representing overlap. This can be help to */ +/* prevent small objects on a boundary from shifting too high */ +/* up the tree. */ +/* -------------------------------------------------------------------- */ + +#define SHP_SPLIT_RATIO 0.55 + +/************************************************************************/ +/* SfRealloc() */ +/* */ +/* A realloc cover function that will access a NULL pointer as */ +/* a valid input. */ +/************************************************************************/ + +static void * SfRealloc( void * pMem, int nNewSize ) + +{ + if( pMem == NULL ) + return( (void *) malloc(nNewSize) ); + else + return( (void *) realloc(pMem,nNewSize) ); +} + +/************************************************************************/ +/* SHPTreeNodeInit() */ +/* */ +/* Initialize a tree node. */ +/************************************************************************/ + +static SHPTreeNode *SHPTreeNodeCreate( double * padfBoundsMin, + double * padfBoundsMax ) + +{ + SHPTreeNode *psTreeNode; + + psTreeNode = (SHPTreeNode *) malloc(sizeof(SHPTreeNode)); + if( NULL == psTreeNode ) + return NULL; + + psTreeNode->nShapeCount = 0; + psTreeNode->panShapeIds = NULL; + psTreeNode->papsShapeObj = NULL; + + psTreeNode->nSubNodes = 0; + + if( padfBoundsMin != NULL ) + memcpy( psTreeNode->adfBoundsMin, padfBoundsMin, sizeof(double) * 4 ); + + if( padfBoundsMax != NULL ) + memcpy( psTreeNode->adfBoundsMax, padfBoundsMax, sizeof(double) * 4 ); + + return psTreeNode; +} + + +/************************************************************************/ +/* SHPCreateTree() */ +/************************************************************************/ + +SHPTree SHPAPI_CALL1(*) + SHPCreateTree( SHPHandle hSHP, int nDimension, int nMaxDepth, + double *padfBoundsMin, double *padfBoundsMax ) + +{ + SHPTree *psTree; + + if( padfBoundsMin == NULL && hSHP == NULL ) + return NULL; + +/* -------------------------------------------------------------------- */ +/* Allocate the tree object */ +/* -------------------------------------------------------------------- */ + psTree = (SHPTree *) malloc(sizeof(SHPTree)); + if( NULL == psTree ) + { + return NULL; + } + + psTree->hSHP = hSHP; + psTree->nMaxDepth = nMaxDepth; + psTree->nDimension = nDimension; + psTree->nTotalCount = 0; + +/* -------------------------------------------------------------------- */ +/* If no max depth was defined, try to select a reasonable one */ +/* that implies approximately 8 shapes per node. */ +/* -------------------------------------------------------------------- */ + if( psTree->nMaxDepth == 0 && hSHP != NULL ) + { + int nMaxNodeCount = 1; + int nShapeCount; + + SHPGetInfo( hSHP, &nShapeCount, NULL, NULL, NULL ); + while( nMaxNodeCount*4 < nShapeCount ) + { + psTree->nMaxDepth += 1; + nMaxNodeCount = nMaxNodeCount * 2; + } + +#ifdef USE_CPL + CPLDebug( "Shape", + "Estimated spatial index tree depth: %d", + psTree->nMaxDepth ); +#endif + + /* NOTE: Due to problems with memory allocation for deep trees, + * automatically estimated depth is limited up to 12 levels. + * See Ticket #1594 for detailed discussion. + */ + if( psTree->nMaxDepth > MAX_DEFAULT_TREE_DEPTH ) + { + psTree->nMaxDepth = MAX_DEFAULT_TREE_DEPTH; + +#ifdef USE_CPL + CPLDebug( "Shape", + "Falling back to max number of allowed index tree levels (%d).", + MAX_DEFAULT_TREE_DEPTH ); +#endif + } + } + +/* -------------------------------------------------------------------- */ +/* Allocate the root node. */ +/* -------------------------------------------------------------------- */ + psTree->psRoot = SHPTreeNodeCreate( padfBoundsMin, padfBoundsMax ); + if( NULL == psTree->psRoot ) + { + free( psTree ); + return NULL; + } + +/* -------------------------------------------------------------------- */ +/* Assign the bounds to the root node. If none are passed in, */ +/* use the bounds of the provided file otherwise the create */ +/* function will have already set the bounds. */ +/* -------------------------------------------------------------------- */ + if( padfBoundsMin == NULL ) + { + SHPGetInfo( hSHP, NULL, NULL, + psTree->psRoot->adfBoundsMin, + psTree->psRoot->adfBoundsMax ); + } + +/* -------------------------------------------------------------------- */ +/* If we have a file, insert all it's shapes into the tree. */ +/* -------------------------------------------------------------------- */ + if( hSHP != NULL ) + { + int iShape, nShapeCount; + + SHPGetInfo( hSHP, &nShapeCount, NULL, NULL, NULL ); + + for( iShape = 0; iShape < nShapeCount; iShape++ ) + { + SHPObject *psShape; + + psShape = SHPReadObject( hSHP, iShape ); + if( psShape != NULL ) + { + SHPTreeAddShapeId( psTree, psShape ); + SHPDestroyObject( psShape ); + } + } + } + + return psTree; +} + +/************************************************************************/ +/* SHPDestroyTreeNode() */ +/************************************************************************/ + +static void SHPDestroyTreeNode( SHPTreeNode * psTreeNode ) + +{ + int i; + + assert( NULL != psTreeNode ); + + for( i = 0; i < psTreeNode->nSubNodes; i++ ) + { + if( psTreeNode->apsSubNode[i] != NULL ) + SHPDestroyTreeNode( psTreeNode->apsSubNode[i] ); + } + + if( psTreeNode->panShapeIds != NULL ) + free( psTreeNode->panShapeIds ); + + if( psTreeNode->papsShapeObj != NULL ) + { + for( i = 0; i < psTreeNode->nShapeCount; i++ ) + { + if( psTreeNode->papsShapeObj[i] != NULL ) + SHPDestroyObject( psTreeNode->papsShapeObj[i] ); + } + + free( psTreeNode->papsShapeObj ); + } + + free( psTreeNode ); +} + +/************************************************************************/ +/* SHPDestroyTree() */ +/************************************************************************/ + +void SHPAPI_CALL +SHPDestroyTree( SHPTree * psTree ) + +{ + SHPDestroyTreeNode( psTree->psRoot ); + free( psTree ); +} + +/************************************************************************/ +/* SHPCheckBoundsOverlap() */ +/* */ +/* Do the given boxes overlap at all? */ +/************************************************************************/ + +int SHPAPI_CALL +SHPCheckBoundsOverlap( double * padfBox1Min, double * padfBox1Max, + double * padfBox2Min, double * padfBox2Max, + int nDimension ) + +{ + int iDim; + + for( iDim = 0; iDim < nDimension; iDim++ ) + { + if( padfBox2Max[iDim] < padfBox1Min[iDim] ) + return FALSE; + + if( padfBox1Max[iDim] < padfBox2Min[iDim] ) + return FALSE; + } + + return TRUE; +} + +/************************************************************************/ +/* SHPCheckObjectContained() */ +/* */ +/* Does the given shape fit within the indicated extents? */ +/************************************************************************/ + +static int SHPCheckObjectContained( SHPObject * psObject, int nDimension, + double * padfBoundsMin, double * padfBoundsMax ) + +{ + if( psObject->dfXMin < padfBoundsMin[0] + || psObject->dfXMax > padfBoundsMax[0] ) + return FALSE; + + if( psObject->dfYMin < padfBoundsMin[1] + || psObject->dfYMax > padfBoundsMax[1] ) + return FALSE; + + if( nDimension == 2 ) + return TRUE; + + if( psObject->dfZMin < padfBoundsMin[2] + || psObject->dfZMax > padfBoundsMax[2] ) + return FALSE; + + if( nDimension == 3 ) + return TRUE; + + if( psObject->dfMMin < padfBoundsMin[3] + || psObject->dfMMax > padfBoundsMax[3] ) + return FALSE; + + return TRUE; +} + +/************************************************************************/ +/* SHPTreeSplitBounds() */ +/* */ +/* Split a region into two subregion evenly, cutting along the */ +/* longest dimension. */ +/************************************************************************/ + +static void +SHPTreeSplitBounds( double *padfBoundsMinIn, double *padfBoundsMaxIn, + double *padfBoundsMin1, double * padfBoundsMax1, + double *padfBoundsMin2, double * padfBoundsMax2 ) + +{ +/* -------------------------------------------------------------------- */ +/* The output bounds will be very similar to the input bounds, */ +/* so just copy over to start. */ +/* -------------------------------------------------------------------- */ + memcpy( padfBoundsMin1, padfBoundsMinIn, sizeof(double) * 4 ); + memcpy( padfBoundsMax1, padfBoundsMaxIn, sizeof(double) * 4 ); + memcpy( padfBoundsMin2, padfBoundsMinIn, sizeof(double) * 4 ); + memcpy( padfBoundsMax2, padfBoundsMaxIn, sizeof(double) * 4 ); + +/* -------------------------------------------------------------------- */ +/* Split in X direction. */ +/* -------------------------------------------------------------------- */ + if( (padfBoundsMaxIn[0] - padfBoundsMinIn[0]) + > (padfBoundsMaxIn[1] - padfBoundsMinIn[1]) ) + { + double dfRange = padfBoundsMaxIn[0] - padfBoundsMinIn[0]; + + padfBoundsMax1[0] = padfBoundsMinIn[0] + dfRange * SHP_SPLIT_RATIO; + padfBoundsMin2[0] = padfBoundsMaxIn[0] - dfRange * SHP_SPLIT_RATIO; + } + +/* -------------------------------------------------------------------- */ +/* Otherwise split in Y direction. */ +/* -------------------------------------------------------------------- */ + else + { + double dfRange = padfBoundsMaxIn[1] - padfBoundsMinIn[1]; + + padfBoundsMax1[1] = padfBoundsMinIn[1] + dfRange * SHP_SPLIT_RATIO; + padfBoundsMin2[1] = padfBoundsMaxIn[1] - dfRange * SHP_SPLIT_RATIO; + } +} + +/************************************************************************/ +/* SHPTreeNodeAddShapeId() */ +/************************************************************************/ + +static int +SHPTreeNodeAddShapeId( SHPTreeNode * psTreeNode, SHPObject * psObject, + int nMaxDepth, int nDimension ) + +{ + int i; + +/* -------------------------------------------------------------------- */ +/* If there are subnodes, then consider whether this object */ +/* will fit in them. */ +/* -------------------------------------------------------------------- */ + if( nMaxDepth > 1 && psTreeNode->nSubNodes > 0 ) + { + for( i = 0; i < psTreeNode->nSubNodes; i++ ) + { + if( SHPCheckObjectContained(psObject, nDimension, + psTreeNode->apsSubNode[i]->adfBoundsMin, + psTreeNode->apsSubNode[i]->adfBoundsMax)) + { + return SHPTreeNodeAddShapeId( psTreeNode->apsSubNode[i], + psObject, nMaxDepth-1, + nDimension ); + } + } + } + +/* -------------------------------------------------------------------- */ +/* Otherwise, consider creating four subnodes if could fit into */ +/* them, and adding to the appropriate subnode. */ +/* -------------------------------------------------------------------- */ +#if MAX_SUBNODE == 4 + else if( nMaxDepth > 1 && psTreeNode->nSubNodes == 0 ) + { + double adfBoundsMinH1[4], adfBoundsMaxH1[4]; + double adfBoundsMinH2[4], adfBoundsMaxH2[4]; + double adfBoundsMin1[4], adfBoundsMax1[4]; + double adfBoundsMin2[4], adfBoundsMax2[4]; + double adfBoundsMin3[4], adfBoundsMax3[4]; + double adfBoundsMin4[4], adfBoundsMax4[4]; + + SHPTreeSplitBounds( psTreeNode->adfBoundsMin, + psTreeNode->adfBoundsMax, + adfBoundsMinH1, adfBoundsMaxH1, + adfBoundsMinH2, adfBoundsMaxH2 ); + + SHPTreeSplitBounds( adfBoundsMinH1, adfBoundsMaxH1, + adfBoundsMin1, adfBoundsMax1, + adfBoundsMin2, adfBoundsMax2 ); + + SHPTreeSplitBounds( adfBoundsMinH2, adfBoundsMaxH2, + adfBoundsMin3, adfBoundsMax3, + adfBoundsMin4, adfBoundsMax4 ); + + if( SHPCheckObjectContained(psObject, nDimension, + adfBoundsMin1, adfBoundsMax1) + || SHPCheckObjectContained(psObject, nDimension, + adfBoundsMin2, adfBoundsMax2) + || SHPCheckObjectContained(psObject, nDimension, + adfBoundsMin3, adfBoundsMax3) + || SHPCheckObjectContained(psObject, nDimension, + adfBoundsMin4, adfBoundsMax4) ) + { + psTreeNode->nSubNodes = 4; + psTreeNode->apsSubNode[0] = SHPTreeNodeCreate( adfBoundsMin1, + adfBoundsMax1 ); + psTreeNode->apsSubNode[1] = SHPTreeNodeCreate( adfBoundsMin2, + adfBoundsMax2 ); + psTreeNode->apsSubNode[2] = SHPTreeNodeCreate( adfBoundsMin3, + adfBoundsMax3 ); + psTreeNode->apsSubNode[3] = SHPTreeNodeCreate( adfBoundsMin4, + adfBoundsMax4 ); + + /* recurse back on this node now that it has subnodes */ + return( SHPTreeNodeAddShapeId( psTreeNode, psObject, + nMaxDepth, nDimension ) ); + } + } +#endif /* MAX_SUBNODE == 4 */ + +/* -------------------------------------------------------------------- */ +/* Otherwise, consider creating two subnodes if could fit into */ +/* them, and adding to the appropriate subnode. */ +/* -------------------------------------------------------------------- */ +#if MAX_SUBNODE == 2 + else if( nMaxDepth > 1 && psTreeNode->nSubNodes == 0 ) + { + double adfBoundsMin1[4], adfBoundsMax1[4]; + double adfBoundsMin2[4], adfBoundsMax2[4]; + + SHPTreeSplitBounds( psTreeNode->adfBoundsMin, psTreeNode->adfBoundsMax, + adfBoundsMin1, adfBoundsMax1, + adfBoundsMin2, adfBoundsMax2 ); + + if( SHPCheckObjectContained(psObject, nDimension, + adfBoundsMin1, adfBoundsMax1)) + { + psTreeNode->nSubNodes = 2; + psTreeNode->apsSubNode[0] = SHPTreeNodeCreate( adfBoundsMin1, + adfBoundsMax1 ); + psTreeNode->apsSubNode[1] = SHPTreeNodeCreate( adfBoundsMin2, + adfBoundsMax2 ); + + return( SHPTreeNodeAddShapeId( psTreeNode->apsSubNode[0], psObject, + nMaxDepth - 1, nDimension ) ); + } + else if( SHPCheckObjectContained(psObject, nDimension, + adfBoundsMin2, adfBoundsMax2) ) + { + psTreeNode->nSubNodes = 2; + psTreeNode->apsSubNode[0] = SHPTreeNodeCreate( adfBoundsMin1, + adfBoundsMax1 ); + psTreeNode->apsSubNode[1] = SHPTreeNodeCreate( adfBoundsMin2, + adfBoundsMax2 ); + + return( SHPTreeNodeAddShapeId( psTreeNode->apsSubNode[1], psObject, + nMaxDepth - 1, nDimension ) ); + } + } +#endif /* MAX_SUBNODE == 2 */ + +/* -------------------------------------------------------------------- */ +/* If none of that worked, just add it to this nodes list. */ +/* -------------------------------------------------------------------- */ + psTreeNode->nShapeCount++; + + psTreeNode->panShapeIds = (int *) + SfRealloc( psTreeNode->panShapeIds, + sizeof(int) * psTreeNode->nShapeCount ); + psTreeNode->panShapeIds[psTreeNode->nShapeCount-1] = psObject->nShapeId; + + if( psTreeNode->papsShapeObj != NULL ) + { + psTreeNode->papsShapeObj = (SHPObject **) + SfRealloc( psTreeNode->papsShapeObj, + sizeof(void *) * psTreeNode->nShapeCount ); + psTreeNode->papsShapeObj[psTreeNode->nShapeCount-1] = NULL; + } + + return TRUE; +} + +/************************************************************************/ +/* SHPTreeAddShapeId() */ +/* */ +/* Add a shape to the tree, but don't keep a pointer to the */ +/* object data, just keep the shapeid. */ +/************************************************************************/ + +int SHPAPI_CALL +SHPTreeAddShapeId( SHPTree * psTree, SHPObject * psObject ) + +{ + psTree->nTotalCount++; + + return( SHPTreeNodeAddShapeId( psTree->psRoot, psObject, + psTree->nMaxDepth, psTree->nDimension ) ); +} + +/************************************************************************/ +/* SHPTreeCollectShapesIds() */ +/* */ +/* Work function implementing SHPTreeFindLikelyShapes() on a */ +/* tree node by tree node basis. */ +/************************************************************************/ + +static void +SHPTreeCollectShapeIds( SHPTree *hTree, SHPTreeNode * psTreeNode, + double * padfBoundsMin, double * padfBoundsMax, + int * pnShapeCount, int * pnMaxShapes, + int ** ppanShapeList ) + +{ + int i; + +/* -------------------------------------------------------------------- */ +/* Does this node overlap the area of interest at all? If not, */ +/* return without adding to the list at all. */ +/* -------------------------------------------------------------------- */ + if( !SHPCheckBoundsOverlap( psTreeNode->adfBoundsMin, + psTreeNode->adfBoundsMax, + padfBoundsMin, + padfBoundsMax, + hTree->nDimension ) ) + return; + +/* -------------------------------------------------------------------- */ +/* Grow the list to hold the shapes on this node. */ +/* -------------------------------------------------------------------- */ + if( *pnShapeCount + psTreeNode->nShapeCount > *pnMaxShapes ) + { + *pnMaxShapes = (*pnShapeCount + psTreeNode->nShapeCount) * 2 + 20; + *ppanShapeList = (int *) + SfRealloc(*ppanShapeList,sizeof(int) * *pnMaxShapes); + } + +/* -------------------------------------------------------------------- */ +/* Add the local nodes shapeids to the list. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < psTreeNode->nShapeCount; i++ ) + { + (*ppanShapeList)[(*pnShapeCount)++] = psTreeNode->panShapeIds[i]; + } + +/* -------------------------------------------------------------------- */ +/* Recurse to subnodes if they exist. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < psTreeNode->nSubNodes; i++ ) + { + if( psTreeNode->apsSubNode[i] != NULL ) + SHPTreeCollectShapeIds( hTree, psTreeNode->apsSubNode[i], + padfBoundsMin, padfBoundsMax, + pnShapeCount, pnMaxShapes, + ppanShapeList ); + } +} + +/************************************************************************/ +/* SHPTreeFindLikelyShapes() */ +/* */ +/* Find all shapes within tree nodes for which the tree node */ +/* bounding box overlaps the search box. The return value is */ +/* an array of shapeids terminated by a -1. The shapeids will */ +/* be in order, as hopefully this will result in faster (more */ +/* sequential) reading from the file. */ +/************************************************************************/ + +/* helper for qsort */ +static int +compare_ints( const void * a, const void * b) +{ + return (*(int*)a) - (*(int*)b); +} + +int SHPAPI_CALL1(*) +SHPTreeFindLikelyShapes( SHPTree * hTree, + double * padfBoundsMin, double * padfBoundsMax, + int * pnShapeCount ) + +{ + int *panShapeList=NULL, nMaxShapes = 0; + +/* -------------------------------------------------------------------- */ +/* Perform the search by recursive descent. */ +/* -------------------------------------------------------------------- */ + *pnShapeCount = 0; + + SHPTreeCollectShapeIds( hTree, hTree->psRoot, + padfBoundsMin, padfBoundsMax, + pnShapeCount, &nMaxShapes, + &panShapeList ); + +/* -------------------------------------------------------------------- */ +/* Sort the id array */ +/* -------------------------------------------------------------------- */ + + if( panShapeList != NULL ) + qsort(panShapeList, *pnShapeCount, sizeof(int), compare_ints); + + return panShapeList; +} + +/************************************************************************/ +/* SHPTreeNodeTrim() */ +/* */ +/* This is the recursive version of SHPTreeTrimExtraNodes() that */ +/* walks the tree cleaning it up. */ +/************************************************************************/ + +static int SHPTreeNodeTrim( SHPTreeNode * psTreeNode ) + +{ + int i; + +/* -------------------------------------------------------------------- */ +/* Trim subtrees, and free subnodes that come back empty. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < psTreeNode->nSubNodes; i++ ) + { + if( SHPTreeNodeTrim( psTreeNode->apsSubNode[i] ) ) + { + SHPDestroyTreeNode( psTreeNode->apsSubNode[i] ); + + psTreeNode->apsSubNode[i] = + psTreeNode->apsSubNode[psTreeNode->nSubNodes-1]; + + psTreeNode->nSubNodes--; + + i--; /* process the new occupant of this subnode entry */ + } + } + +/* -------------------------------------------------------------------- */ +/* If the current node has 1 subnode and no shapes, promote that */ +/* subnode to the current node position. */ +/* -------------------------------------------------------------------- */ + if( psTreeNode->nSubNodes == 1 && psTreeNode->nShapeCount == 0) + { + SHPTreeNode* psSubNode = psTreeNode->apsSubNode[0]; + + memcpy(psTreeNode->adfBoundsMin, psSubNode->adfBoundsMin, + sizeof(psSubNode->adfBoundsMin)); + memcpy(psTreeNode->adfBoundsMax, psSubNode->adfBoundsMax, + sizeof(psSubNode->adfBoundsMax)); + psTreeNode->nShapeCount = psSubNode->nShapeCount; + assert(psTreeNode->panShapeIds == NULL); + psTreeNode->panShapeIds = psSubNode->panShapeIds; + assert(psTreeNode->papsShapeObj == NULL); + psTreeNode->papsShapeObj = psSubNode->papsShapeObj; + psTreeNode->nSubNodes = psSubNode->nSubNodes; + for( i = 0; i < psSubNode->nSubNodes; i++ ) + psTreeNode->apsSubNode[i] = psSubNode->apsSubNode[i]; + free(psSubNode); + } + +/* -------------------------------------------------------------------- */ +/* We should be trimmed if we have no subnodes, and no shapes. */ +/* -------------------------------------------------------------------- */ + return( psTreeNode->nSubNodes == 0 && psTreeNode->nShapeCount == 0 ); +} + +/************************************************************************/ +/* SHPTreeTrimExtraNodes() */ +/* */ +/* Trim empty nodes from the tree. Note that we never trim an */ +/* empty root node. */ +/************************************************************************/ + +void SHPAPI_CALL +SHPTreeTrimExtraNodes( SHPTree * hTree ) + +{ + SHPTreeNodeTrim( hTree->psRoot ); +} + +/************************************************************************/ +/* SwapWord() */ +/* */ +/* Swap a 2, 4 or 8 byte word. */ +/************************************************************************/ + +static void SwapWord( int length, void * wordP ) + +{ + int i; + unsigned char temp; + + for( i=0; i < length/2; i++ ) + { + temp = ((unsigned char *) wordP)[i]; + ((unsigned char *)wordP)[i] = ((unsigned char *) wordP)[length-i-1]; + ((unsigned char *) wordP)[length-i-1] = temp; + } +} + + +struct SHPDiskTreeInfo +{ + SAHooks sHooks; + SAFile fpQIX; +}; + +/************************************************************************/ +/* SHPOpenDiskTree() */ +/************************************************************************/ + +SHPTreeDiskHandle SHPOpenDiskTree( const char* pszQIXFilename, + SAHooks *psHooks ) +{ + SHPTreeDiskHandle hDiskTree; + + hDiskTree = (SHPTreeDiskHandle) calloc(sizeof(struct SHPDiskTreeInfo),1); + + if (psHooks == NULL) + SASetupDefaultHooks( &(hDiskTree->sHooks) ); + else + memcpy( &(hDiskTree->sHooks), psHooks, sizeof(SAHooks) ); + + hDiskTree->fpQIX = hDiskTree->sHooks.FOpen(pszQIXFilename, "rb"); + if (hDiskTree->fpQIX == NULL) + { + free(hDiskTree); + return NULL; + } + + return hDiskTree; +} + +/***********************************************************************/ +/* SHPCloseDiskTree() */ +/************************************************************************/ + +void SHPCloseDiskTree( SHPTreeDiskHandle hDiskTree ) +{ + if (hDiskTree == NULL) + return; + + hDiskTree->sHooks.FClose(hDiskTree->fpQIX); + free(hDiskTree); +} + +/************************************************************************/ +/* SHPSearchDiskTreeNode() */ +/************************************************************************/ + +static int +SHPSearchDiskTreeNode( SHPTreeDiskHandle hDiskTree, double *padfBoundsMin, double *padfBoundsMax, + int **ppanResultBuffer, int *pnBufferMax, + int *pnResultCount, int bNeedSwap, int nRecLevel ) + +{ + unsigned int i; + unsigned int offset; + unsigned int numshapes, numsubnodes; + double adfNodeBoundsMin[2], adfNodeBoundsMax[2]; + int nFReadAcc; + +/* -------------------------------------------------------------------- */ +/* Read and unswap first part of node info. */ +/* -------------------------------------------------------------------- */ + nFReadAcc = (int)hDiskTree->sHooks.FRead( &offset, 4, 1, hDiskTree->fpQIX ); + if ( bNeedSwap ) SwapWord ( 4, &offset ); + + nFReadAcc += (int)hDiskTree->sHooks.FRead( adfNodeBoundsMin, sizeof(double), 2, hDiskTree->fpQIX ); + nFReadAcc += (int)hDiskTree->sHooks.FRead( adfNodeBoundsMax, sizeof(double), 2, hDiskTree->fpQIX ); + if ( bNeedSwap ) + { + SwapWord( 8, adfNodeBoundsMin + 0 ); + SwapWord( 8, adfNodeBoundsMin + 1 ); + SwapWord( 8, adfNodeBoundsMax + 0 ); + SwapWord( 8, adfNodeBoundsMax + 1 ); + } + + nFReadAcc += (int)hDiskTree->sHooks.FRead( &numshapes, 4, 1, hDiskTree->fpQIX ); + if ( bNeedSwap ) SwapWord ( 4, &numshapes ); + + /* Check that we could read all previous values */ + if( nFReadAcc != 1 + 2 + 2 + 1 ) + { + hDiskTree->sHooks.Error("I/O error"); + return FALSE; + } + + /* Sanity checks to avoid int overflows in later computation */ + if( offset > INT_MAX - sizeof(int) ) + { + hDiskTree->sHooks.Error("Invalid value for offset"); + return FALSE; + } + + if( numshapes > (INT_MAX - offset - sizeof(int)) / sizeof(int) || + numshapes > INT_MAX / sizeof(int) - *pnResultCount ) + { + hDiskTree->sHooks.Error("Invalid value for numshapes"); + return FALSE; + } + +/* -------------------------------------------------------------------- */ +/* If we don't overlap this node at all, we can just fseek() */ +/* pass this node info and all subnodes. */ +/* -------------------------------------------------------------------- */ + if( !SHPCheckBoundsOverlap( adfNodeBoundsMin, adfNodeBoundsMax, + padfBoundsMin, padfBoundsMax, 2 ) ) + { + offset += numshapes*sizeof(int) + sizeof(int); + hDiskTree->sHooks.FSeek(hDiskTree->fpQIX, offset, SEEK_CUR); + return TRUE; + } + +/* -------------------------------------------------------------------- */ +/* Add all the shapeids at this node to our list. */ +/* -------------------------------------------------------------------- */ + if(numshapes > 0) + { + if( *pnResultCount + numshapes > (unsigned int)*pnBufferMax ) + { + int* pNewBuffer; + + *pnBufferMax = (*pnResultCount + numshapes + 100) * 5 / 4; + + if( (size_t)*pnBufferMax > INT_MAX / sizeof(int) ) + *pnBufferMax = *pnResultCount + numshapes; + + pNewBuffer = (int *) + SfRealloc( *ppanResultBuffer, *pnBufferMax * sizeof(int) ); + + if( pNewBuffer == NULL ) + { + hDiskTree->sHooks.Error("Out of memory error"); + return FALSE; + } + + *ppanResultBuffer = pNewBuffer; + } + + if( hDiskTree->sHooks.FRead( *ppanResultBuffer + *pnResultCount, + sizeof(int), numshapes, hDiskTree->fpQIX ) != numshapes ) + { + hDiskTree->sHooks.Error("I/O error"); + return FALSE; + } + + if (bNeedSwap ) + { + for( i=0; isHooks.FRead( &numsubnodes, 4, 1, hDiskTree->fpQIX ) != 1 ) + { + hDiskTree->sHooks.Error("I/O error"); + return FALSE; + } + if ( bNeedSwap ) SwapWord ( 4, &numsubnodes ); + if( numsubnodes > 0 && nRecLevel == 32 ) + { + hDiskTree->sHooks.Error("Shape tree is too deep"); + return FALSE; + } + + for(i=0; isHooks.FSeek( hDiskTree->fpQIX, 0, SEEK_SET ); + hDiskTree->sHooks.FRead( abyBuf, 16, 1, hDiskTree->fpQIX ); + + if( memcmp( abyBuf, "SQT", 3 ) != 0 ) + return NULL; + + if( (abyBuf[3] == 2 && bBigEndian) + || (abyBuf[3] == 1 && !bBigEndian) ) + bNeedSwap = FALSE; + else + bNeedSwap = TRUE; + +/* -------------------------------------------------------------------- */ +/* Search through root node and it's descendants. */ +/* -------------------------------------------------------------------- */ + if( !SHPSearchDiskTreeNode( hDiskTree, padfBoundsMin, padfBoundsMax, + &panResultBuffer, &nBufferMax, + pnShapeCount, bNeedSwap, 0 ) ) + { + if( panResultBuffer != NULL ) + free( panResultBuffer ); + *pnShapeCount = 0; + return NULL; + } +/* -------------------------------------------------------------------- */ +/* Sort the id array */ +/* -------------------------------------------------------------------- */ + + /* To distinguish between empty intersection from error case */ + if( panResultBuffer == NULL ) + panResultBuffer = (int*) calloc(1, sizeof(int)); + else + qsort(panResultBuffer, *pnShapeCount, sizeof(int), compare_ints); + + + return panResultBuffer; +} + +/************************************************************************/ +/* SHPGetSubNodeOffset() */ +/* */ +/* Determine how big all the subnodes of this node (and their */ +/* children) will be. This will allow disk based searchers to */ +/* seek past them all efficiently. */ +/************************************************************************/ + +static int SHPGetSubNodeOffset( SHPTreeNode *node) +{ + int i; + int offset=0; + + for(i=0; inSubNodes; i++ ) + { + if(node->apsSubNode[i]) + { + offset += 4*sizeof(double) + + (node->apsSubNode[i]->nShapeCount+3)*sizeof(int); + offset += SHPGetSubNodeOffset(node->apsSubNode[i]); + } + } + + return(offset); +} + +/************************************************************************/ +/* SHPWriteTreeNode() */ +/************************************************************************/ + +static void SHPWriteTreeNode( SAFile fp, SHPTreeNode *node, SAHooks* psHooks) +{ + int i,j; + int offset; + unsigned char *pabyRec = NULL; + assert( NULL != node ); + + offset = SHPGetSubNodeOffset(node); + + pabyRec = (unsigned char *) + malloc(sizeof(double) * 4 + + (3 * sizeof(int)) + (node->nShapeCount * sizeof(int)) ); + if( NULL == pabyRec ) + { +#ifdef USE_CPL + CPLError( CE_Fatal, CPLE_OutOfMemory, "Memory allocation failure"); +#endif + assert( 0 ); + return; + } + + memcpy( pabyRec, &offset, 4); + + /* minx, miny, maxx, maxy */ + memcpy( pabyRec+ 4, node->adfBoundsMin+0, sizeof(double) ); + memcpy( pabyRec+12, node->adfBoundsMin+1, sizeof(double) ); + memcpy( pabyRec+20, node->adfBoundsMax+0, sizeof(double) ); + memcpy( pabyRec+28, node->adfBoundsMax+1, sizeof(double) ); + + memcpy( pabyRec+36, &node->nShapeCount, 4); + j = node->nShapeCount * sizeof(int); + if( j ) + memcpy( pabyRec+40, node->panShapeIds, j); + memcpy( pabyRec+j+40, &node->nSubNodes, 4); + + psHooks->FWrite( pabyRec, 44+j, 1, fp ); + free (pabyRec); + + for(i=0; inSubNodes; i++ ) + { + if(node->apsSubNode[i]) + SHPWriteTreeNode( fp, node->apsSubNode[i], psHooks); + } +} + +/************************************************************************/ +/* SHPWriteTree() */ +/************************************************************************/ + +int SHPAPI_CALL SHPWriteTree(SHPTree *tree, const char *filename ) +{ + SAHooks sHooks; + + SASetupDefaultHooks( &sHooks ); + + return SHPWriteTreeLL(tree, filename, &sHooks); +} + +/************************************************************************/ +/* SHPWriteTreeLL() */ +/************************************************************************/ + +int SHPWriteTreeLL(SHPTree *tree, const char *filename, SAHooks* psHooks ) +{ + char signature[4] = "SQT"; + int i; + char abyBuf[32]; + SAFile fp; + + SAHooks sHooks; + if (psHooks == NULL) + { + SASetupDefaultHooks( &sHooks ); + psHooks = &sHooks; + } + +/* -------------------------------------------------------------------- */ +/* Open the output file. */ +/* -------------------------------------------------------------------- */ + fp = psHooks->FOpen(filename, "wb"); + if( fp == NULL ) + { + return FALSE; + } + +/* -------------------------------------------------------------------- */ +/* Establish the byte order on this machine. */ +/* -------------------------------------------------------------------- */ + i = 1; + if( *((unsigned char *) &i) == 1 ) + bBigEndian = FALSE; + else + bBigEndian = TRUE; + +/* -------------------------------------------------------------------- */ +/* Write the header. */ +/* -------------------------------------------------------------------- */ + memcpy( abyBuf+0, signature, 3 ); + + if( bBigEndian ) + abyBuf[3] = 2; /* New MSB */ + else + abyBuf[3] = 1; /* New LSB */ + + abyBuf[4] = 1; /* version */ + abyBuf[5] = 0; /* next 3 reserved */ + abyBuf[6] = 0; + abyBuf[7] = 0; + + psHooks->FWrite( abyBuf, 8, 1, fp ); + + psHooks->FWrite( &(tree->nTotalCount), 4, 1, fp ); + + /* write maxdepth */ + + psHooks->FWrite( &(tree->nMaxDepth), 4, 1, fp ); + +/* -------------------------------------------------------------------- */ +/* Write all the nodes "in order". */ +/* -------------------------------------------------------------------- */ + + SHPWriteTreeNode( fp, tree->psRoot, psHooks ); + + psHooks->FClose( fp ); + + return TRUE; +} diff --git a/libs/shapelib/shptreedump.c b/libs/shapelib/shptreedump.c new file mode 100644 index 0000000..bc72569 --- /dev/null +++ b/libs/shapelib/shptreedump.c @@ -0,0 +1,466 @@ +/****************************************************************************** + * $Id: shptreedump.c,v 1.9 2016-12-05 12:44:06 erouault Exp $ + * + * Project: Shapelib + * Purpose: Mainline for creating and dumping an ASCII representation of + * a quadtree. + * Author: Frank Warmerdam, warmerdam@pobox.com + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * $Log: shptreedump.c,v $ + * Revision 1.9 2016-12-05 12:44:06 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.8 2005-01-03 22:30:13 fwarmerdam + * added support for saved quadtrees + * + * Revision 1.7 2002/04/10 16:59:12 warmerda + * fixed email + * + * Revision 1.6 1999/11/05 14:12:05 warmerda + * updated license terms + * + * Revision 1.5 1999/06/02 18:24:21 warmerda + * added trimming code + * + * Revision 1.4 1999/06/02 17:56:12 warmerda + * added quad'' subnode support for trees + * + * Revision 1.3 1999/05/18 19:13:13 warmerda + * Use fabs() instead of abs(). + * + * Revision 1.2 1999/05/18 19:11:11 warmerda + * Added example searching capability + * + * Revision 1.1 1999/05/18 17:49:20 warmerda + * New + * + */ + +#include "shapefil.h" + +#include +#include +#include +#include + +SHP_CVSID("$Id: shptreedump.c,v 1.9 2016-12-05 12:44:06 erouault Exp $") + +static void SHPTreeNodeDump( SHPTree *, SHPTreeNode *, const char *, int ); +static void SHPTreeNodeSearchAndDump( SHPTree *, double *, double * ); + +/************************************************************************/ +/* Usage() */ +/************************************************************************/ + +static void Usage() + +{ + printf( "shptreedump [-maxdepth n] [-search xmin ymin xmax ymax]\n" + " [-v] [-o indexfilename] [-i indexfilename]\n" + " shp_file\n" ); + exit( 1 ); +} + + + +/************************************************************************/ +/* main() */ +/************************************************************************/ +int main( int argc, char ** argv ) + +{ + SHPHandle hSHP; + SHPTree *psTree; + int nExpandShapes = 0; + int nMaxDepth = 0; + int bDoSearch = 0; + double adfSearchMin[4], adfSearchMax[4]; + const char *pszOutputIndexFilename = NULL; + const char *pszInputIndexFilename = NULL; + const char *pszTargetFile = NULL; + +/* -------------------------------------------------------------------- */ +/* Consume flags. */ +/* -------------------------------------------------------------------- */ + while( argc > 1 ) + { + if( strcmp(argv[1],"-v") == 0 ) + { + nExpandShapes = 1; + argv++; + argc--; + } + else if( strcmp(argv[1],"-maxdepth") == 0 && argc > 2 ) + { + nMaxDepth = atoi(argv[2]); + argv += 2; + argc -= 2; + } + else if( strcmp(argv[1],"-o") == 0 && argc > 2 ) + { + pszOutputIndexFilename = argv[2]; + argv += 2; + argc -= 2; + } + else if( strcmp(argv[1],"-i") == 0 && argc > 2 ) + { + pszInputIndexFilename = argv[2]; + argv += 2; + argc -= 2; + } + else if( strcmp(argv[1],"-search") == 0 && argc > 5 ) + { + bDoSearch = 1; + + adfSearchMin[0] = atof(argv[2]); + adfSearchMin[1] = atof(argv[3]); + adfSearchMax[0] = atof(argv[4]); + adfSearchMax[1] = atof(argv[5]); + + adfSearchMin[2] = adfSearchMax[2] = 0.0; + adfSearchMin[3] = adfSearchMax[3] = 0.0; + + if( adfSearchMin[0] > adfSearchMax[0] + || adfSearchMin[1] > adfSearchMax[1] ) + { + printf( "Min greater than max in search criteria.\n" ); + Usage(); + } + + argv += 5; + argc -= 5; + } + else if( pszTargetFile == NULL ) + { + pszTargetFile = argv[1]; + argv++; + argc--; + } + else + { + printf( "Unrecognised argument: %s\n", argv[1] ); + Usage(); + } + } + +/* -------------------------------------------------------------------- */ +/* Do a search with an existing index file? */ +/* -------------------------------------------------------------------- */ + if( bDoSearch && pszInputIndexFilename != NULL ) + { + FILE *fp = fopen( pszInputIndexFilename, "rb" ); + int *panResult, nResultCount = 0, iResult; + + if( fp == NULL ) + { + perror( pszInputIndexFilename ); + exit( 1 ); + } + + panResult = SHPSearchDiskTree( fp, adfSearchMin, adfSearchMax, + &nResultCount ); + + printf( "Result: " ); + for( iResult = 0; iResult < nResultCount; iResult++ ) + printf( "%d ", panResult[iResult] ); + printf( "\n" ); + free( panResult ); + + fclose( fp ); + + exit( 0 ); + } + +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ + if( pszTargetFile == NULL ) + { + Usage(); + } + +/* -------------------------------------------------------------------- */ +/* Open the passed shapefile. */ +/* -------------------------------------------------------------------- */ + hSHP = SHPOpen( pszTargetFile, "rb" ); + + if( hSHP == NULL ) + { + printf( "Unable to open:%s\n", pszTargetFile ); + exit( 1 ); + } + +/* -------------------------------------------------------------------- */ +/* Build a quadtree structure for this file. */ +/* -------------------------------------------------------------------- */ + psTree = SHPCreateTree( hSHP, 2, nMaxDepth, NULL, NULL ); + +/* -------------------------------------------------------------------- */ +/* Trim unused nodes from the tree. */ +/* -------------------------------------------------------------------- */ + SHPTreeTrimExtraNodes( psTree ); + +/* -------------------------------------------------------------------- */ +/* Dump tree to .qix file. */ +/* -------------------------------------------------------------------- */ + if( pszOutputIndexFilename != NULL ) + { + SHPWriteTree( psTree, pszOutputIndexFilename ); + } + +/* -------------------------------------------------------------------- */ +/* Dump tree by recursive descent. */ +/* -------------------------------------------------------------------- */ + else if( !bDoSearch ) + SHPTreeNodeDump( psTree, psTree->psRoot, "", nExpandShapes ); + +/* -------------------------------------------------------------------- */ +/* or do a search instead. */ +/* -------------------------------------------------------------------- */ + else + SHPTreeNodeSearchAndDump( psTree, adfSearchMin, adfSearchMax ); + +/* -------------------------------------------------------------------- */ +/* cleanup */ +/* -------------------------------------------------------------------- */ + SHPDestroyTree( psTree ); + + SHPClose( hSHP ); + +#ifdef USE_DBMALLOC + malloc_dump(2); +#endif + + exit( 0 ); +} + +/************************************************************************/ +/* EmitCoordinate() */ +/************************************************************************/ + +static void EmitCoordinate( double * padfCoord, int nDimension ) + +{ + const char *pszFormat; + + if( fabs(padfCoord[0]) < 180 && fabs(padfCoord[1]) < 180 ) + pszFormat = "%.9f"; + else + pszFormat = "%.2f"; + + printf( pszFormat, padfCoord[0] ); + printf( "," ); + printf( pszFormat, padfCoord[1] ); + + if( nDimension > 2 ) + { + printf( "," ); + printf( pszFormat, padfCoord[2] ); + } + if( nDimension > 3 ) + { + printf( "," ); + printf( pszFormat, padfCoord[3] ); + } +} + +/************************************************************************/ +/* EmitShape() */ +/************************************************************************/ + +static void EmitShape( SHPObject * psObject, const char * pszPrefix, + int nDimension ) + +{ + int i; + + printf( "%s( Shape\n", pszPrefix ); + printf( "%s ShapeId = %d\n", pszPrefix, psObject->nShapeId ); + + printf( "%s Min = (", pszPrefix ); + EmitCoordinate( &(psObject->dfXMin), nDimension ); + printf( ")\n" ); + + printf( "%s Max = (", pszPrefix ); + EmitCoordinate( &(psObject->dfXMax), nDimension ); + printf( ")\n" ); + + for( i = 0; i < psObject->nVertices; i++ ) + { + double adfVertex[4]; + + printf( "%s Vertex[%d] = (", pszPrefix, i ); + + adfVertex[0] = psObject->padfX[i]; + adfVertex[1] = psObject->padfY[i]; + adfVertex[2] = psObject->padfZ[i]; + adfVertex[3] = psObject->padfM[i]; + + EmitCoordinate( adfVertex, nDimension ); + printf( ")\n" ); + } + printf( "%s)\n", pszPrefix ); +} + +/************************************************************************/ +/* SHPTreeNodeDump() */ +/* */ +/* Dump a tree node in a readable form. */ +/************************************************************************/ + +static void SHPTreeNodeDump( SHPTree * psTree, + SHPTreeNode * psTreeNode, + const char * pszPrefix, + int nExpandShapes ) + +{ + char szNextPrefix[150]; + int i; + + strcpy( szNextPrefix, pszPrefix ); + if( strlen(pszPrefix) < sizeof(szNextPrefix) - 3 ) + strcat( szNextPrefix, " " ); + + printf( "%s( SHPTreeNode\n", pszPrefix ); + +/* -------------------------------------------------------------------- */ +/* Emit the bounds. */ +/* -------------------------------------------------------------------- */ + printf( "%s Min = (", pszPrefix ); + EmitCoordinate( psTreeNode->adfBoundsMin, psTree->nDimension ); + printf( ")\n" ); + + printf( "%s Max = (", pszPrefix ); + EmitCoordinate( psTreeNode->adfBoundsMax, psTree->nDimension ); + printf( ")\n" ); + +/* -------------------------------------------------------------------- */ +/* Emit the list of shapes on this node. */ +/* -------------------------------------------------------------------- */ + if( nExpandShapes ) + { + printf( "%s Shapes(%d):\n", pszPrefix, psTreeNode->nShapeCount ); + for( i = 0; i < psTreeNode->nShapeCount; i++ ) + { + SHPObject *psObject; + + psObject = SHPReadObject( psTree->hSHP, + psTreeNode->panShapeIds[i] ); + assert( psObject != NULL ); + if( psObject != NULL ) + { + EmitShape( psObject, szNextPrefix, psTree->nDimension ); + } + + SHPDestroyObject( psObject ); + } + } + else + { + printf( "%s Shapes(%d): ", pszPrefix, psTreeNode->nShapeCount ); + for( i = 0; i < psTreeNode->nShapeCount; i++ ) + { + printf( "%d ", psTreeNode->panShapeIds[i] ); + } + printf( "\n" ); + } + +/* -------------------------------------------------------------------- */ +/* Emit subnodes. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < psTreeNode->nSubNodes; i++ ) + { + if( psTreeNode->apsSubNode[i] != NULL ) + SHPTreeNodeDump( psTree, psTreeNode->apsSubNode[i], + szNextPrefix, nExpandShapes ); + } + + printf( "%s)\n", pszPrefix ); + + return; +} + +/************************************************************************/ +/* SHPTreeNodeSearchAndDump() */ +/************************************************************************/ + +static void SHPTreeNodeSearchAndDump( SHPTree * hTree, + double *padfBoundsMin, + double *padfBoundsMax ) + +{ + int *panHits, nShapeCount, i; + +/* -------------------------------------------------------------------- */ +/* Perform the search for likely candidates. These are shapes */ +/* that fall into a tree node whose bounding box intersects our */ +/* area of interest. */ +/* -------------------------------------------------------------------- */ + panHits = SHPTreeFindLikelyShapes( hTree, padfBoundsMin, padfBoundsMax, + &nShapeCount ); + +/* -------------------------------------------------------------------- */ +/* Read all of these shapes, and establish whether the shape's */ +/* bounding box actually intersects the area of interest. Note */ +/* that the bounding box could intersect the area of interest, */ +/* and the shape itself still not cross it but we don't try to */ +/* address that here. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < nShapeCount; i++ ) + { + SHPObject *psObject; + + psObject = SHPReadObject( hTree->hSHP, panHits[i] ); + if( psObject == NULL ) + continue; + + if( !SHPCheckBoundsOverlap( padfBoundsMin, padfBoundsMax, + &(psObject->dfXMin), + &(psObject->dfXMax), + hTree->nDimension ) ) + { + printf( "Shape %d: not in area of interest, but fetched.\n", + panHits[i] ); + } + else + { + printf( "Shape %d: appears to be in area of interest.\n", + panHits[i] ); + } + + SHPDestroyObject( psObject ); + } + + if( nShapeCount == 0 ) + printf( "No shapes found in search.\n" ); +} diff --git a/libs/shapelib/shputils.c b/libs/shapelib/shputils.c new file mode 100644 index 0000000..248a2f1 --- /dev/null +++ b/libs/shapelib/shputils.c @@ -0,0 +1,1077 @@ +/****************************************************************************** + * $Id: shputils.c,v 1.11 2016-12-05 12:44:06 erouault Exp $ + * + * Project: Shapelib + * Purpose: + * Altered "shpdump" and "dbfdump" to allow two files to be appended. + * Other Functions: + * Selecting from the DBF before the write occurs. + * Change the UNITS between Feet and Meters and Shift X,Y. + * Clip and Erase boundary. The program only passes thru the + * data once. + * + * Bill Miller North Carolina - Department of Transporation + * Feb. 1997 -- bmiller@dot.state.nc.us + * There was not a lot of time to debug hidden problems; + * And the code is not very well organized or documented. + * The clip/erase function was not well tested. + * Oct. 2000 -- bmiller@dot.state.nc.us + * Fixed the problem when select is using numbers + * larger than short integer. It now reads long integer. + * NOTE: DBF files created using windows NT will read as a string with + * a length of 381 characters. This is a bug in "dbfopen". + * + * + * Author: Bill Miller (bmiller@dot.state.nc.us) + * + ****************************************************************************** + * Copyright (c) 1999, Frank Warmerdam + * + * This software is available under the following "MIT Style" license, + * or at the option of the licensee under the LGPL (see COPYING). This + * option is discussed in more detail in shapelib.html. + * + * -- + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + ****************************************************************************** + * + * $Log: shputils.c,v $ + * Revision 1.11 2016-12-05 12:44:06 erouault + * * Major overhaul of Makefile build system to use autoconf/automake. + * + * * Warning fixes in contrib/ + * + * Revision 1.10 2007-12-13 19:59:23 fwarmerdam + * reindent code, avoid some warnings. + * + * Revision 1.9 2004/01/14 14:56:00 fwarmerdam + * Some cleanlyness improvements. + * + * Revision 1.8 2004/01/14 14:40:22 fwarmerdam + * Fixed exit() call to include code. + * + * Revision 1.7 2003/02/25 17:20:22 warmerda + * Set psCShape to NULL after SHPDestroyObject() to avoid multi-frees of + * the same memory ... as submitted by Fred Fox. + * + * Revision 1.6 2001/08/28 13:57:14 warmerda + * fixed DBFAddField return value check + * + * Revision 1.5 2000/11/02 13:52:48 warmerda + * major upgrade from Bill Miller + * + * Revision 1.4 1999/11/05 14:12:05 warmerda + * updated license terms + * + * Revision 1.3 1998/12/03 15:47:39 warmerda + * Did a bunch of rewriting to make it work with the V1.2 API. + * + * Revision 1.2 1998/06/18 01:19:49 warmerda + * Made C++ compilable. + * + * Revision 1.1 1997/05/27 20:40:27 warmerda + * Initial revision + */ + +#include "shapefil.h" +#include "string.h" +#include + +SHP_CVSID("$Id: shputils.c,v 1.11 2016-12-05 12:44:06 erouault Exp $") + +#ifndef FALSE +# define FALSE 0 +# define TRUE 1 +#endif + +char infile[80], outfile[80], temp[400]; + +/* Variables for shape files */ +SHPHandle hSHP; +SHPHandle hSHPappend; +int nShapeType, nEntities, iPart; +int nShapeTypeAppend, nEntitiesAppend; +SHPObject *psCShape; +double adfBoundsMin[4], adfBoundsMax[4]; + + +/* Variables for DBF files */ +DBFHandle hDBF; +DBFHandle hDBFappend; + +DBFFieldType iType; +DBFFieldType jType; + +char iszTitle[12]; +char jszTitle[12]; + +int *pt; +char iszFormat[32], iszField[1024]; +char jszFormat[32], jszField[1024]; +int i, ti, iWidth, iDecimals, iRecord; +int j, tj, jWidth, jDecimals, jRecord; + + +int clip_boundary(); +double findunit(char *unit); +void openfiles(void); +void setext(char *pt, char *ext); +int strncasecmp2(char *s1, char *s2, int n); +void mergefields(void); +void findselect(void); +void showitems(void); +int selectrec(); +void check_theme_bnd(); +int clip_boundary(); +void error(); + + +/* -------------------------------------------------------------------- */ +/* Variables for the DESCRIBE function */ +/* -------------------------------------------------------------------- */ + int ilist = FALSE, iall = FALSE; +/* -------------------------------------------------------------------- */ +/* Variables for the SELECT function */ +/* -------------------------------------------------------------------- */ + int found = FALSE, newdbf = FALSE; + char selectitem[40], *cpt; + long int selectvalues[150], selcount=0; + int iselect = FALSE, iselectitem = -1; + int iunselect = FALSE; + +/* -------------------------------------------------------------------- */ +/* Variables for the CLIP and ERASE functions */ +/* -------------------------------------------------------------------- */ + double cxmin, cymin, cxmax, cymax; + int iclip = FALSE, ierase = FALSE; + int itouch = FALSE, iinside = FALSE, icut = FALSE; + int ibound = FALSE, ipoly = FALSE; + char clipfile[80]; + +/* -------------------------------------------------------------------- */ +/* Variables for the FACTOR function */ +/* -------------------------------------------------------------------- */ + double infactor,outfactor,factor = 0; /* NO FACTOR */ + int iunit = FALSE; + int ifactor = FALSE; + + +/* -------------------------------------------------------------------- */ +/* Variables for the SHIFT function */ +/* -------------------------------------------------------------------- */ + double xshift = 0, yshift = 0; /* NO SHIFT */ + +int main( int argc, char ** argv ) +{ + +/* -------------------------------------------------------------------- */ +/* Check command line usage. */ +/* -------------------------------------------------------------------- */ + if( argc < 2 ) error(); + strcpy(infile, argv[1]); + if (argc > 2) { + strcpy(outfile,argv[2]); + if (strncasecmp2(outfile, "LIST",0) == 0) { ilist = TRUE; } + if (strncasecmp2(outfile, "ALL",0) == 0) { iall = TRUE; } + } + if (ilist || iall || argc == 2 ) { + setext(infile, "shp"); + printf("DESCRIBE: %s\n",infile); + strcpy(outfile,""); + } +/* -------------------------------------------------------------------- */ +/* Look for other functions on the command line. (SELECT, UNIT) */ +/* -------------------------------------------------------------------- */ + for (i = 3; i < argc; i++) + { + if ((strncasecmp2(argv[i], "SEL",3) == 0) || + (strncasecmp2(argv[i], "UNSEL",5) == 0)) + { + if (strncasecmp2(argv[i], "UNSEL",5) == 0) iunselect=TRUE; + i++; + if (i >= argc) error(); + strcpy(selectitem,argv[i]); + i++; + if (i >= argc) error(); + selcount=0; + strcpy(temp,argv[i]); + cpt=temp; + tj = atoi(cpt); + ti = 0; + while (tj>0) { + selectvalues[selcount] = tj; + while( *cpt >= '0' && *cpt <= '9') + cpt++; + while( *cpt > '\0' && (*cpt < '0' || *cpt > '9') ) + cpt++; + tj=atoi(cpt); + selcount++; + } + iselect=TRUE; + } /*** End SEL & UNSEL ***/ + else + if ((strncasecmp2(argv[i], "CLIP",4) == 0) || + (strncasecmp2(argv[i], "ERASE",5) == 0)) + { + if (strncasecmp2(argv[i], "ERASE",5) == 0) ierase=TRUE; + i++; + if (i >= argc) error(); + strcpy(clipfile,argv[i]); + sscanf(argv[i],"%lf",&cxmin); + i++; + if (i >= argc) error(); + if (strncasecmp2(argv[i], "BOUND",5) == 0) { + setext(clipfile, "shp"); + hSHP = SHPOpen( clipfile, "rb" ); + if( hSHP == NULL ) + { + printf( "ERROR: Unable to open the clip shape file:%s\n", clipfile ); + exit( 1 ); + } + SHPGetInfo( hSHPappend, NULL, NULL, + adfBoundsMin, adfBoundsMax ); + cxmin = adfBoundsMin[0]; + cymin = adfBoundsMin[1]; + cxmax = adfBoundsMax[0]; + cymax = adfBoundsMax[1]; + printf("Theme Clip Boundary: (%lf,%lf) - (%lf,%lf)\n", + cxmin, cymin, cxmax, cymax); + ibound=TRUE; + } else { /*** xmin,ymin,xmax,ymax ***/ + sscanf(argv[i],"%lf",&cymin); + i++; + if (i >= argc) error(); + sscanf(argv[i],"%lf",&cxmax); + i++; + if (i >= argc) error(); + sscanf(argv[i],"%lf",&cymax); + printf("Clip Box: (%lf,%lf) - (%lf,%lf)\n",cxmin, cymin, cxmax, cymax); + } + i++; + if (i >= argc) error(); + if (strncasecmp2(argv[i], "CUT",3) == 0) icut=TRUE; + else if (strncasecmp2(argv[i], "TOUCH",5) == 0) itouch=TRUE; + else if (strncasecmp2(argv[i], "INSIDE",6) == 0) iinside=TRUE; + else error(); + iclip=TRUE; + } /*** End CLIP & ERASE ***/ + else if (strncasecmp2(argv[i], "FACTOR",0) == 0) + { + i++; + if (i >= argc) error(); + infactor=findunit(argv[i]); + if (infactor == 0) error(); + iunit=TRUE; + i++; + if (i >= argc) error(); + outfactor=findunit(argv[i]); + if (outfactor == 0) + { + sscanf(argv[i],"%lf",&factor); + if (factor == 0) error(); + } + if (factor == 0) + { + if (infactor ==0) + { puts("ERROR: Input unit must be defined before output unit"); exit(1); } + factor=infactor/outfactor; + } + printf("Output file coordinate values will be factored by %lg\n",factor); + ifactor=(factor != 1); /* True if a valid factor */ + } /*** End FACTOR ***/ + else if (strncasecmp2(argv[i],"SHIFT",5) == 0) + { + i++; + if (i >= argc) error(); + sscanf(argv[i],"%lf",&xshift); + i++; + if (i >= argc) error(); + sscanf(argv[i],"%lf",&yshift); + iunit=TRUE; + printf("X Shift: %lg Y Shift: %lg\n",xshift,yshift); + } /*** End SHIFT ***/ + else { + printf("ERROR: Unknown function %s\n",argv[i]); error(); + } + } +/* -------------------------------------------------------------------- */ +/* If there is no data in this file let the user know. */ +/* -------------------------------------------------------------------- */ + openfiles(); /* Open the infile and the outfile for shape and dbf. */ + if( DBFGetFieldCount(hDBF) == 0 ) + { + puts( "There are no fields in this table!" ); + exit( 1 ); + } +/* -------------------------------------------------------------------- */ +/* Print out the file bounds. */ +/* -------------------------------------------------------------------- */ + iRecord = DBFGetRecordCount( hDBF ); + SHPGetInfo( hSHP, NULL, NULL, adfBoundsMin, adfBoundsMax ); + + printf( "Input Bounds: (%lg,%lg) - (%lg,%lg) Entities: %d DBF: %d\n", + adfBoundsMin[0], adfBoundsMin[1], + adfBoundsMax[0], adfBoundsMax[1], + nEntities, iRecord ); + + if (strcmp(outfile,"") == 0) /* Describe the shapefile; No other functions */ + { + ti = DBFGetFieldCount( hDBF ); + showitems(); + exit(0); + } + + if (iclip) check_theme_bnd(); + + jRecord = DBFGetRecordCount( hDBFappend ); + SHPGetInfo( hSHPappend, NULL, NULL, adfBoundsMin, adfBoundsMax ); + if (nEntitiesAppend == 0) + puts("New Output File\n"); + else + printf( "Append Bounds: (%lg,%lg)-(%lg,%lg) Entities: %d DBF: %d\n", + adfBoundsMin[0], adfBoundsMin[1], + adfBoundsMax[0], adfBoundsMax[1], + nEntitiesAppend, jRecord ); + +/* -------------------------------------------------------------------- */ +/* Find matching fields in the append file or add new items. */ +/* -------------------------------------------------------------------- */ + mergefields(); +/* -------------------------------------------------------------------- */ +/* Find selection field if needed. */ +/* -------------------------------------------------------------------- */ + if (iselect) findselect(); + +/* -------------------------------------------------------------------- */ +/* Read all the records */ +/* -------------------------------------------------------------------- */ + jRecord = DBFGetRecordCount( hDBFappend ); + for( iRecord = 0; iRecord < nEntities; iRecord++) /** DBFGetRecordCount(hDBF) **/ + { +/* -------------------------------------------------------------------- */ +/* SELECT for values if needed. (Can the record be skipped.) */ +/* -------------------------------------------------------------------- */ + if (iselect) + if (selectrec() == 0) goto SKIP_RECORD; /** SKIP RECORD **/ + +/* -------------------------------------------------------------------- */ +/* Read a Shape record */ +/* -------------------------------------------------------------------- */ + psCShape = SHPReadObject( hSHP, iRecord ); + +/* -------------------------------------------------------------------- */ +/* Clip coordinates of shapes if needed. */ +/* -------------------------------------------------------------------- */ + if (iclip) + if (clip_boundary() == 0) goto SKIP_RECORD; /** SKIP RECORD **/ + +/* -------------------------------------------------------------------- */ +/* Read a DBF record and copy each field. */ +/* -------------------------------------------------------------------- */ + for( i = 0; i < DBFGetFieldCount(hDBF); i++ ) + { +/* -------------------------------------------------------------------- */ +/* Store the record according to the type and formatting */ +/* information implicit in the DBF field description. */ +/* -------------------------------------------------------------------- */ + if (pt[i] > -1) /* if the current field exists in output file */ + { + switch( DBFGetFieldInfo( hDBF, i, NULL, &iWidth, &iDecimals ) ) + { + case FTString: + case FTLogical: + DBFWriteStringAttribute(hDBFappend, jRecord, pt[i], + (DBFReadStringAttribute( hDBF, iRecord, i )) ); + break; + + case FTInteger: + DBFWriteIntegerAttribute(hDBFappend, jRecord, pt[i], + (DBFReadIntegerAttribute( hDBF, iRecord, i )) ); + break; + + case FTDouble: + DBFWriteDoubleAttribute(hDBFappend, jRecord, pt[i], + (DBFReadDoubleAttribute( hDBF, iRecord, i )) ); + break; + + case FTInvalid: + break; + } + } + } + jRecord++; +/* -------------------------------------------------------------------- */ +/* Change FACTOR and SHIFT coordinates of shapes if needed. */ +/* -------------------------------------------------------------------- */ + if (iunit) + { + for( j = 0; j < psCShape->nVertices; j++ ) + { + psCShape->padfX[j] = psCShape->padfX[j] * factor + xshift; + psCShape->padfY[j] = psCShape->padfY[j] * factor + yshift; + } + } + +/* -------------------------------------------------------------------- */ +/* Write the Shape record after recomputing current extents. */ +/* -------------------------------------------------------------------- */ + SHPComputeExtents( psCShape ); + SHPWriteObject( hSHPappend, -1, psCShape ); + + SKIP_RECORD: + SHPDestroyObject( psCShape ); + psCShape = NULL; + j=0; + } + +/* -------------------------------------------------------------------- */ +/* Print out the # of Entities and the file bounds. */ +/* -------------------------------------------------------------------- */ + jRecord = DBFGetRecordCount( hDBFappend ); + SHPGetInfo( hSHPappend, &nEntitiesAppend, &nShapeTypeAppend, + adfBoundsMin, adfBoundsMax ); + + printf( "Output Bounds: (%lg,%lg) - (%lg,%lg) Entities: %d DBF: %d\n\n", + adfBoundsMin[0], adfBoundsMin[1], + adfBoundsMax[0], adfBoundsMax[1], + nEntitiesAppend, jRecord ); + +/* -------------------------------------------------------------------- */ +/* Close the both shapefiles. */ +/* -------------------------------------------------------------------- */ + SHPClose( hSHP ); + SHPClose( hSHPappend ); + DBFClose( hDBF ); + DBFClose( hDBFappend ); + if (nEntitiesAppend == 0) { + puts("Remove the output files."); + setext(outfile, "dbf"); + remove(outfile); + setext(outfile, "shp"); + remove(outfile); + setext(outfile, "shx"); + remove(outfile); + } + return( 0 ); +} + + +/************************************************************************/ +/* openfiles() */ +/************************************************************************/ + +void openfiles() { +/* -------------------------------------------------------------------- */ +/* Open the DBF file. */ +/* -------------------------------------------------------------------- */ + setext(infile, "dbf"); + hDBF = DBFOpen( infile, "rb" ); + if( hDBF == NULL ) + { + printf( "ERROR: Unable to open the input DBF:%s\n", infile ); + exit( 1 ); + } +/* -------------------------------------------------------------------- */ +/* Open the append DBF file. */ +/* -------------------------------------------------------------------- */ + if (strcmp(outfile,"")) { + setext(outfile, "dbf"); + hDBFappend = DBFOpen( outfile, "rb+" ); + newdbf=0; + if( hDBFappend == NULL ) + { + newdbf=1; + hDBFappend = DBFCreate( outfile ); + if( hDBFappend == NULL ) + { + printf( "ERROR: Unable to open the append DBF:%s\n", outfile ); + exit( 1 ); + } + } + } +/* -------------------------------------------------------------------- */ +/* Open the passed shapefile. */ +/* -------------------------------------------------------------------- */ + setext(infile, "shp"); + hSHP = SHPOpen( infile, "rb" ); + + if( hSHP == NULL ) + { + printf( "ERROR: Unable to open the input shape file:%s\n", infile ); + exit( 1 ); + } + + SHPGetInfo( hSHP, &nEntities, &nShapeType, NULL, NULL ); + +/* -------------------------------------------------------------------- */ +/* Open the passed append shapefile. */ +/* -------------------------------------------------------------------- */ + if (strcmp(outfile,"")) { + setext(outfile, "shp"); + hSHPappend = SHPOpen( outfile, "rb+" ); + + if( hSHPappend == NULL ) + { + hSHPappend = SHPCreate( outfile, nShapeType ); + if( hSHPappend == NULL ) + { + printf( "ERROR: Unable to open the append shape file:%s\n", + outfile ); + exit( 1 ); + } + } + SHPGetInfo( hSHPappend, &nEntitiesAppend, &nShapeTypeAppend, + NULL, NULL ); + + if (nShapeType != nShapeTypeAppend) + { + puts( "ERROR: Input and Append shape files are of different types."); + exit( 1 ); + } + } +} + +/* -------------------------------------------------------------------- */ +/* Change the extension. If there is any extension on the */ +/* filename, strip it off and add the new extension */ +/* -------------------------------------------------------------------- */ +void setext(char *pt, char *ext) +{ +int i; + for( i = strlen(pt)-1; + i > 0 && pt[i] != '.' && pt[i] != '/' && pt[i] != '\\'; + i-- ) {} + + if( pt[i] == '.' ) + pt[i] = '\0'; + + strcat(pt,"."); + strcat(pt,ext); +} + + + +/* -------------------------------------------------------------------- */ +/* Find matching fields in the append file. */ +/* Output file must have zero records to add any new fields. */ +/* -------------------------------------------------------------------- */ +void mergefields() +{ + int i,j; + ti = DBFGetFieldCount( hDBF ); + tj = DBFGetFieldCount( hDBFappend ); + /* Create a pointer array for the max # of fields in the output file */ + pt = (int *) malloc( (ti+tj+1) * sizeof(int) ); + + for( i = 0; i < ti; i++ ) + { + pt[i]= -1; /* Initial pt values to -1 */ + } + /* DBF must be empty before adding items */ + jRecord = DBFGetRecordCount( hDBFappend ); + for( i = 0; i < ti; i++ ) + { + iType = DBFGetFieldInfo( hDBF, i, iszTitle, &iWidth, &iDecimals ); + found=FALSE; + { + for( j = 0; j < tj; j++ ) /* Search all field names for a match */ + { + jType = DBFGetFieldInfo( hDBFappend, j, jszTitle, &jWidth, &jDecimals ); + if (iType == jType && (strcmp(iszTitle, jszTitle) == 0) ) + { + if (found || newdbf) + { + if (i == j) pt[i]=j; + printf("Warning: Duplicate field name found (%s)\n",iszTitle); + /* Duplicate field name + (Try to guess the correct field by position) */ + } + else + { + pt[i]=j; found=TRUE; + } + } + } + } + + if (pt[i] == -1 && (! found) ) /* Try to force into an existing field */ + { /* Ignore the field name, width, and decimal places */ + jType = DBFGetFieldInfo( hDBFappend, j, jszTitle, &jWidth, &jDecimals ); + if (iType == jType) + { + pt[i]=i; found=1; + } + } + if ( (! found) && jRecord == 0) /* Add missing field to the append table */ + { /* The output DBF must be is empty */ + pt[i]=tj; + tj++; + if( DBFAddField( hDBFappend, iszTitle, iType, iWidth, iDecimals ) + == -1 ) + { + printf( "Warning: DBFAddField(%s, TYPE:%d, WIDTH:%d DEC:%d, ITEM#:%d of %d) failed.\n", + iszTitle, iType, iWidth, iDecimals, (i+1), (ti+1) ); + pt[i]=-1; + } + } + } +} + + +void findselect() +{ + /* Find the select field name */ + iselectitem = -1; + for( i = 0; i < ti && iselectitem < 0; i++ ) + { + iType = DBFGetFieldInfo( hDBF, i, iszTitle, &iWidth, &iDecimals ); + if (strncasecmp2(iszTitle, selectitem, 0) == 0) iselectitem = i; + } + if (iselectitem == -1) + { + printf("Warning: Item not found for selection (%s)\n",selectitem); + iselect = FALSE; + iall = FALSE; + showitems(); + printf("Continued... (Selecting entire file)\n"); + } + /* Extract all of the select values (by field type) */ + +} + +void showitems() +{ + char stmp[40],slow[40],shigh[40]; + double dtmp,dlow,dhigh,dsum,mean; + long int itmp,ilow,ihigh,isum; + long int maxrec; + char *pt; + + printf("Available Items: (%d)",ti); + maxrec = DBFGetRecordCount(hDBF); + if (maxrec > 5000 && ! iall) + { maxrec=5000; printf(" ** ESTIMATED RANGES (MEAN) For more records use \"All\""); } + else { printf(" RANGES (MEAN)"); } + + for( i = 0; i < ti; i++ ) + { + switch( DBFGetFieldInfo( hDBF, i, iszTitle, &iWidth, &iDecimals ) ) + { + case FTString: + case FTLogical: + strcpy(slow, "~"); + strcpy(shigh,"\0"); + printf("\n String %3d %-16s",iWidth,iszTitle); + for( iRecord = 0; iRecord < maxrec; iRecord++ ) { + strncpy(stmp,DBFReadStringAttribute( hDBF, iRecord, i ),39); + if (strcmp(stmp,"!!") > 0) { + if (strncasecmp2(stmp,slow,0) < 0) strncpy(slow, stmp,39); + if (strncasecmp2(stmp,shigh,0) > 0) strncpy(shigh,stmp,39); + } + } + pt=slow+strlen(slow)-1; + while(*pt == ' ') { *pt='\0'; pt--; } + pt=shigh+strlen(shigh)-1; + while(*pt == ' ') { *pt='\0'; pt--; } + if (strncasecmp2(slow,shigh,0) < 0) printf("%s to %s",slow,shigh); + else if (strncasecmp2(slow,shigh,0) == 0) printf("= %s",slow); + else printf("No Values"); + break; + case FTInteger: + printf("\n Integer %3d %-16s",iWidth,iszTitle); + ilow = 1999999999; + ihigh= -1999999999; + isum = 0; + for( iRecord = 0; iRecord < maxrec; iRecord++ ) { + itmp = DBFReadIntegerAttribute( hDBF, iRecord, i ); + if (ilow > itmp) ilow = itmp; + if (ihigh < itmp) ihigh = itmp; + isum = isum + itmp; + } + mean=isum/maxrec; + if (ilow < ihigh) printf("%ld to %ld \t(%.1f)",ilow,ihigh,mean); + else if (ilow == ihigh) printf("= %ld",ilow); + else printf("No Values"); + break; + + case FTDouble: + printf("\n Real %3d,%d %-16s",iWidth,iDecimals,iszTitle); + dlow = 999999999999999.0; + dhigh= -999999999999999.0; + dsum = 0; + for( iRecord = 0; iRecord < maxrec; iRecord++ ) { + dtmp = DBFReadDoubleAttribute( hDBF, iRecord, i ); + if (dlow > dtmp) dlow = dtmp; + if (dhigh < dtmp) dhigh = dtmp; + dsum = dsum + dtmp; + } + mean=dsum/maxrec; + sprintf(stmp,"%%.%df to %%.%df \t(%%.%df)",iDecimals,iDecimals,iDecimals); + if (dlow < dhigh) printf(stmp,dlow,dhigh,mean); + else if (dlow == dhigh) { + sprintf(stmp,"= %%.%df",iDecimals); + printf(stmp,dlow); + } + else printf("No Values"); + break; + + case FTInvalid: + break; + + } + + } + printf("\n"); +} + +int selectrec() +{ + long int value, ty; + + ty = DBFGetFieldInfo( hDBF, iselectitem, NULL, &iWidth, &iDecimals); + switch(ty) + { + case FTString: + puts("Invalid Item"); + iselect=FALSE; + break; + case FTInteger: + value = DBFReadIntegerAttribute( hDBF, iRecord, iselectitem ); + for (j = 0; j= cxmin) && (adfBoundsMax[0] <= cxmax) && + (adfBoundsMin[1] >= cymin) && (adfBoundsMax[1] <= cymax) ) + { /** Theme is totally inside clip area **/ + if (ierase) nEntities=0; /** SKIP THEME **/ + else iclip=FALSE; /** WRITE THEME (Clip not needed) **/ + } + + if ( ( (adfBoundsMin[0] < cxmin) && (adfBoundsMax[0] < cxmin) ) || + ( (adfBoundsMin[1] < cymin) && (adfBoundsMax[1] < cymin) ) || + ( (adfBoundsMin[0] > cxmax) && (adfBoundsMax[0] > cxmax) ) || + ( (adfBoundsMin[1] > cymax) && (adfBoundsMax[1] > cymax) ) ) + { /** Theme is totally outside clip area **/ + if (ierase) iclip=FALSE; /** WRITE THEME (Clip not needed) **/ + else nEntities=0; /** SKIP THEME **/ + } + + if (nEntities == 0) + puts("WARNING: Theme is outside the clip area."); /** SKIP THEME **/ +} + +int clip_boundary() +{ + int inside; + int prev_outside; + int i2; + int j2; + + /*** FIRST check the boundary of the feature ***/ + if ( ( (psCShape->dfXMin < cxmin) && (psCShape->dfXMax < cxmin) ) || + ( (psCShape->dfYMin < cymin) && (psCShape->dfYMax < cymin) ) || + ( (psCShape->dfXMin > cxmax) && (psCShape->dfXMax > cxmax) ) || + ( (psCShape->dfYMin > cymax) && (psCShape->dfYMax > cymax) ) ) + { /** Feature is totally outside clip area **/ + if (ierase) return(1); /** WRITE RECORD **/ + else return(0); /** SKIP RECORD **/ + } + + if ( (psCShape->dfXMin >= cxmin) && (psCShape->dfXMax <= cxmax) && + (psCShape->dfYMin >= cymin) && (psCShape->dfYMax <= cymax) ) + { /** Feature is totally inside clip area **/ + if (ierase) return(0); /** SKIP RECORD **/ + else return(1); /** WRITE RECORD **/ + } + + if (iinside) + { /** INSIDE * Feature might touch the boundary or could be outside **/ + if (ierase) return(1); /** WRITE RECORD **/ + else return(0); /** SKIP RECORD **/ + } + + if (itouch) + { /** TOUCH **/ + if ( ( (psCShape->dfXMin <= cxmin) || (psCShape->dfXMax >= cxmax) ) && + (psCShape->dfYMin >= cymin) && (psCShape->dfYMax <= cymax) ) + { /** Feature intersects the clip boundary only on the X axis **/ + if (ierase) return(0); /** SKIP RECORD **/ + else return(1); /** WRITE RECORD **/ + } + + if ( (psCShape->dfXMin >= cxmin) && (psCShape->dfXMax <= cxmax) && + ( (psCShape->dfYMin <= cymin) || (psCShape->dfYMax >= cymax) ) ) + { /** Feature intersects the clip boundary only on the Y axis **/ + if (ierase) return(0); /** SKIP RECORD **/ + else return(1); /** WRITE RECORD **/ + } + + for( j2 = 0; j2 < psCShape->nVertices; j2++ ) + { /** At least one vertex must be inside the clip boundary **/ + if ( (psCShape->padfX[j2] >= cxmin && psCShape->padfX[j2] <= cxmax) || + (psCShape->padfY[j2] >= cymin && psCShape->padfY[j2] <= cymax) ) + { + if (ierase) return(0); /** SKIP RECORD **/ + else return(1); /** WRITE RECORD **/ + } + } + + /** All vertices are outside the clip boundary **/ + if (ierase) return(1); /** WRITE RECORD **/ + else return(0); /** SKIP RECORD **/ + } /** End TOUCH **/ + + if (icut) + { /** CUT **/ + /*** Check each vertex in the feature with the Boundary and "CUT" ***/ + /*** THIS CODE WAS NOT COMPLETED! READ NOTE AT THE BOTTOM ***/ + i2=0; + prev_outside=FALSE; + for( j2 = 0; j2 < psCShape->nVertices; j2++ ) + { + inside = psCShape->padfX[j2] >= cxmin && psCShape->padfX[j2] <= cxmax && + psCShape->padfY[j2] >= cymin && psCShape->padfY[j2] <= cymax ; + + if (ierase) inside=(! inside); + if (inside) + { + if (i2 != j2) + { + if (prev_outside) + { + /*** AddIntersection(i2); ***/ /*** Add intersection ***/ + prev_outside=FALSE; + } + psCShape->padfX[i2]=psCShape->padfX[j2]; /** move vertex **/ + psCShape->padfY[i2]=psCShape->padfY[j2]; + } + i2++; + } else { + if ( (! prev_outside) && (j2 > 0) ) + { + /*** AddIntersection(i2); ***//*** Add intersection (Watch out for j2==i2-1) ***/ + /*** Also a polygon may overlap twice and will split into a several parts ***/ + prev_outside=TRUE; + } + } + } + + printf("Vertices:%d OUT:%d Number of Parts:%d\n", + psCShape->nVertices,i2, psCShape->nParts ); + + psCShape->nVertices = i2; + + if (i2 < 2) return(0); /** SKIP RECORD **/ + /*** (WE ARE NOT CREATING INTERESECTIONS and some lines could be reduced to one point) **/ + + if (i2 == 0) return(0); /** SKIP RECORD **/ + else return(1); /** WRITE RECORD **/ + } /** End CUT **/ +} + + +/************************************************************************/ +/* strncasecmp2() */ +/* */ +/* Compare two strings up to n characters */ +/* If n=0 then s1 and s2 must be an exact match */ +/************************************************************************/ + +int strncasecmp2(char *s1, char *s2, int n) + +{ +int j,i; + if (n<1) n=strlen(s1)+1; + for (i=0; i= 'a' && *s1 <= 'z') { + j=*s1-32; + if (j != *s2) return(*s1-*s2); + } else { + if (*s1 >= 'A' && *s1 <= 'Z') { j=*s1+32; } + else { j=*s1; } + if (j != *s2) return(*s1-*s2); + } + } + s1++; + s2++; + } + return(0); +} + + +#define NKEYS (sizeof(unitkeytab) / sizeof(struct unitkey)) +double findunit(char *unit) + { + struct unitkey { + char *name; + double value; + } unitkeytab[] = { + "CM", 39.37, + "CENTIMETER", 39.37, + "CENTIMETERS", 39.37, /** # of inches * 100 in unit **/ + "METER", 3937, + "METERS", 3937, + "KM", 3937000, + "KILOMETER", 3937000, + "KILOMETERS", 3937000, + "INCH", 100, + "INCHES", 100, + "FEET", 1200, + "FOOT", 1200, + "YARD", 3600, + "YARDS", 3600, + "MILE", 6336000, + "MILES", 6336000 + }; + + double unitfactor=0; + for (j = 0; j < NKEYS; j++) { + if (strncasecmp2(unit, unitkeytab[j].name, 0) == 0) unitfactor=unitkeytab[j].value; + } + return(unitfactor); +} + +/* -------------------------------------------------------------------- */ +/* Display a usage message. */ +/* -------------------------------------------------------------------- */ +void error() +{ + puts( "The program will append to an existing shape file or it will" ); + puts( "create a new file if needed." ); + puts( "Only the items in the first output file will be preserved." ); + puts( "When an item does not match with the append theme then the item"); + puts( "might be placed to an existing item at the same position and type." ); + puts( " OTHER FUNCTIONS:" ); + puts( " - Describe all items in the dbase file (Use ALL for more than 5000 recs.)"); + puts( " - Select a group of shapes from a comma separated selection list."); + puts( " - UnSelect a group of shapes from a comma separated selection list."); + puts( " - Clip boundary extent or by theme boundary." ); + puts( " Touch writes all the shapes that touch the boundary."); + puts( " Inside writes all the shapes that are completely within the boundary."); + puts( " Boundary clips are only the min and max of a theme boundary." ); + puts( " - Erase boundary extent or by theme boundary." ); + puts( " Erase is the direct opposite of the Clip function." ); + puts( " - Change coordinate value units between meters and feet."); + puts( " There is no way to determine the input unit of a shape file."); + puts( " Skip this function if the shape file is already in the correct unit."); + puts( " Clip and Erase will be done before the unit is changed."); + puts( " A shift will be done after the unit is changed."); + puts( " - Shift X and Y coordinates.\n" ); + puts( "Finally, There can only be one select or unselect in the command line."); + puts( " There can only be one clip or erase in the command line."); + puts( " There can only be one unit and only one shift in the command line.\n"); + puts( "Ex: shputils in.shp out.shp SELECT countycode 3,5,9,13,17,27"); + puts( " shputils in.shp out.shp CLIP 10 10 90 90 Touch FACTOR Meter Feet"); + puts( " shputils in.shp out.shp FACTOR Meter 3.0"); + puts( " shputils in.shp out.shp CLIP clip.shp Boundary Touch SHIFT 40 40"); + puts( " shputils in.shp out.shp SELECT co 112 CLIP clip.shp Boundary Touch\n"); + puts( "USAGE: shputils {ALL}"); + puts( "USAGE: shputils " ); + puts( " { }" ); + puts( " { }" ); + puts( " { }" ); + puts( " { }" ); + puts( " { }" ); + puts( " Note: CUT is not complete and does not create intersections."); + puts( " For more information read programmer comment."); + + /**** Clip functions for Polygon and Cut is not supported + There are several web pages that describe methods of doing this function. + It seem easy to impliment until you start writting code. I don't have the + time to add these functions but a did leave a simple cut routine in the + program that can be called by using CUT instead of TOUCH in the + CLIP or ERASE functions. It does not add the intersection of the line and + the clip box, so polygons could look incomplete and lines will come up short. + + Information about clipping lines with a box: + http://www.csclub.uwaterloo.ca/u/mpslager/articles/sutherland/wr.html + Information about finding the intersection of two lines: + http://www.whisqu.se/per/docs/math28.htm + + THE CODE LOOKS LIKE THIS: + ******************************************************** + void Intersect_Lines(float x0,float y0,float x1,float y1, + float x2,float y2,float x3,float y3, + float *xi,float *yi) + { +// this function computes the intersection of the sent lines +// and returns the intersection point, note that the function assumes +// the lines intersect. the function can handle vertical as well +// as horizontal lines. note the function isn't very clever, it simply +// applies the math, but we don't need speed since this is a +// pre-processing step +// The Intersect_lines program came from (http://www.whisqu.se/per/docs/math28.htm) + +float a1,b1,c1, // constants of linear equations +a2,b2,c2, +det_inv, // the inverse of the determinant of the coefficientmatrix +m1,m2; // the slopes of each line + +// compute slopes, note the cludge for infinity, however, this will +// be close enough +if ((x1-x0)!=0) +m1 = (y1-y0)/(x1-x0); +else +m1 = (float)1e+10; // close enough to infinity + + +if ((x3-x2)!=0) +m2 = (y3-y2)/(x3-x2); +else +m2 = (float)1e+10; // close enough to infinity + +// compute constants +a1 = m1; +a2 = m2; +b1 = -1; +b2 = -1; +c1 = (y0-m1*x0); +c2 = (y2-m2*x2); +// compute the inverse of the determinate +det_inv = 1/(a1*b2 - a2*b1); +// use Kramers rule to compute xi and yi +*xi=((b1*c2 - b2*c1)*det_inv); +*yi=((a2*c1 - a1*c2)*det_inv); +} // end Intersect_Lines + **********************************************************/ + + exit( 1 ); +} diff --git a/libs/shapelib/test-driver b/libs/shapelib/test-driver new file mode 100755 index 0000000..8e575b0 --- /dev/null +++ b/libs/shapelib/test-driver @@ -0,0 +1,148 @@ +#! /bin/sh +# test-driver - basic testsuite driver script. + +scriptversion=2013-07-13.22; # UTC + +# Copyright (C) 2011-2014 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +# Make unconditional expansion of undefined variables an error. This +# helps a lot in preventing typo-related bugs. +set -u + +usage_error () +{ + echo "$0: $*" >&2 + print_usage >&2 + exit 2 +} + +print_usage () +{ + cat <$log_file 2>&1 +estatus=$? + +if test $enable_hard_errors = no && test $estatus -eq 99; then + tweaked_estatus=1 +else + tweaked_estatus=$estatus +fi + +case $tweaked_estatus:$expect_failure in + 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; + 0:*) col=$grn res=PASS recheck=no gcopy=no;; + 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; + 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; + *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; + *:*) col=$red res=FAIL recheck=yes gcopy=yes;; +esac + +# Report the test outcome and exit status in the logs, so that one can +# know whether the test passed or failed simply by looking at the '.log' +# file, without the need of also peaking into the corresponding '.trs' +# file (automake bug#11814). +echo "$res $test_name (exit status: $estatus)" >>$log_file + +# Report outcome to console. +echo "${col}${res}${std}: $test_name" + +# Register the test result, and other relevant metadata. +echo ":test-result: $res" > $trs_file +echo ":global-test-result: $res" >> $trs_file +echo ":recheck: $recheck" >> $trs_file +echo ":copy-in-global-log: $gcopy" >> $trs_file + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/libs/shapelib/tests/stream1.out b/libs/shapelib/tests/stream1.out new file mode 100644 index 0000000..de59c44 --- /dev/null +++ b/libs/shapelib/tests/stream1.out @@ -0,0 +1,1465 @@ +------------------------------------------------------------------------- +Test 1: dump anno.shp +------------------------------------------------------------------------- +Shapefile Type: Polygon # of Shapes: 201 + +File Bounds: ( 471276.281, 4751595.500,0,0) + to ( 492683.536, 4765390.413,0,0) + +Shape:0 (Polygon) nVertices=5, nParts=1 + Bounds:( 486019.130, 4764549.500, 0, 0) + to ( 486356.183, 4765212.744, 0, 0) + ( 486089.531, 4764549.500, 0, 0) Ring + ( 486019.130, 4764579.128, 0, 0) + ( 486285.782, 4765212.744, 0, 0) + ( 486356.183, 4765183.116, 0, 0) + ( 486089.531, 4764549.500, 0, 0) + +Shape:1 (Polygon) nVertices=5, nParts=1 + Bounds:( 484948.275, 4763866.500, 0, 0) + to ( 485333.012, 4764070.376, 0, 0) + ( 484974.719, 4763866.500, 0, 0) Ring + ( 484948.275, 4763938.159, 0, 0) + ( 485306.569, 4764070.376, 0, 0) + ( 485333.012, 4763998.717, 0, 0) + ( 484974.719, 4763866.500, 0, 0) + +Shape:2 (Polygon) nVertices=5, nParts=1 + Bounds:( 485577.021, 4764106.500, 0, 0) + to ( 485818.355, 4764259.305, 0, 0) + ( 485604.156, 4764106.500, 0, 0) Ring + ( 485577.021, 4764177.900, 0, 0) + ( 485791.220, 4764259.305, 0, 0) + ( 485818.355, 4764187.906, 0, 0) + ( 485604.156, 4764106.500, 0, 0) + +Shape:3 (Polygon) nVertices=5, nParts=1 + Bounds:( 484861.500, 4762570.513, 0, 0) + to ( 485092.062, 4763026.856, 0, 0) + ( 485092.062, 4762597.000, 0, 0) Ring + ( 485020.420, 4762570.513, 0, 0) + ( 484861.500, 4763000.370, 0, 0) + ( 484933.143, 4763026.856, 0, 0) + ( 485092.062, 4762597.000, 0, 0) + +Shape:4 (Polygon) nVertices=5, nParts=1 + Bounds:( 484452.624, 4763792.614, 0, 0) + to ( 484628.031, 4764105.947, 0, 0) + ( 484628.031, 4763818.500, 0, 0) Ring + ( 484556.169, 4763792.614, 0, 0) + ( 484452.624, 4764080.061, 0, 0) + ( 484524.486, 4764105.947, 0, 0) + ( 484628.031, 4763818.500, 0, 0) + +Shape:5 (Polygon) nVertices=5, nParts=1 + Bounds:( 484355.352, 4764139.435, 0, 0) + to ( 484505.344, 4764380.892, 0, 0) + ( 484505.344, 4764165.500, 0, 0) Ring + ( 484433.546, 4764139.435, 0, 0) + ( 484355.352, 4764354.827, 0, 0) + ( 484427.150, 4764380.892, 0, 0) + ( 484505.344, 4764165.500, 0, 0) + +Shape:6 (Polygon) nVertices=9, nParts=1 + Bounds:( 484548.866, 4763118.531, 0, 0) + to ( 484772.062, 4763742.258, 0, 0) + ( 484772.062, 4763152.000, 0, 0) Ring + ( 484703.404, 4763118.531, 0, 0) + ( 484605.763, 4763318.832, 0, 0) + ( 484548.866, 4763471.149, 0, 0) + ( 484603.088, 4763742.258, 0, 0) + ( 484677.987, 4763727.278, 0, 0) + ( 484628.031, 4763477.500, 0, 0) + ( 484676.031, 4763349.000, 0, 0) + ( 484772.062, 4763152.000, 0, 0) + +Shape:7 (Polygon) nVertices=5, nParts=1 + Bounds:( 484671.739, 4763562.500, 0, 0) + to ( 484911.415, 4763682.338, 0, 0) + ( 484686.719, 4763562.500, 0, 0) Ring + ( 484671.739, 4763637.399, 0, 0) + ( 484896.435, 4763682.338, 0, 0) + ( 484911.415, 4763607.439, 0, 0) + ( 484686.719, 4763562.500, 0, 0) + +Shape:8 (Polygon) nVertices=5, nParts=1 + Bounds:( 484930.172, 4763125.500, 0, 0) + to ( 485596.342, 4763453.269, 0, 0) + ( 484958.719, 4763125.500, 0, 0) Ring + ( 484930.172, 4763196.347, 0, 0) + ( 485567.795, 4763453.269, 0, 0) + ( 485596.342, 4763382.423, 0, 0) + ( 484958.719, 4763125.500, 0, 0) + +Shape:9 (Polygon) nVertices=5, nParts=1 + Bounds:( 485102.757, 4763082.500, 0, 0) + to ( 485344.154, 4763234.029, 0, 0) + ( 485129.406, 4763082.500, 0, 0) Ring + ( 485102.757, 4763154.083, 0, 0) + ( 485317.505, 4763234.029, 0, 0) + ( 485344.154, 4763162.446, 0, 0) + ( 485129.406, 4763082.500, 0, 0) + +Shape:10 (Polygon) nVertices=5, nParts=1 + Bounds:( 485368.786, 4762538.500, 0, 0) + to ( 485824.016, 4762774.029, 0, 0) + ( 485396.156, 4762538.500, 0, 0) Ring + ( 485368.786, 4762609.810, 0, 0) + ( 485796.646, 4762774.029, 0, 0) + ( 485824.016, 4762702.719, 0, 0) + ( 485396.156, 4762538.500, 0, 0) + +Shape:11 (Polygon) nVertices=5, nParts=1 + Bounds:( 487002.484, 4763184.000, 0, 0) + to ( 487243.960, 4763333.368, 0, 0) + ( 487028.312, 4763184.000, 0, 0) Ring + ( 487002.484, 4763255.883, 0, 0) + ( 487218.132, 4763333.368, 0, 0) + ( 487243.960, 4763261.486, 0, 0) + ( 487028.312, 4763184.000, 0, 0) + +Shape:12 (Polygon) nVertices=5, nParts=1 + Bounds:( 486733.537, 4762455.413, 0, 0) + to ( 487076.312, 4763275.483, 0, 0) + ( 487076.312, 4762480.000, 0, 0) Ring + ( 487003.996, 4762455.413, 0, 0) + ( 486733.537, 4763250.896, 0, 0) + ( 486805.854, 4763275.483, 0, 0) + ( 487076.312, 4762480.000, 0, 0) + +Shape:13 (Polygon) nVertices=5, nParts=1 + Bounds:( 486440.735, 4762331.029, 0, 0) + to ( 486772.281, 4763075.311, 0, 0) + ( 486772.281, 4762357.000, 0, 0) Ring + ( 486700.450, 4762331.029, 0, 0) + ( 486440.735, 4763049.339, 0, 0) + ( 486512.566, 4763075.311, 0, 0) + ( 486772.281, 4762357.000, 0, 0) + +Shape:14 (Polygon) nVertices=5, nParts=1 + Bounds:( 486383.882, 4762986.530, 0, 0) + to ( 486521.594, 4763227.908, 0, 0) + ( 486521.594, 4763008.000, 0, 0) Ring + ( 486448.291, 4762986.530, 0, 0) + ( 486383.882, 4763206.438, 0, 0) + ( 486457.184, 4763227.908, 0, 0) + ( 486521.594, 4763008.000, 0, 0) + +Shape:15 (Polygon) nVertices=9, nParts=1 + Bounds:( 486360.416, 4762774.310, 0, 0) + to ( 486800.882, 4763656.208, 0, 0) + ( 486489.594, 4763600.000, 0, 0) Ring + ( 486541.313, 4763656.208, 0, 0) + ( 486762.057, 4763453.094, 0, 0) + ( 486800.882, 4763266.659, 0, 0) + ( 486420.883, 4762774.310, 0, 0) + ( 486360.416, 4762820.979, 0, 0) + ( 486718.938, 4763285.500, 0, 0) + ( 486692.281, 4763413.500, 0, 0) + ( 486489.594, 4763600.000, 0, 0) + +Shape:16 (Polygon) nVertices=5, nParts=1 + Bounds:( 486682.872, 4762181.000, 0, 0) + to ( 487292.496, 4762415.463, 0, 0) + ( 486702.969, 4762181.000, 0, 0) Ring + ( 486682.872, 4762254.691, 0, 0) + ( 487272.400, 4762415.463, 0, 0) + ( 487292.496, 4762341.772, 0, 0) + ( 486702.969, 4762181.000, 0, 0) + +Shape:17 (Polygon) nVertices=5, nParts=1 + Bounds:( 487480.713, 4762283.320, 0, 0) + to ( 487732.406, 4762812.552, 0, 0) + ( 487732.406, 4762309.000, 0, 0) Ring + ( 487660.470, 4762283.320, 0, 0) + ( 487480.713, 4762786.872, 0, 0) + ( 487552.649, 4762812.552, 0, 0) + ( 487732.406, 4762309.000, 0, 0) + +Shape:18 (Polygon) nVertices=5, nParts=1 + Bounds:( 487069.757, 4763685.709, 0, 0) + to ( 487220.344, 4763927.145, 0, 0) + ( 487220.344, 4763712.000, 0, 0) Ring + ( 487148.629, 4763685.709, 0, 0) + ( 487069.757, 4763900.854, 0, 0) + ( 487141.471, 4763927.145, 0, 0) + ( 487220.344, 4763712.000, 0, 0) + +Shape:19 (Polygon) nVertices=9, nParts=1 + Bounds:( 487854.719, 4758279.000, 0, 0) + to ( 488518.085, 4758475.003, 0, 0) + ( 487854.719, 4758404.000, 0, 0) Ring + ( 487882.875, 4758475.003, 0, 0) + ( 488183.362, 4758355.845, 0, 0) + ( 488341.273, 4758360.840, 0, 0) + ( 488515.420, 4758366.919, 0, 0) + ( 488518.085, 4758290.583, 0, 0) + ( 488343.812, 4758284.500, 0, 0) + ( 488169.938, 4758279.000, 0, 0) + ( 487854.719, 4758404.000, 0, 0) + +Shape:20 (Polygon) nVertices=5, nParts=1 + Bounds:( 486300.557, 4758366.000, 0, 0) + to ( 486613.245, 4758546.262, 0, 0) + ( 486327.781, 4758366.000, 0, 0) Ring + ( 486300.557, 4758437.366, 0, 0) + ( 486586.021, 4758546.262, 0, 0) + ( 486613.245, 4758474.896, 0, 0) + ( 486327.781, 4758366.000, 0, 0) + +Shape:21 (Polygon) nVertices=5, nParts=1 + Bounds:( 486709.618, 4758518.000, 0, 0) + to ( 486949.999, 4758681.145, 0, 0) + ( 486740.750, 4758518.000, 0, 0) Ring + ( 486709.618, 4758587.750, 0, 0) + ( 486918.867, 4758681.145, 0, 0) + ( 486949.999, 4758611.396, 0, 0) + ( 486740.750, 4758518.000, 0, 0) + +Shape:22 (Polygon) nVertices=5, nParts=1 + Bounds:( 487325.398, 4757807.034, 0, 0) + to ( 487555.844, 4758263.402, 0, 0) + ( 487555.844, 4757833.500, 0, 0) Ring + ( 487484.193, 4757807.034, 0, 0) + ( 487325.398, 4758236.937, 0, 0) + ( 487397.049, 4758263.402, 0, 0) + ( 487555.844, 4757833.500, 0, 0) + +Shape:23 (Polygon) nVertices=5, nParts=1 + Bounds:( 487255.256, 4758215.573, 0, 0) + to ( 487387.406, 4758456.611, 0, 0) + ( 487387.406, 4758235.000, 0, 0) Ring + ( 487313.536, 4758215.573, 0, 0) + ( 487255.256, 4758437.184, 0, 0) + ( 487329.126, 4758456.611, 0, 0) + ( 487387.406, 4758235.000, 0, 0) + +Shape:24 (Polygon) nVertices=5, nParts=1 + Bounds:( 487248.714, 4758360.500, 0, 0) + to ( 487559.687, 4758550.761, 0, 0) + ( 487278.719, 4758360.500, 0, 0) Ring + ( 487248.714, 4758430.742, 0, 0) + ( 487529.682, 4758550.761, 0, 0) + ( 487559.687, 4758480.519, 0, 0) + ( 487278.719, 4758360.500, 0, 0) + +Shape:25 (Polygon) nVertices=5, nParts=1 + Bounds:( 487573.994, 4758496.500, 0, 0) + to ( 487815.502, 4758644.603, 0, 0) + ( 487599.344, 4758496.500, 0, 0) Ring + ( 487573.994, 4758568.553, 0, 0) + ( 487790.152, 4758644.603, 0, 0) + ( 487815.502, 4758572.550, 0, 0) + ( 487599.344, 4758496.500, 0, 0) +------------------------------------------------------------------------- +Test 2: dump brklinz.shp +------------------------------------------------------------------------- +Shapefile Type: ArcZ # of Shapes: 122 + +File Bounds: ( 6294338.260, 1978444.010,0,0) + to ( 6296321.860, 1979694.450,0,0) + +Shape:0 (ArcZ) nVertices=92, nParts=1 + Bounds:( 6294700.210, 1978579.390, 818.64, 0) + to ( 6295395.930, 1979050.330, 917.86, 0) + ( 6295372.750, 1978755.830, 823.06, 0) Ring + ( 6295366.170, 1978739.190, 826.58, 0) + ( 6295360.400, 1978718.540, 829.2, 0) + ( 6295352.620, 1978697.000, 832.22, 0) + ( 6295345.960, 1978677.040, 834.64, 0) + ( 6295339.690, 1978656.810, 838.51, 0) + ( 6295335.040, 1978637.600, 840.94, 0) + ( 6295331.080, 1978621.450, 844.48, 0) + ( 6295324.350, 1978607.940, 847.04, 0) + ( 6295313.370, 1978598.450, 850.38, 0) + ( 6295296.780, 1978594.950, 853.27, 0) + ( 6295273.800, 1978594.990, 858.06, 0) + ( 6295251.750, 1978595.380, 861.53, 0) + ( 6295232.340, 1978598.400, 864.22, 0) + ( 6295206.740, 1978606.390, 866.38, 0) + ( 6295180.610, 1978616.970, 868.15, 0) + ( 6295156.350, 1978630.540, 870.65, 0) + ( 6295132.270, 1978645.210, 872.02, 0) + ( 6295111.070, 1978659.740, 875.17, 0) + ( 6295090.030, 1978674.920, 878.84, 0) + ( 6295071.060, 1978689.340, 882.06, 0) + ( 6295051.900, 1978705.080, 886.98, 0) + ( 6295036.460, 1978719.260, 889.66, 0) + ( 6295023.620, 1978732.910, 893.53, 0) + ( 6295010.450, 1978750.380, 895.24, 0) + ( 6294999.910, 1978767.850, 897.47, 0) + ( 6294989.810, 1978783.860, 900.29, 0) + ( 6294975.040, 1978795.570, 902.45, 0) + ( 6294956.300, 1978806.830, 906.32, 0) + ( 6294937.260, 1978814.620, 909.21, 0) + ( 6294919.240, 1978821.960, 912.88, 0) + ( 6294897.040, 1978832.210, 915.04, 0) + ( 6294878.070, 1978844.070, 916.49, 0) + ( 6294865.010, 1978855.820, 917.34, 0) + ( 6294859.560, 1978870.150, 916.81, 0) + ( 6294861.520, 1978882.920, 916.62, 0) + ( 6294874.640, 1978906.220, 917.86, 0) + ( 6294886.980, 1978926.880, 917.6, 0) + ( 6294889.630, 1978953.270, 917.54, 0) + ( 6294888.520, 1978978.280, 916.88, 0) + ( 6294880.350, 1978998.390, 915.96, 0) + ( 6294866.540, 1979018.920, 915.57, 0) + ( 6294843.270, 1979039.140, 915.57, 0) + ( 6294812.250, 1979049.040, 915.96, 0) + ( 6294777.640, 1979050.330, 916.75, 0) + ( 6294752.060, 1979040.520, 916.68, 0) + ( 6294730.990, 1979028.850, 916.62, 0) + ( 6294716.690, 1979008.420, 916.62, 0) + ( 6294706.050, 1978987.490, 916.95, 0) + ( 6294700.210, 1978965.390, 916.95, 0) + ( 6294700.520, 1978937.670, 917.01, 0) + ( 6294712.060, 1978911.340, 916.95, 0) + ( 6294724.820, 1978893.560, 916.62, 0) + ( 6294741.630, 1978878.010, 916.36, 0) + ( 6294759.360, 1978865.090, 916.36, 0) + ( 6294777.650, 1978855.370, 916.22, 0) + ( 6294807.570, 1978846.970, 916.36, 0) + ( 6294837.640, 1978836.590, 916.55, 0) + ( 6294858.650, 1978831.390, 916.29, 0) + ( 6294878.860, 1978825.840, 915.37, 0) + ( 6294897.630, 1978817.860, 913.67, 0) + ( 6294914.550, 1978809.520, 910.78, 0) + ( 6294932.380, 1978798.580, 907.17, 0) + ( 6294947.360, 1978788.370, 904.42, 0) + ( 6294960.500, 1978778.120, 901.86, 0) + ( 6294974.780, 1978761.900, 898.78, 0) + ( 6294988.510, 1978747.610, 895.7, 0) + ( 6295005.230, 1978730.220, 892.81, 0) + ( 6295023.560, 1978713.470, 889.34, 0) + ( 6295043.310, 1978696.320, 885.07, 0) + ( 6295061.830, 1978680.810, 881.47, 0) + ( 6295080.970, 1978664.550, 877.79, 0) + ( 6295104.570, 1978648.190, 874.58, 0) + ( 6295126.310, 1978633.890, 872.09, 0) + ( 6295149.840, 1978618.720, 869.6, 0) + ( 6295173.840, 1978605.030, 867.37, 0) + ( 6295198.110, 1978594.150, 866.12, 0) + ( 6295222.830, 1978586.990, 865.2, 0) + ( 6295243.030, 1978583.810, 863.5, 0) + ( 6295268.110, 1978581.290, 860.35, 0) + ( 6295291.530, 1978579.390, 856.48, 0) + ( 6295313.200, 1978582.040, 852.42, 0) + ( 6295329.170, 1978591.410, 848.81, 0) + ( 6295339.780, 1978603.880, 845.07, 0) + ( 6295345.640, 1978621.110, 842.12, 0) + ( 6295351.070, 1978642.970, 838.32, 0) + ( 6295357.250, 1978666.560, 834.77, 0) + ( 6295367.290, 1978691.000, 831.89, 0) + ( 6295376.030, 1978718.470, 828.09, 0) + ( 6295383.930, 1978744.860, 824.35, 0) + ( 6295389.990, 1978768.720, 821.33, 0) + ( 6295395.930, 1978790.090, 818.64, 0) + +Shape:1 (ArcZ) nVertices=9, nParts=1 + Bounds:( 6295218.470, 1978444.010, 864.55, 0) + to ( 6295330.760, 1978581.880, 882.45, 0) + ( 6295330.760, 1978444.010, 882.45, 0) Ring + ( 6295306.050, 1978461.190, 880.94, 0) + ( 6295280.210, 1978482.710, 878.52, 0) + ( 6295258.180, 1978504.050, 875.89, 0) + ( 6295239.910, 1978524.670, 871.89, 0) + ( 6295225.650, 1978546.540, 869.53, 0) + ( 6295218.470, 1978565.550, 866.97, 0) + ( 6295223.960, 1978575.510, 865.27, 0) + ( 6295230.580, 1978581.880, 864.55, 0) + +Shape:2 (ArcZ) nVertices=10, nParts=1 + Bounds:( 6295199.220, 1978444.010, 866.32, 0) + to ( 6295309.040, 1978588.800, 882.08, 0) + ( 6295200.070, 1978588.800, 866.32, 0) Ring + ( 6295199.220, 1978571.840, 867.24, 0) + ( 6295200.770, 1978555.740, 868.88, 0) + ( 6295207.890, 1978538.040, 869.86, 0) + ( 6295223.020, 1978520.530, 870.84, 0) + ( 6295239.450, 1978502.440, 874.06, 0) + ( 6295258.050, 1978483.440, 876.48, 0) + ( 6295268.990, 1978473.760, 879.17, 0) + ( 6295285.710, 1978461.560, 880.55, 0) + ( 6295309.040, 1978444.010, 882.08, 0) + +Shape:3 (ArcZ) nVertices=5, nParts=1 + Bounds:( 6294340.890, 1979449.280, 1031.78, 0) + to ( 6294394.080, 1979522.030, 1039.78, 0) + ( 6294394.080, 1979449.280, 1039.78, 0) Ring + ( 6294378.800, 1979469.230, 1038.73, 0) + ( 6294364.980, 1979486.740, 1037.28, 0) + ( 6294350.800, 1979504.980, 1035.12, 0) + ( 6294340.890, 1979522.030, 1031.78, 0) + +Shape:4 (ArcZ) nVertices=6, nParts=1 + Bounds:( 6294344.380, 1979583.450, 1008.04, 0) + to ( 6294354.670, 1979678.070, 1023.45, 0) + ( 6294344.380, 1979583.450, 1023.45, 0) Ring + ( 6294348.050, 1979601.580, 1019.18, 0) + ( 6294349.570, 1979621.200, 1016.5, 0) + ( 6294351.990, 1979637.890, 1012.95, 0) + ( 6294353.090, 1979657.140, 1011.51, 0) + ( 6294354.670, 1979678.070, 1008.04, 0) + +Shape:5 (ArcZ) nVertices=3, nParts=1 + Bounds:( 6294338.260, 1979628.600, 1008.63, 0) + to ( 6294341.080, 1979674.100, 1015.71, 0) + ( 6294341.080, 1979674.100, 1008.63, 0) Ring + ( 6294339.460, 1979649.880, 1011.71, 0) + ( 6294338.260, 1979628.600, 1015.71, 0) + +Shape:6 (ArcZ) nVertices=3, nParts=1 + Bounds:( 6294350.160, 1979437.980, 1038.6, 0) + to ( 6294379.980, 1979476.720, 1040.1, 0) + ( 6294350.160, 1979476.720, 1038.6, 0) Ring + ( 6294368.100, 1979454.860, 1040.1, 0) + ( 6294379.980, 1979437.980, 1039.32, 0) + +Shape:7 (ArcZ) nVertices=39, nParts=1 + Bounds:( 6295371.530, 1978758.160, 754.11, 0) + to ( 6295534.560, 1979677.750, 823.3, 0) + ( 6295534.560, 1979677.750, 779.95, 0) Ring + ( 6295534.380, 1979648.150, 778.57, 0) + ( 6295534.480, 1979605.990, 775.16, 0) + ( 6295533.970, 1979577.580, 772.21, 0) + ( 6295532.310, 1979547.260, 768.41, 0) + ( 6295532.970, 1979521.290, 763.82, 0) + ( 6295532.390, 1979496.890, 759.1, 0) + ( 6295532.940, 1979474.010, 755.49, 0) + ( 6295533.680, 1979452.180, 754.11, 0) + ( 6295533.850, 1979434.640, 754.11, 0) + ( 6295532.170, 1979409.180, 755.75, 0) + ( 6295531.580, 1979384.450, 758.7, 0) + ( 6295531.590, 1979356.090, 760.28, 0) + ( 6295530.190, 1979325.690, 761.13, 0) + ( 6295530.020, 1979291.090, 761.66, 0) + ( 6295529.210, 1979259.420, 762.7, 0) + ( 6295526.250, 1979221.610, 762.77, 0) + ( 6295524.260, 1979187.500, 763.75, 0) + ( 6295522.640, 1979155.350, 764.61, 0) + ( 6295521.540, 1979123.230, 765.33, 0) + ( 6295518.460, 1979096.000, 765.92, 0) + ( 6295511.670, 1979081.110, 767.16, 0) + ( 6295500.700, 1979064.060, 768.41, 0) + ( 6295489.330, 1979049.600, 770.11, 0) + ( 6295475.500, 1979033.100, 773.07, 0) + ( 6295462.530, 1979018.190, 775.16, 0) + ( 6295447.760, 1979001.400, 779.49, 0) + ( 6295433.380, 1978984.530, 782.9, 0) + ( 6295419.040, 1978965.820, 785.92, 0) + ( 6295409.020, 1978946.820, 790.58, 0) + ( 6295399.860, 1978923.910, 795.1, 0) + ( 6295391.010, 1978894.410, 800.94, 0) + ( 6295387.440, 1978875.550, 805.53, 0) + ( 6295382.030, 1978849.030, 809.79, 0) + ( 6295382.190, 1978828.930, 813.33, 0) + ( 6295383.570, 1978809.290, 817.4, 0) + ( 6295380.880, 1978789.860, 819.69, 0) + ( 6295375.630, 1978771.810, 822.58, 0) + ( 6295371.530, 1978758.160, 823.3, 0) + +Shape:8 (ArcZ) nVertices=35, nParts=1 + Bounds:( 6295396.480, 1978794.780, 753.98, 0) + to ( 6295549.010, 1979670.060, 818.58, 0) + ( 6295396.620, 1978794.780, 818.58, 0) Ring + ( 6295397.330, 1978816.670, 815.76, 0) + ( 6295396.480, 1978836.150, 812.22, 0) + ( 6295397.670, 1978857.110, 807.95, 0) + ( 6295401.180, 1978874.720, 804.61, 0) + ( 6295406.260, 1978897.320, 799.95, 0) + ( 6295413.580, 1978919.930, 794.77, 0) + ( 6295421.330, 1978938.190, 790.31, 0) + ( 6295431.450, 1978956.590, 786.51, 0) + ( 6295444.950, 1978974.360, 782.38, 0) + ( 6295461.420, 1978993.620, 777.66, 0) + ( 6295479.760, 1979013.510, 773.26, 0) + ( 6295494.630, 1979032.330, 771.1, 0) + ( 6295510.990, 1979052.120, 767.69, 0) + ( 6295524.170, 1979071.090, 766.84, 0) + ( 6295532.180, 1979091.890, 765.33, 0) + ( 6295536.530, 1979120.830, 764.8, 0) + ( 6295537.480, 1979150.200, 764.08, 0) + ( 6295539.470, 1979189.490, 763.43, 0) + ( 6295541.670, 1979230.490, 762.64, 0) + ( 6295541.760, 1979271.330, 761.79, 0) + ( 6295543.650, 1979306.300, 761.46, 0) + ( 6295544.470, 1979335.540, 760.47, 0) + ( 6295544.960, 1979363.490, 759.23, 0) + ( 6295545.620, 1979392.020, 757.13, 0) + ( 6295546.340, 1979419.430, 754.9, 0) + ( 6295547.120, 1979439.940, 753.98, 0) + ( 6295546.510, 1979459.150, 754.38, 0) + ( 6295545.460, 1979482.710, 757.66, 0) + ( 6295545.530, 1979507.330, 761.13, 0) + ( 6295545.610, 1979532.470, 765.59, 0) + ( 6295546.490, 1979565.520, 770.44, 0) + ( 6295547.960, 1979597.100, 775.03, 0) + ( 6295548.990, 1979628.040, 777.26, 0) + ( 6295549.010, 1979670.060, 780.15, 0) + +Shape:9 (ArcZ) nVertices=45, nParts=1 + Bounds:( 6295694.040, 1978444.010, 696.95, 0) + to ( 6296208.790, 1979687.080, 787.43, 0) + ( 6295698.400, 1979687.080, 787.43, 0) Ring + ( 6295694.040, 1979670.950, 786.31, 0) + ( 6295696.410, 1979650.280, 785.13, 0) + ( 6295700.080, 1979634.530, 784.8, 0) + ( 6295704.080, 1979620.010, 784.15, 0) + ( 6295708.420, 1979601.930, 782.44, 0) + ( 6295711.230, 1979584.790, 781.99, 0) + ( 6295712.060, 1979564.780, 780.8, 0) + ( 6295710.550, 1979537.480, 779.69, 0) + ( 6295711.290, 1979508.020, 777.59, 0) + ( 6295710.010, 1979477.420, 776.08, 0) + ( 6295709.300, 1979442.530, 773.59, 0) + ( 6295709.160, 1979413.640, 772.21, 0) + ( 6295707.090, 1979372.570, 769.46, 0) + ( 6295708.140, 1979336.210, 767.49, 0) + ( 6295709.710, 1979297.130, 764.67, 0) + ( 6295710.960, 1979272.310, 763.29, 0) + ( 6295714.640, 1979241.200, 761.2, 0) + ( 6295719.050, 1979211.560, 759.82, 0) + ( 6295724.280, 1979179.840, 758.31, 0) + ( 6295729.460, 1979152.460, 756.74, 0) + ( 6295735.770, 1979126.530, 754.44, 0) + ( 6295744.970, 1979095.400, 752.87, 0) + ( 6295755.820, 1979063.140, 750.31, 0) + ( 6295767.590, 1979028.330, 747.62, 0) + ( 6295782.240, 1978993.450, 744.21, 0) + ( 6295801.580, 1978952.420, 741.26, 0) + ( 6295825.730, 1978905.370, 736.87, 0) + ( 6295842.330, 1978877.810, 734.7, 0) + ( 6295859.110, 1978851.150, 731.55, 0) + ( 6295875.620, 1978827.010, 729.52, 0) + ( 6295899.080, 1978794.830, 727.42, 0) + ( 6295923.640, 1978763.720, 724.34, 0) + ( 6295949.340, 1978734.180, 721.39, 0) + ( 6295975.020, 1978704.320, 718.57, 0) + ( 6296000.320, 1978677.440, 716.01, 0) + ( 6296026.940, 1978648.120, 713.45, 0) + ( 6296053.500, 1978617.500, 709.78, 0) + ( 6296078.620, 1978589.630, 706.9, 0) + ( 6296098.880, 1978566.880, 704.47, 0) + ( 6296126.050, 1978537.930, 702.37, 0) + ( 6296150.670, 1978507.990, 700.14, 0) + ( 6296179.280, 1978476.280, 698.7, 0) + ( 6296208.030, 1978444.880, 696.99, 0) + ( 6296208.790, 1978444.010, 696.95, 0) + +Shape:10 (ArcZ) nVertices=10, nParts=1 + Bounds:( 6296270.060, 1979014.970, 712.54, 0) + to ( 6296315.990, 1979152.310, 725.13, 0) + ( 6296306.110, 1979152.310, 725.13, 0) Ring + ( 6296288.270, 1979139.690, 723.42, 0) + ( 6296276.630, 1979122.410, 721.98, 0) + ( 6296270.060, 1979101.470, 719.95, 0) + ( 6296270.390, 1979084.580, 719.36, 0) + ( 6296275.110, 1979068.970, 717.26, 0) + ( 6296284.280, 1979052.820, 716.41, 0) + ( 6296294.680, 1979040.410, 715.49, 0) + ( 6296305.720, 1979027.370, 713.59, 0) + ( 6296315.990, 1979014.970, 712.54, 0) + +Shape:11 (ArcZ) nVertices=18, nParts=1 + Bounds:( 6296044.930, 1978451.120, 690.11, 0) + to ( 6296312.920, 1978679.190, 713.72, 0) + ( 6296312.920, 1978493.560, 690.11, 0) Ring + ( 6296301.160, 1978479.050, 690.9, 0) + ( 6296287.840, 1978464.950, 692.4, 0) + ( 6296276.430, 1978454.890, 693.58, 0) + ( 6296262.580, 1978451.120, 694.44, 0) + ( 6296249.650, 1978452.500, 694.9, 0) + ( 6296237.110, 1978461.670, 696.08, 0) + ( 6296223.600, 1978477.650, 697.78, 0) + ( 6296209.320, 1978493.930, 698.7, 0) + ( 6296193.640, 1978511.140, 699.16, 0) + ( 6296176.980, 1978529.710, 700.6, 0) + ( 6296157.700, 1978550.970, 701.98, 0) + ( 6296136.720, 1978574.950, 703.49, 0) + ( 6296121.400, 1978591.550, 705.39, 0) + ( 6296102.290, 1978613.590, 707.36, 0) + ( 6296084.440, 1978634.580, 709.13, 0) + ( 6296065.890, 1978654.760, 711.29, 0) + ( 6296044.930, 1978679.190, 713.72, 0) + +Shape:12 (ArcZ) nVertices=71, nParts=1 + Bounds:( 6295741.070, 1978679.190, 713.72, 0) + to ( 6296321.860, 1979680.370, 813.79, 0) + ( 6296044.930, 1978679.190, 713.72, 0) Ring + ( 6296025.660, 1978700.780, 716.6, 0) + ( 6296006.480, 1978721.510, 718.37, 0) + ( 6295987.070, 1978742.720, 721, 0) + ( 6295970.410, 1978761.420, 722.44, 0) + ( 6295953.490, 1978780.070, 724.28, 0) + ( 6295932.470, 1978805.820, 726.44, 0) + ( 6295913.490, 1978830.550, 728.67, 0) + ( 6295896.490, 1978855.310, 731.16, 0) + ( 6295881.220, 1978878.070, 733.39, 0) + ( 6295867.710, 1978899.180, 734.7, 0) + ( 6295853.950, 1978923.310, 737, 0) + ( 6295839.810, 1978950.030, 739.56, 0) + ( 6295825.270, 1978979.390, 742.11, 0) + ( 6295809.100, 1979015.600, 745.46, 0) + ( 6295796.940, 1979045.170, 748.02, 0) + ( 6295785.770, 1979078.900, 750.97, 0) + ( 6295777.080, 1979104.550, 752.54, 0) + ( 6295768.950, 1979133.460, 754.84, 0) + ( 6295762.170, 1979163.090, 756.87, 0) + ( 6295755.640, 1979194.930, 758.9, 0) + ( 6295750.610, 1979225.390, 760.48, 0) + ( 6295746.300, 1979259.750, 762.64, 0) + ( 6295743.320, 1979291.750, 764.54, 0) + ( 6295741.650, 1979321.060, 766.64, 0) + ( 6295741.070, 1979353.790, 768.54, 0) + ( 6295741.170, 1979384.450, 770.71, 0) + ( 6295742.010, 1979419.210, 772.48, 0) + ( 6295743.010, 1979454.740, 774.44, 0) + ( 6295743.910, 1979493.310, 776.94, 0) + ( 6295744.990, 1979530.290, 778.97, 0) + ( 6295745.900, 1979569.120, 781.46, 0) + ( 6295745.940, 1979603.910, 783.3, 0) + ( 6295747.600, 1979636.660, 785.85, 0) + ( 6295751.850, 1979653.260, 787.49, 0) + ( 6295760.490, 1979665.820, 788.87, 0) + ( 6295773.510, 1979673.830, 790.18, 0) + ( 6295788.460, 1979676.100, 791.95, 0) + ( 6295823.990, 1979674.960, 793.46, 0) + ( 6295871.620, 1979674.070, 796.94, 0) + ( 6295918.980, 1979673.120, 798.97, 0) + ( 6295971.200, 1979672.130, 802.25, 0) + ( 6296019.370, 1979671.600, 803.95, 0) + ( 6296054.350, 1979670.030, 805.92, 0) + ( 6296074.580, 1979662.250, 806.58, 0) + ( 6296085.660, 1979647.700, 806.97, 0) + ( 6296089.370, 1979635.300, 807.69, 0) + ( 6296086.380, 1979620.160, 808.61, 0) + ( 6296080.060, 1979601.690, 810.32, 0) + ( 6296074.440, 1979583.990, 811.17, 0) + ( 6296070.250, 1979568.770, 812.22, 0) + ( 6296072.470, 1979552.830, 812.94, 0) + ( 6296083.220, 1979536.790, 813.46, 0) + ( 6296102.650, 1979531.410, 813.79, 0) + ( 6296121.290, 1979536.450, 813.73, 0) + ( 6296133.190, 1979548.520, 813.2, 0) + ( 6296138.010, 1979563.380, 812.61, 0) + ( 6296135.460, 1979580.580, 811.37, 0) + ( 6296129.950, 1979598.850, 810.18, 0) + ( 6296124.490, 1979618.170, 809.46, 0) + ( 6296122.100, 1979635.880, 808.35, 0) + ( 6296126.820, 1979651.410, 807.36, 0) + ( 6296136.390, 1979661.360, 806.51, 0) + ( 6296149.630, 1979666.080, 806.05, 0) + ( 6296163.380, 1979667.880, 805.73, 0) + ( 6296186.080, 1979667.460, 805.14, 0) + ( 6296215.190, 1979666.580, 805, 0) + ( 6296247.690, 1979667.830, 803.5, 0) + ( 6296273.580, 1979670.850, 802.32, 0) + ( 6296295.410, 1979674.090, 800.68, 0) + ( 6296321.860, 1979680.370, 799.23, 0) + +Shape:13 (ArcZ) nVertices=6, nParts=1 + Bounds:( 6295372.650, 1979608.700, 773.19, 0) + to ( 6295470.330, 1979679.550, 780.15, 0) + ( 6295372.650, 1979679.550, 780.15, 0) Ring + ( 6295387.140, 1979664.770, 777.85, 0) + ( 6295406.650, 1979645.400, 776.21, 0) + ( 6295422.760, 1979631.580, 775.29, 0) + ( 6295442.800, 1979612.190, 773.65, 0) + ( 6295470.330, 1979608.700, 773.19, 0) + +Shape:14 (ArcZ) nVertices=7, nParts=1 + Bounds:( 6295415.710, 1979491.540, 772.08, 0) + to ( 6295453.550, 1979590.190, 773.85, 0) + ( 6295453.550, 1979590.110, 772.09, 0) Ring + ( 6295453.110, 1979590.190, 772.08, 0) + ( 6295439.430, 1979579.260, 772.74, 0) + ( 6295430.870, 1979552.770, 772.93, 0) + ( 6295420.940, 1979527.860, 773.19, 0) + ( 6295415.710, 1979510.070, 773.79, 0) + ( 6295421.080, 1979491.540, 773.85, 0) + +Shape:15 (ArcZ) nVertices=9, nParts=1 + Bounds:( 6295351.240, 1979521.410, 773, 0) + to ( 6295430.330, 1979692.520, 782.11, 0) + ( 6295395.270, 1979521.410, 774.51, 0) Ring + ( 6295415.880, 1979549.790, 773.85, 0) + ( 6295426.030, 1979579.220, 773, 0) + ( 6295430.330, 1979604.610, 773.06, 0) + ( 6295418.610, 1979622.140, 774.31, 0) + ( 6295398.970, 1979639.020, 776.34, 0) + ( 6295382.220, 1979655.690, 778.31, 0) + ( 6295365.040, 1979674.420, 780.15, 0) + ( 6295351.240, 1979692.520, 782.11, 0) + +Shape:16 (ArcZ) nVertices=28, nParts=1 + Bounds:( 6294520.270, 1979256.990, 932.36, 0) + to ( 6294743.290, 1979675.030, 1016.69, 0) + ( 6294531.940, 1979675.030, 932.36, 0) Ring + ( 6294523.870, 1979650.550, 933.54, 0) + ( 6294520.270, 1979620.920, 936.75, 0) + ( 6294525.030, 1979592.840, 940.29, 0) + ( 6294533.880, 1979567.770, 942.98, 0) + ( 6294546.040, 1979543.320, 949.28, 0) + ( 6294564.140, 1979524.750, 951.64, 0) + ( 6294585.590, 1979515.130, 956.36, 0) + ( 6294611.810, 1979503.890, 959.38, 0) + ( 6294635.130, 1979494.900, 966.2, 0) + ( 6294662.590, 1979487.470, 969.41, 0) + ( 6294687.540, 1979482.070, 971.77, 0) + ( 6294710.180, 1979470.160, 976.75, 0) + ( 6294732.150, 1979450.140, 978.53, 0) + ( 6294743.290, 1979431.460, 981.94, 0) + ( 6294738.700, 1979402.930, 984.69, 0) + ( 6294731.290, 1979380.980, 986.79, 0) + ( 6294717.670, 1979358.290, 988.3, 0) + ( 6294706.340, 1979342.050, 991.38, 0) + ( 6294697.140, 1979315.920, 996.76, 0) + ( 6294696.360, 1979292.580, 1000.17, 0) + ( 6294691.930, 1979275.010, 1002.4, 0) + ( 6294681.970, 1979259.950, 1004.76, 0) + ( 6294665.150, 1979256.990, 1006.53, 0) + ( 6294638.580, 1979258.930, 1010.33, 0) + ( 6294617.350, 1979259.730, 1012.76, 0) + ( 6294592.000, 1979262.260, 1015.32, 0) + ( 6294572.550, 1979262.000, 1016.69, 0) + +Shape:17 (ArcZ) nVertices=43, nParts=1 + Bounds:( 6294466.100, 1979253.610, 930.98, 0) + to ( 6294720.520, 1979678.410, 1018.46, 0) + ( 6294572.550, 1979262.000, 1016.69, 0) Ring + ( 6294549.640, 1979260.720, 1017.48, 0) + ( 6294522.440, 1979260.520, 1017.48, 0) + ( 6294472.060, 1979253.610, 1016.63, 0) + ( 6294469.530, 1979302.330, 1017.15, 0) + ( 6294466.100, 1979341.240, 1016.63, 0) + ( 6294469.480, 1979374.290, 1016.5, 0) + ( 6294506.640, 1979382.010, 1016.96, 0) + ( 6294538.320, 1979377.390, 1016.89, 0) + ( 6294581.400, 1979377.510, 1017.74, 0) + ( 6294603.050, 1979366.770, 1017.74, 0) + ( 6294597.820, 1979338.470, 1018, 0) + ( 6294587.060, 1979307.490, 1018.46, 0) + ( 6294579.280, 1979283.460, 1017.87, 0) + ( 6294593.320, 1979278.020, 1016.36, 0) + ( 6294613.160, 1979275.640, 1013.15, 0) + ( 6294634.390, 1979274.630, 1009.54, 0) + ( 6294650.590, 1979272.960, 1006.4, 0) + ( 6294666.970, 1979274.830, 1003.77, 0) + ( 6294675.710, 1979289.290, 1001.81, 0) + ( 6294681.310, 1979309.230, 998.13, 0) + ( 6294686.190, 1979327.900, 995.64, 0) + ( 6294692.280, 1979346.960, 991.64, 0) + ( 6294699.730, 1979367.200, 989.08, 0) + ( 6294709.530, 1979384.310, 985.74, 0) + ( 6294716.160, 1979401.370, 983.25, 0) + ( 6294720.520, 1979414.810, 980.1, 0) + ( 6294718.980, 1979441.480, 978, 0) +------------------------------------------------------------------------- +Test 3: dump polygon.shp +------------------------------------------------------------------------- +Shapefile Type: Polygon # of Shapes: 474 + +File Bounds: ( 471127.188, 4751545.000,0,0) + to ( 489292.312, 4765610.500,0,0) + +Shape:0 (Polygon) nVertices=20, nParts=1 + Bounds:( 479647.000, 4764856.500, 0, 0) + to ( 480389.688, 4765610.500, 0, 0) + ( 479819.844, 4765180.500, 0, 0) Ring + ( 479690.188, 4765259.500, 0, 0) + ( 479647.000, 4765369.500, 0, 0) + ( 479730.375, 4765400.500, 0, 0) + ( 480039.031, 4765539.500, 0, 0) + ( 480035.344, 4765558.500, 0, 0) + ( 480159.781, 4765610.500, 0, 0) + ( 480202.281, 4765482.000, 0, 0) + ( 480365.000, 4765015.500, 0, 0) + ( 480389.688, 4764950.000, 0, 0) + ( 480133.969, 4764856.500, 0, 0) + ( 480080.281, 4764979.500, 0, 0) + ( 480082.969, 4765049.500, 0, 0) + ( 480088.812, 4765139.500, 0, 0) + ( 480059.906, 4765239.500, 0, 0) + ( 480019.719, 4765319.500, 0, 0) + ( 479980.219, 4765409.500, 0, 0) + ( 479909.875, 4765370.000, 0, 0) + ( 479859.875, 4765270.000, 0, 0) + ( 479819.844, 4765180.500, 0, 0) + +Shape:1 (Polygon) nVertices=20, nParts=1 + Bounds:( 479014.938, 4764879.000, 0, 0) + to ( 480039.031, 4765558.500, 0, 0) + ( 480035.344, 4765558.500, 0, 0) Ring + ( 480039.031, 4765539.500, 0, 0) + ( 479730.375, 4765400.500, 0, 0) + ( 479647.000, 4765369.500, 0, 0) + ( 479690.188, 4765259.500, 0, 0) + ( 479819.844, 4765180.500, 0, 0) + ( 479779.844, 4765109.500, 0, 0) + ( 479681.781, 4764940.000, 0, 0) + ( 479468.000, 4764942.500, 0, 0) + ( 479411.438, 4764940.500, 0, 0) + ( 479353.000, 4764939.500, 0, 0) + ( 479208.656, 4764882.500, 0, 0) + ( 479196.812, 4764879.000, 0, 0) + ( 479123.281, 4765015.000, 0, 0) + ( 479046.531, 4765117.000, 0, 0) + ( 479029.719, 4765110.500, 0, 0) + ( 479014.938, 4765147.500, 0, 0) + ( 479149.938, 4765200.500, 0, 0) + ( 479639.625, 4765399.500, 0, 0) + ( 480035.344, 4765558.500, 0, 0) + +Shape:2 (Polygon) nVertices=54, nParts=1 + Bounds:( 480882.688, 4763472.500, 0, 0) + to ( 484519.969, 4765410.000, 0, 0) + ( 481575.000, 4764999.500, 0, 0) Ring + ( 481542.312, 4765097.500, 0, 0) + ( 481443.688, 4765387.500, 0, 0) + ( 481499.656, 4765410.000, 0, 0) + ( 481631.000, 4765031.000, 0, 0) + ( 481693.312, 4764853.000, 0, 0) + ( 481759.281, 4764889.500, 0, 0) + ( 481860.031, 4764920.000, 0, 0) + ( 482002.969, 4764910.000, 0, 0) + ( 482180.094, 4764909.500, 0, 0) + ( 482359.812, 4764960.000, 0, 0) + ( 482510.500, 4765065.000, 0, 0) + ( 482619.906, 4765080.500, 0, 0) + ( 482809.500, 4765090.000, 0, 0) + ( 483189.812, 4765084.500, 0, 0) + ( 483330.312, 4765105.500, 0, 0) + ( 483591.094, 4765260.000, 0, 0) + ( 483700.500, 4765280.000, 0, 0) + ( 483799.938, 4765270.000, 0, 0) + ( 484039.844, 4765280.500, 0, 0) + ( 484115.688, 4765300.000, 0, 0) + ( 484120.625, 4765280.000, 0, 0) + ( 484131.125, 4765260.000, 0, 0) + ( 484167.844, 4765271.000, 0, 0) + ( 484277.875, 4765015.500, 0, 0) + ( 484455.062, 4764500.000, 0, 0) + ( 484519.969, 4764345.000, 0, 0) + ( 484482.031, 4764332.000, 0, 0) + ( 483904.719, 4764113.500, 0, 0) + ( 483334.844, 4763905.000, 0, 0) + ( 482941.031, 4763760.500, 0, 0) + ( 482590.719, 4763624.500, 0, 0) + ( 482185.656, 4763472.500, 0, 0) + ( 482009.844, 4763980.500, 0, 0) + ( 481960.438, 4764099.500, 0, 0) + ( 481767.500, 4764014.500, 0, 0) + ( 480955.500, 4763700.000, 0, 0) + ( 480882.688, 4763670.000, 0, 0) + ( 481039.938, 4763889.500, 0, 0) + ( 481130.312, 4763979.500, 0, 0) + ( 481143.438, 4764010.500, 0, 0) + ( 481199.844, 4764180.000, 0, 0) + ( 481141.625, 4764480.500, 0, 0) + ( 481140.469, 4764510.500, 0, 0) + ( 481159.938, 4764580.000, 0, 0) + ( 481185.500, 4764607.000, 0, 0) + ( 481199.219, 4764623.500, 0, 0) + ( 481209.812, 4764633.500, 0, 0) + ( 481235.312, 4764650.000, 0, 0) + ( 481635.969, 4764795.500, 0, 0) + ( 481645.312, 4764797.500, 0, 0) + ( 481629.844, 4764829.500, 0, 0) + ( 481602.125, 4764915.500, 0, 0) + ( 481575.000, 4764999.500, 0, 0) + +Shape:3 (Polygon) nVertices=29, nParts=1 + Bounds:( 479117.812, 4764505.000, 0, 0) + to ( 480088.812, 4765409.500, 0, 0) + ( 479819.844, 4765180.500, 0, 0) Ring + ( 479859.875, 4765270.000, 0, 0) + ( 479909.875, 4765370.000, 0, 0) + ( 479980.219, 4765409.500, 0, 0) + ( 480019.719, 4765319.500, 0, 0) + ( 480059.906, 4765239.500, 0, 0) + ( 480088.812, 4765139.500, 0, 0) + ( 480082.969, 4765049.500, 0, 0) + ( 480000.281, 4765043.000, 0, 0) + ( 479934.969, 4765020.000, 0, 0) + ( 479895.125, 4765000.000, 0, 0) + ( 479734.375, 4764865.000, 0, 0) + ( 479680.281, 4764852.000, 0, 0) + ( 479644.781, 4764827.500, 0, 0) + ( 479637.875, 4764803.000, 0, 0) + ( 479617.219, 4764760.000, 0, 0) + ( 479587.281, 4764718.000, 0, 0) + ( 479548.031, 4764693.500, 0, 0) + ( 479504.906, 4764609.500, 0, 0) + ( 479239.812, 4764505.000, 0, 0) + ( 479117.812, 4764847.000, 0, 0) + ( 479196.812, 4764879.000, 0, 0) + ( 479208.656, 4764882.500, 0, 0) + ( 479353.000, 4764939.500, 0, 0) + ( 479411.438, 4764940.500, 0, 0) + ( 479468.000, 4764942.500, 0, 0) + ( 479681.781, 4764940.000, 0, 0) + ( 479779.844, 4765109.500, 0, 0) + ( 479819.844, 4765180.500, 0, 0) + +Shape:4 (Polygon) nVertices=22, nParts=1 + Bounds:( 480537.156, 4764738.000, 0, 0) + to ( 481575.000, 4765387.500, 0, 0) + ( 480537.156, 4765014.000, 0, 0) Ring + ( 481090.281, 4765242.000, 0, 0) + ( 481443.688, 4765387.500, 0, 0) + ( 481542.312, 4765097.500, 0, 0) + ( 481575.000, 4764999.500, 0, 0) + ( 481538.906, 4764982.500, 0, 0) + ( 481509.656, 4764967.000, 0, 0) + ( 481457.375, 4764937.000, 0, 0) + ( 481465.906, 4764872.500, 0, 0) + ( 481291.094, 4764810.000, 0, 0) + ( 481281.312, 4764876.500, 0, 0) + ( 481136.844, 4764994.500, 0, 0) + ( 481088.188, 4764936.000, 0, 0) + ( 480984.250, 4764875.000, 0, 0) + ( 480930.719, 4764852.000, 0, 0) + ( 480922.031, 4764850.500, 0, 0) + ( 480824.969, 4764820.000, 0, 0) + ( 480761.469, 4764778.000, 0, 0) + ( 480701.062, 4764738.000, 0, 0) + ( 480605.000, 4764835.000, 0, 0) + ( 480567.969, 4764918.000, 0, 0) + ( 480537.156, 4765014.000, 0, 0) + +Shape:5 (Polygon) nVertices=60, nParts=1 + Bounds:( 484482.031, 4760649.500, 0, 0) + to ( 488408.281, 4765179.000, 0, 0) + ( 484482.031, 4764332.000, 0, 0) Ring + ( 484519.969, 4764345.000, 0, 0) + ( 484817.938, 4764465.500, 0, 0) + ( 485615.406, 4764770.000, 0, 0) + ( 486269.688, 4765010.000, 0, 0) + ( 486320.062, 4765024.000, 0, 0) + ( 486340.594, 4765040.000, 0, 0) + ( 486369.844, 4765050.000, 0, 0) + ( 486719.969, 4765170.000, 0, 0) + ( 486738.625, 4765179.000, 0, 0) + ( 486987.781, 4764497.500, 0, 0) + ( 487019.875, 4764384.500, 0, 0) + ( 487077.375, 4764226.500, 0, 0) + ( 487120.031, 4764100.000, 0, 0) + ( 487160.250, 4763998.000, 0, 0) + ( 487186.812, 4763922.500, 0, 0) + ( 487408.250, 4763315.500, 0, 0) + ( 487608.062, 4762780.000, 0, 0) + ( 487659.406, 4762650.000, 0, 0) + ( 487719.406, 4762480.000, 0, 0) + ( 487741.062, 4762419.500, 0, 0) + ( 487747.875, 4762395.500, 0, 0) + ( 487880.875, 4762032.000, 0, 0) + ( 487899.438, 4761975.500, 0, 0) + ( 488082.000, 4761480.000, 0, 0) + ( 488408.281, 4760649.500, 0, 0) + ( 488050.375, 4760824.500, 0, 0) + ( 487690.906, 4760802.000, 0, 0) + ( 487640.062, 4760879.500, 0, 0) + ( 487594.938, 4761023.000, 0, 0) + ( 487341.375, 4761776.500, 0, 0) + ( 487037.125, 4761672.500, 0, 0) + ( 487005.375, 4761662.500, 0, 0) + ( 486788.219, 4761579.500, 0, 0) + ( 486822.250, 4761492.000, 0, 0) + ( 486838.312, 4761437.500, 0, 0) + ( 486841.312, 4761381.000, 0, 0) + ( 486850.562, 4761340.000, 0, 0) + ( 486810.750, 4761335.500, 0, 0) + ( 486775.438, 4761400.000, 0, 0) + ( 486710.094, 4761368.000, 0, 0) + ( 486606.188, 4761330.000, 0, 0) + ( 486548.656, 4761488.000, 0, 0) + ( 486380.656, 4761428.500, 0, 0) + ( 486152.906, 4761348.000, 0, 0) + ( 485900.250, 4761250.500, 0, 0) + ( 485666.875, 4761156.500, 0, 0) + ( 485585.875, 4761374.500, 0, 0) + ( 485564.875, 4761444.500, 0, 0) + ( 485496.219, 4761614.500, 0, 0) + ( 485438.688, 4761760.500, 0, 0) + ( 485264.969, 4762222.500, 0, 0) + ( 485192.688, 4762439.000, 0, 0) + ( 485175.406, 4762493.500, 0, 0) + ( 484947.344, 4763100.500, 0, 0) + ( 484888.000, 4763260.500, 0, 0) + ( 484785.469, 4763560.500, 0, 0) + ( 484760.219, 4763659.500, 0, 0) + ( 484696.969, 4763734.000, 0, 0) + ( 484482.031, 4764332.000, 0, 0) + +Shape:6 (Polygon) nVertices=26, nParts=1 + Bounds:( 478315.531, 4764174.000, 0, 0) + to ( 479305.875, 4765147.500, 0, 0) + ( 479014.938, 4765147.500, 0, 0) Ring + ( 479029.719, 4765110.500, 0, 0) + ( 479117.812, 4764847.000, 0, 0) + ( 479239.812, 4764505.000, 0, 0) + ( 479305.875, 4764361.000, 0, 0) + ( 479256.031, 4764314.500, 0, 0) + ( 479220.906, 4764212.500, 0, 0) + ( 479114.500, 4764174.000, 0, 0) + ( 479018.281, 4764418.500, 0, 0) + ( 478896.938, 4764371.000, 0, 0) + ( 478748.812, 4764308.500, 0, 0) + ( 478503.031, 4764218.000, 0, 0) + ( 478461.750, 4764337.500, 0, 0) + ( 478443.938, 4764400.500, 0, 0) + ( 478447.812, 4764454.000, 0, 0) + ( 478448.688, 4764531.500, 0, 0) + ( 478502.188, 4764541.500, 0, 0) + ( 478683.000, 4764730.500, 0, 0) + ( 478621.031, 4764788.500, 0, 0) + ( 478597.344, 4764766.500, 0, 0) + ( 478532.500, 4764695.500, 0, 0) + ( 478460.125, 4764615.000, 0, 0) + ( 478408.062, 4764654.000, 0, 0) + ( 478315.531, 4764876.000, 0, 0) + ( 478889.250, 4765100.000, 0, 0) + ( 479014.938, 4765147.500, 0, 0) + +Shape:7 (Polygon) nVertices=6, nParts=1 + Bounds:( 479029.719, 4764847.000, 0, 0) + to ( 479196.812, 4765117.000, 0, 0) + ( 479029.719, 4765110.500, 0, 0) Ring + ( 479046.531, 4765117.000, 0, 0) + ( 479123.281, 4765015.000, 0, 0) + ( 479196.812, 4764879.000, 0, 0) + ( 479117.812, 4764847.000, 0, 0) + ( 479029.719, 4765110.500, 0, 0) + +Shape:8 (Polygon) nVertices=20, nParts=1 + Bounds:( 479504.906, 4764609.500, 0, 0) + to ( 480133.969, 4765049.500, 0, 0) + ( 480082.969, 4765049.500, 0, 0) Ring + ( 480080.281, 4764979.500, 0, 0) + ( 480133.969, 4764856.500, 0, 0) + ( 479968.469, 4764788.000, 0, 0) + ( 479750.688, 4764702.000, 0, 0) + ( 479735.906, 4764752.000, 0, 0) + ( 479640.094, 4764721.000, 0, 0) + ( 479658.594, 4764670.000, 0, 0) + ( 479504.906, 4764609.500, 0, 0) + ( 479548.031, 4764693.500, 0, 0) + ( 479587.281, 4764718.000, 0, 0) + ( 479617.219, 4764760.000, 0, 0) + ( 479637.875, 4764803.000, 0, 0) + ( 479644.781, 4764827.500, 0, 0) + ( 479680.281, 4764852.000, 0, 0) + ( 479734.375, 4764865.000, 0, 0) + ( 479895.125, 4765000.000, 0, 0) + ( 479934.969, 4765020.000, 0, 0) + ( 480000.281, 4765043.000, 0, 0) + ( 480082.969, 4765049.500, 0, 0) + +Shape:9 (Polygon) nVertices=31, nParts=1 + Bounds:( 479968.469, 4764183.000, 0, 0) + to ( 480731.656, 4765014.000, 0, 0) + ( 480389.688, 4764950.000, 0, 0) Ring + ( 480537.156, 4765014.000, 0, 0) + ( 480567.969, 4764918.000, 0, 0) + ( 480605.000, 4764835.000, 0, 0) + ( 480701.062, 4764738.000, 0, 0) + ( 480710.250, 4764690.500, 0, 0) + ( 480588.594, 4764740.500, 0, 0) + ( 480540.719, 4764741.000, 0, 0) + ( 480515.125, 4764695.000, 0, 0) + ( 480731.656, 4764561.500, 0, 0) + ( 480692.188, 4764453.500, 0, 0) + ( 480677.844, 4764439.000, 0, 0) + ( 480655.344, 4764397.500, 0, 0) + ( 480584.375, 4764353.000, 0, 0) + ( 480500.406, 4764326.500, 0, 0) + ( 480358.531, 4764277.000, 0, 0) + ( 480192.312, 4764183.000, 0, 0) + ( 480157.125, 4764266.500, 0, 0) + ( 480234.312, 4764304.000, 0, 0) + ( 480289.125, 4764348.500, 0, 0) + ( 480316.000, 4764395.000, 0, 0) + ( 480343.562, 4764477.000, 0, 0) + ( 480343.719, 4764532.500, 0, 0) + ( 480258.031, 4764767.000, 0, 0) + ( 480177.156, 4764742.000, 0, 0) + ( 480093.750, 4764703.000, 0, 0) + ( 480011.000, 4764674.500, 0, 0) + ( 479985.062, 4764732.000, 0, 0) + ( 479968.469, 4764788.000, 0, 0) + ( 480133.969, 4764856.500, 0, 0) + ( 480389.688, 4764950.000, 0, 0) + +Shape:10 (Polygon) nVertices=61, nParts=1 + Bounds:( 479492.688, 4762880.500, 0, 0) + to ( 481645.312, 4764999.500, 0, 0) + ( 480701.062, 4764738.000, 0, 0) Ring + ( 480761.469, 4764778.000, 0, 0) + ( 480824.969, 4764820.000, 0, 0) + ( 480922.031, 4764850.500, 0, 0) + ( 480930.719, 4764852.000, 0, 0) + ( 480984.250, 4764875.000, 0, 0) + ( 481088.188, 4764936.000, 0, 0) + ( 481136.844, 4764994.500, 0, 0) + ( 481281.312, 4764876.500, 0, 0) + ( 481291.094, 4764810.000, 0, 0) + ( 481465.906, 4764872.500, 0, 0) + ( 481457.375, 4764937.000, 0, 0) + ( 481509.656, 4764967.000, 0, 0) + ( 481538.906, 4764982.500, 0, 0) + ( 481575.000, 4764999.500, 0, 0) + ( 481602.125, 4764915.500, 0, 0) + ( 481629.844, 4764829.500, 0, 0) + ( 481645.312, 4764797.500, 0, 0) + ( 481635.969, 4764795.500, 0, 0) + ( 481235.312, 4764650.000, 0, 0) + ( 481209.812, 4764633.500, 0, 0) + ( 481199.219, 4764623.500, 0, 0) + ( 481185.500, 4764607.000, 0, 0) + ( 481159.938, 4764580.000, 0, 0) + ( 481140.469, 4764510.500, 0, 0) + ( 481141.625, 4764480.500, 0, 0) + ( 481199.844, 4764180.000, 0, 0) + ( 481143.438, 4764010.500, 0, 0) + ( 481130.312, 4763979.500, 0, 0) + ( 481039.938, 4763889.500, 0, 0) + ( 480882.688, 4763670.000, 0, 0) + ( 480826.062, 4763650.500, 0, 0) + ( 480745.188, 4763628.500, 0, 0) + ( 480654.438, 4763627.500, 0, 0) + ( 480599.812, 4763660.000, 0, 0) + ( 480281.938, 4763576.500, 0, 0) + ( 480221.500, 4763533.500, 0, 0) + ( 480199.688, 4763509.000, 0, 0) + ( 480195.094, 4763430.000, 0, 0) + ( 480273.688, 4763305.500, 0, 0) + ( 480309.688, 4763063.500, 0, 0) + ( 480201.844, 4762962.500, 0, 0) + ( 479855.312, 4762880.500, 0, 0) + ( 479848.531, 4762897.000, 0, 0) + ( 479728.875, 4763217.500, 0, 0) + ( 479492.688, 4763850.000, 0, 0) + ( 479550.062, 4763919.500, 0, 0) + ( 480120.219, 4764188.500, 0, 0) + ( 480192.312, 4764183.000, 0, 0) + ( 480358.531, 4764277.000, 0, 0) + ( 480500.406, 4764326.500, 0, 0) + ( 480584.375, 4764353.000, 0, 0) + ( 480655.344, 4764397.500, 0, 0) + ( 480677.844, 4764439.000, 0, 0) + ( 480692.188, 4764453.500, 0, 0) + ( 480731.656, 4764561.500, 0, 0) + ( 480515.125, 4764695.000, 0, 0) + ( 480540.719, 4764741.000, 0, 0) + ( 480588.594, 4764740.500, 0, 0) + ( 480710.250, 4764690.500, 0, 0) + ( 480701.062, 4764738.000, 0, 0) + +Shape:11 (Polygon) nVertices=21, nParts=1 + Bounds:( 476732.906, 4763624.500, 0, 0) + to ( 478408.062, 4764876.000, 0, 0) + ( 478315.531, 4764876.000, 0, 0) Ring + ( 478408.062, 4764654.000, 0, 0) + ( 478325.250, 4764606.500, 0, 0) + ( 478220.094, 4764574.500, 0, 0) + ( 478140.344, 4764511.000, 0, 0) + ( 478065.062, 4764487.500, 0, 0) + ( 478080.938, 4764401.500, 0, 0) + ( 478110.500, 4764308.500, 0, 0) + ( 478149.969, 4764212.500, 0, 0) + ( 478180.219, 4764150.000, 0, 0) + ( 478192.500, 4764099.500, 0, 0) + ( 477893.125, 4763984.500, 0, 0) + ( 477417.031, 4763800.500, 0, 0) + ( 477005.594, 4763640.000, 0, 0) + ( 476958.312, 4763624.500, 0, 0) + ( 476947.250, 4763664.500, 0, 0) + ( 476732.906, 4764243.000, 0, 0) + ( 477322.375, 4764502.000, 0, 0) + ( 477599.906, 4764600.000, 0, 0) + ( 477949.656, 4764745.000, 0, 0) + ( 478315.531, 4764876.000, 0, 0) + +Shape:12 (Polygon) nVertices=22, nParts=1 + Bounds:( 478065.062, 4764099.500, 0, 0) + to ( 478683.000, 4764788.500, 0, 0) + ( 478408.062, 4764654.000, 0, 0) Ring + ( 478460.125, 4764615.000, 0, 0) + ( 478532.500, 4764695.500, 0, 0) + ( 478597.344, 4764766.500, 0, 0) + ( 478621.031, 4764788.500, 0, 0) + ( 478683.000, 4764730.500, 0, 0) + ( 478502.188, 4764541.500, 0, 0) + ( 478448.688, 4764531.500, 0, 0) + ( 478447.812, 4764454.000, 0, 0) + ( 478443.938, 4764400.500, 0, 0) + ( 478461.750, 4764337.500, 0, 0) + ( 478503.031, 4764218.000, 0, 0) + ( 478192.500, 4764099.500, 0, 0) + ( 478180.219, 4764150.000, 0, 0) + ( 478149.969, 4764212.500, 0, 0) + ( 478110.500, 4764308.500, 0, 0) + ( 478080.938, 4764401.500, 0, 0) + ( 478065.062, 4764487.500, 0, 0) + ( 478140.344, 4764511.000, 0, 0) + ( 478220.094, 4764574.500, 0, 0) + ( 478325.250, 4764606.500, 0, 0) + ( 478408.062, 4764654.000, 0, 0) + +Shape:13 (Polygon) nVertices=27, nParts=1 + Bounds:( 479239.812, 4763850.000, 0, 0) + to ( 480343.719, 4764788.000, 0, 0) + ( 479750.688, 4764702.000, 0, 0) Ring + ( 479968.469, 4764788.000, 0, 0) + ( 479985.062, 4764732.000, 0, 0) + ( 480011.000, 4764674.500, 0, 0) + ( 480093.750, 4764703.000, 0, 0) + ( 480177.156, 4764742.000, 0, 0) + ( 480258.031, 4764767.000, 0, 0) + ( 480343.719, 4764532.500, 0, 0) + ( 480343.562, 4764477.000, 0, 0) + ( 480316.000, 4764395.000, 0, 0) + ( 480289.125, 4764348.500, 0, 0) + ( 480234.312, 4764304.000, 0, 0) + ( 480157.125, 4764266.500, 0, 0) + ( 480192.312, 4764183.000, 0, 0) + ( 480120.219, 4764188.500, 0, 0) + ( 479550.062, 4763919.500, 0, 0) + ( 479492.688, 4763850.000, 0, 0) + ( 479487.750, 4763864.500, 0, 0) + ( 479442.750, 4763990.000, 0, 0) + ( 479436.000, 4764023.000, 0, 0) + ( 479398.938, 4764100.000, 0, 0) + ( 479349.625, 4764230.000, 0, 0) + ( 479305.875, 4764361.000, 0, 0) + ( 479239.812, 4764505.000, 0, 0) + ( 479504.906, 4764609.500, 0, 0) + ( 479658.594, 4764670.000, 0, 0) + ( 479750.688, 4764702.000, 0, 0) + +Shape:14 (Polygon) nVertices=5, nParts=1 + Bounds:( 479640.094, 4764670.000, 0, 0) + to ( 479750.688, 4764752.000, 0, 0) + ( 479750.688, 4764702.000, 0, 0) Ring + ( 479658.594, 4764670.000, 0, 0) + ( 479640.094, 4764721.000, 0, 0) + ( 479735.906, 4764752.000, 0, 0) + ( 479750.688, 4764702.000, 0, 0) + +Shape:15 (Polygon) nVertices=28, nParts=1 + Bounds:( 478503.031, 4763357.500, 0, 0) + to ( 479349.625, 4764418.500, 0, 0) + ( 479305.875, 4764361.000, 0, 0) Ring + ( 479349.625, 4764230.000, 0, 0) + ( 479218.156, 4764126.000, 0, 0) + ( 479128.344, 4764030.500, 0, 0) + ( 479103.406, 4764000.000, 0, 0) + ( 479099.594, 4763977.500, 0, 0) + ( 479080.812, 4763930.000, 0, 0) + ( 478999.812, 4763864.500, 0, 0) +------------------------------------------------------------------------- +Test 4: dump pline.dbf - uses new F field type +------------------------------------------------------------------------- +Field 0: Type=Integer, Title=`FNODE_', Width=11, Decimals=0 +Field 1: Type=Integer, Title=`TNODE_', Width=11, Decimals=0 +Field 2: Type=Integer, Title=`LPOLY_', Width=11, Decimals=0 +Field 3: Type=Integer, Title=`RPOLY_', Width=11, Decimals=0 +Field 4: Type=Double, Title=`LENGTH', Width=13, Decimals=3 +Field 5: Type=Integer, Title=`PLINE_', Width=11, Decimals=0 +Field 6: Type=Integer, Title=`PLINE_ID', Width=11, Decimals=0 +Field 7: Type=Integer, Title=`UID', Width=11, Decimals=0 +Field 8: Type=Integer, Title=`GISO_TYPE_', Width=11, Decimals=0 +Field 9: Type=Integer, Title=`SYMBOL', Width=6, Decimals=0 +Field 10: Type=Integer, Title=`LOCK__ID', Width=11, Decimals=0 +Field 11: Type=Integer, Title=`PHASE__ID', Width=6, Decimals=0 +Field 12: Type=Integer, Title=`OBJECT__ID', Width=11, Decimals=0 +Field 13: Type=String, Title=`TYPE', Width=50, Decimals=0 +Field 14: Type=Integer, Title=`SYM_NBR', Width=6, Decimals=0 +Field 15: Type=String, Title=`PHASE', Width=4, Decimals=0 +Field 16: Type=String, Title=`CKT_NM', Width=30, Decimals=0 +Field 17: Type=String, Title=`VOLTAGE', Width=30, Decimals=0 +Field 18: Type=String, Title=`CMPN', Width=30, Decimals=0 + +Record: 0 +FNODE_: 351 +TNODE_: 352 +LPOLY_: 0 +RPOLY_: 0 +LENGTH: 139.451 +PLINE_: 1 +PLINE_ID: 8588 +UID: 544484 +GISO_TYPE_: 13 +SYMBOL: 101 +LOCK__ID: 0 +PHASE__ID: 0 +OBJECT__ID: 131978 +TYPE: Overhead Primary +SYM_NBR: 101 +PHASE: ABC +CKT_NM: MED36 +VOLTAGE: (NULL) +CMPN: (NULL) + +Record: 1 +FNODE_: 352 +TNODE_: 362 +LPOLY_: 0 +RPOLY_: 0 +LENGTH: 158.033 +PLINE_: 2 +PLINE_ID: 8695 +UID: 544591 +------------------------------------------------------------------------- +Test 5: NULL Shapes. +------------------------------------------------------------------------- +Shapefile Type: Arc # of Shapes: 124 + +File Bounds: ( 257104.880, 5176098.606,0,0) + to ( 335497.500, 5226768.100,0,0) + +Shape:0 (Arc) nVertices=21, nParts=1 + Bounds:( 317138.450, 5176398.916, 0, 0) + to ( 317325.590, 5186063.780, 0, 0) + ( 317255.906, 5176398.916, 0, 0) Ring + ( 317188.010, 5176506.460, 0, 0) + ( 317176.920, 5176524.510, 0, 0) + ( 317165.340, 5176546.850, 0, 0) + ( 317157.950, 5176566.020, 0, 0) + ( 317150.020, 5176587.650, 0, 0) + ( 317140.130, 5176623.380, 0, 0) + ( 317138.700, 5176637.220, 0, 0) + ( 317138.450, 5176652.790, 0, 0) + ( 317194.710, 5177654.350, 0, 0) + ( 317208.900, 5178001.150, 0, 0) + ( 317257.240, 5178791.400, 0, 0) + ( 317233.330, 5179171.730, 0, 0) + ( 317178.860, 5179593.910, 0, 0) + ( 317177.430, 5180161.330, 0, 0) + ( 317179.910, 5181231.060, 0, 0) + ( 317191.120, 5182009.000, 0, 0) + ( 317217.150, 5182812.160, 0, 0) + ( 317251.760, 5184426.350, 0, 0) + ( 317285.550, 5185242.720, 0, 0) + ( 317325.590, 5186063.780, 0, 0) + +Shape:1 (Arc) nVertices=14, nParts=1 + Bounds:( 327417.340, 5176119.960, 0, 0) + to ( 327575.150, 5179522.550, 0, 0) + ( 327417.340, 5176119.960, 0, 0) Ring + ( 327472.250, 5177756.610, 0, 0) + ( 327475.670, 5178507.280, 0, 0) + ( 327487.420, 5179001.910, 0, 0) + ( 327488.760, 5179080.090, 0, 0) + ( 327485.310, 5179309.310, 0, 0) + ( 327487.010, 5179328.210, 0, 0) + ( 327491.800, 5179348.860, 0, 0) + ( 327499.800, 5179374.940, 0, 0) + ( 327512.980, 5179413.100, 0, 0) + ( 327527.290, 5179446.960, 0, 0) + ( 327538.870, 5179469.890, 0, 0) + ( 327552.260, 5179491.550, 0, 0) + ( 327575.150, 5179522.550, 0, 0) + +Shape:2 (Arc) nVertices=40, nParts=1 + Bounds:( 326935.880, 5180924.980, 0, 0) + to ( 327723.190, 5198803.660, 0, 0) + ( 327370.950, 5180924.980, 0, 0) Ring + ( 327410.070, 5181060.540, 0, 0) + ( 327512.850, 5181435.450, 0, 0) + ( 327518.640, 5181464.010, 0, 0) + ( 327523.700, 5181488.920, 0, 0) + ( 327524.500, 5181514.570, 0, 0) + ( 327468.010, 5182633.640, 0, 0) + ( 327500.040, 5183199.840, 0, 0) + ( 327499.600, 5183224.920, 0, 0) + ( 327484.700, 5183355.010, 0, 0) + ( 327483.690, 5183400.900, 0, 0) + ( 327483.840, 5183464.480, 0, 0) + ( 327486.010, 5183494.980, 0, 0) + ( 327571.280, 5184207.820, 0, 0) + ( 327617.210, 5184599.430, 0, 0) + ( 327620.420, 5184623.780, 0, 0) + ( 327625.530, 5184650.530, 0, 0) + ( 327698.430, 5184927.070, 0, 0) + ( 327702.100, 5184946.520, 0, 0) + ( 327717.940, 5185394.820, 0, 0) + ( 327723.190, 5185719.320, 0, 0) + ( 327719.460, 5185737.170, 0, 0) + ( 327712.090, 5185755.740, 0, 0) + ( 327699.840, 5185775.080, 0, 0) + ( 327683.830, 5185791.480, 0, 0) + ( 327665.380, 5185807.950, 0, 0) + ( 327641.970, 5185822.740, 0, 0) + ( 327622.280, 5185829.070, 0, 0) + ( 327604.950, 5185832.940, 0, 0) + ( 326937.500, 5185829.310, 0, 0) + ( 326935.880, 5187515.510, 0, 0) + ( 326983.050, 5189115.230, 0, 0) + ( 326998.860, 5189920.820, 0, 0) + ( 327060.240, 5190715.870, 0, 0) + ( 327123.230, 5192332.220, 0, 0) + ( 327179.920, 5193766.290, 0, 0) + ( 327185.490, 5193921.940, 0, 0) + ( 327204.120, 5195553.580, 0, 0) + ( 327218.270, 5197179.250, 0, 0) + ( 327251.330, 5198803.660, 0, 0) + +Shape:3 (NullShape) nVertices=0, nParts=0 + Bounds:( 0.000, 0.000, 0, 0) + to ( 0.000, 0.000, 0, 0) + +Shape:4 (NullShape) nVertices=0, nParts=0 + Bounds:( 0.000, 0.000, 0, 0) + to ( 0.000, 0.000, 0, 0) + +Shape:5 (NullShape) nVertices=0, nParts=0 + Bounds:( 0.000, 0.000, 0, 0) + to ( 0.000, 0.000, 0, 0) + +Shape:6 (Arc) nVertices=2, nParts=1 + Bounds:( 327123.230, 5192296.600, 0, 0) + to ( 328480.850, 5192332.220, 0, 0) + ( 327123.230, 5192332.220, 0, 0) Ring + ( 328480.850, 5192296.600, 0, 0) + +Shape:7 (Arc) nVertices=5, nParts=1 + Bounds:( 329222.060, 5217943.490, 0, 0) + to ( 335290.680, 5218084.780, 0, 0) + ( 329222.060, 5218084.780, 0, 0) Ring + ( 330442.520, 5218057.650, 0, 0) + ( 332059.960, 5218033.810, 0, 0) + ( 333685.820, 5218004.860, 0, 0) + ( 335290.680, 5217943.490, 0, 0) + +Shape:8 (Arc) nVertices=65, nParts=1 + Bounds:( 280048.100, 5177687.643, 0, 0) + to ( 280439.410, 5182567.120, 0, 0) + ( 280316.840, 5177687.643, 0, 0) Ring + ( 280325.310, 5177968.830, 0, 0) + ( 280324.630, 5178037.940, 0, 0) + ( 280324.150, 5178059.350, 0, 0) + ( 280320.130, 5178084.560, 0, 0) + ( 280299.860, 5178170.250, 0, 0) + ( 280288.710, 5178218.940, 0, 0) + ( 280274.280, 5178283.640, 0, 0) + ( 280268.000, 5178330.870, 0, 0) + ( 280267.910, 5178346.760, 0, 0) + ( 280270.510, 5178364.580, 0, 0) + ( 280274.820, 5178382.360, 0, 0) + ( 280278.440, 5178397.210, 0, 0) + ( 280351.400, 5178743.800, 0, 0) + ( 280369.860, 5178800.630, 0, 0) + ( 280378.670, 5178826.010, 0, 0) + ( 280400.350, 5178869.890, 0, 0) + ( 280414.870, 5178901.180, 0, 0) + ( 280427.030, 5178934.990, 0, 0) + ( 280436.250, 5178971.970, 0, 0) + ( 280439.410, 5178992.650, 0, 0) + ( 280439.170, 5179001.630, 0, 0) + ( 280437.010, 5179011.690, 0, 0) + ( 280434.930, 5179016.970, 0, 0) + ( 280431.870, 5179022.260, 0, 0) + ( 280413.610, 5179041.850, 0, 0) + ( 280410.040, 5179046.780, 0, 0) + ( 280406.640, 5179052.480, 0, 0) diff --git a/libs/shapelib/tests/test1.sh b/libs/shapelib/tests/test1.sh new file mode 100755 index 0000000..86ce986 --- /dev/null +++ b/libs/shapelib/tests/test1.sh @@ -0,0 +1,45 @@ +#!/bin/sh + +EG_DATA=/u/www/projects/shapelib/eg_data + +testdir="$(dirname "$(readlink -f $0)")" + +( +cd "$top_builddir" +echo ------------------------------------------------------------------------- +echo Test 1: dump anno.shp +echo ------------------------------------------------------------------------- +./shpdump $EG_DATA/anno.shp | head -250 + +echo ------------------------------------------------------------------------- +echo Test 2: dump brklinz.shp +echo ------------------------------------------------------------------------- +./shpdump $EG_DATA/brklinz.shp | head -500 + +echo ------------------------------------------------------------------------- +echo Test 3: dump polygon.shp +echo ------------------------------------------------------------------------- +./shpdump $EG_DATA/polygon.shp | head -500 + +echo ------------------------------------------------------------------------- +echo Test 4: dump pline.dbf - uses new F field type +echo ------------------------------------------------------------------------- +./dbfdump -m -h $EG_DATA/pline.dbf | head -50 + +echo ------------------------------------------------------------------------- +echo Test 5: NULL Shapes. +echo ------------------------------------------------------------------------- +./shpdump $EG_DATA/csah.dbf | head -150 +) > "$testdir/s1.out" + +result="$(diff "$testdir/s1.out" "$testdir/stream1.out")" +if [ "$result" == "" ]; then + echo "******* Stream 1 Succeeded *********" + rm "$testdir/s1.out" + exit 0 +else + echo "******* Stream 1 Failed *********" + echo "$result" + rm "$testdir/s1.out" + exit 1 +fi diff --git a/libs/shapelib/tests/test2.sh b/libs/shapelib/tests/test2.sh new file mode 100755 index 0000000..266fe54 --- /dev/null +++ b/libs/shapelib/tests/test2.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +testdir="$(dirname "$(readlink -f $0)")" + +( +cd "$top_builddir" +for i in 0 1 2 3 4 5 6 7 8 9 10 11 12 13; do + echo ----------------------------------------------------------------------- + echo Test 2/$i + echo ----------------------------------------------------------------------- + + ./shptest $i + ./shpdump test${i}.shp +done +) > "$testdir/s2.out" + +result="$(diff "$testdir/s2.out" "$testdir/stream2.out")" +if [ "$result" == "" ]; then + echo "******* Stream 2 Succeeded *********" + rm "$testdir/s2.out" + exit 0 +else + echo "******* Stream 2 Failed *********" + echo "$result" + rm "$testdir/s2.out" + exit 1 +fi diff --git a/libs/shapelib/tests/test3.sh b/libs/shapelib/tests/test3.sh new file mode 100755 index 0000000..900e218 --- /dev/null +++ b/libs/shapelib/tests/test3.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +# +# Use example programs to create a very simple dataset that +# should display in ARCView II. +# + +testdir="$(dirname "$(readlink -f $0)")" + +( +cd "$top_builddir" +./shpcreate test polygon +./dbfcreate test.dbf -s Description 30 -n TestInt 6 0 -n TestDouble 16 5 + +./shpadd test 0 0 100 0 100 100 0 100 0 0 + 20 20 20 30 30 30 20 20 +./dbfadd test.dbf "Square with triangle missing" 1.4 2.5 + +./shpadd test 150 150 160 150 180 170 150 150 +./dbfadd test.dbf "Smaller triangle" 100 1000.25 + +./shpadd test 150 150 160 150 180 170 150 150 +./dbfadd test.dbf "" "" "" + +./shpdump test.shp +./dbfdump test.dbf +) > "$testdir/s3.out" + +result=$(diff "$testdir/s3.out" "$testdir/stream3.out") +if [ "$result" == "" ]; then + echo "******* Stream 3 Succeeded *********" + rm "$testdir/s3.out" + exit 0 +else + echo "******* Stream 3 Failed *********" + echo "$result" + rm "$testdir/s3.out" + exit 1 +fi diff --git a/libs/shapelib/web/codepage.html b/libs/shapelib/web/codepage.html new file mode 100644 index 0000000..23a9cfb --- /dev/null +++ b/libs/shapelib/web/codepage.html @@ -0,0 +1,403 @@ + +This table is derived from:

+ +http://www.autopark.ru/ASBProgrammerGuide/DBFSTRUC.HTM

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDCodepageDescription
10x01437US MS-DOS
20x02850International MS-DOS
30x031252Windows ANSI Latin I
40x0410000Standard Macintosh
80x08865Danish OEM
90x09437Dutch OEM
100x0A850Dutch OEM*
110x0B437Finnish OEM
130x0D437French OEM
140x0E850French OEM*
150x0F437German OEM
160x10850German OEM*
170x11437Italian OEM
180x12850Italian OEM*
190x13932Japanese Shift-JIS
200x14850Spanish OEM*
210x15437Swedish OEM
220x16850Swedish OEM*
230x17865Norwegian OEM
240x18437Spanish OEM
250x19437English OEM (Great Britain)
260x1A850English OEM (Great Britain)*
270x1B437English OEM (US)
280x1C863French OEM (Canada)
290x1D850French OEM*
310x1F852Czech OEM
340x22852Hungarian OEM
350x23852Polish OEM
360x24860Portuguese OEM
370x25850Portuguese OEM*
380x26866Russian OEM
550x37850English OEM (US)*
640x40852Romanian OEM
770x4D936Chinese GBK (PRC)
780x4E949Korean (ANSI/OEM)
790x4F950Chinese Big5 (Taiwan)
800x50874Thai (ANSI/OEM)
870x57Current ANSI CPANSI
880x581252Western European ANSI
890x591252Spanish ANSI
1000x64852Eastern European MS-DOS
1010x65866Russian MS-DOS
1020x66865Nordic MS-DOS
1030x67861Icelandic MS-DOS
1040x68895Kamenicky (Czech) MS-DOS
1050x69620Mazovia (Polish) MS-DOS
1060x6A737Greek MS-DOS (437G)
1070x6B857Turkish MS-DOS
1080x6C863French-Canadian MS-DOS
1200x78950Taiwan Big 5
1210x79949Hangul (Wansung)
1220x7A936PRC GBK
1230x7B932Japanese Shift-JIS
1240x7C874Thai Windows/MSDOS
1340x86737Greek OEM
1350x87852Slovenian OEM
1360x88857Turkish OEM
1500x9610007Russian Macintosh
1510x9710029Eastern European Macintosh
1520x9810006Greek Macintosh
2000xC81250Eastern European Windows
2010xC91251Russian Windows
2020xCA1254Turkish Windows
2030xCB1253Greek Windows
2040xCC1257Baltic Windows
diff --git a/libs/shapelib/web/dbf_api.html b/libs/shapelib/web/dbf_api.html new file mode 100644 index 0000000..0bd0da1 --- /dev/null +++ b/libs/shapelib/web/dbf_api.html @@ -0,0 +1,434 @@ + + +Attribute (.DBF) API + + +

Attribute (.DBF) API

+ +The Attribute (DBF) API uses DBFHandle to represent a handle for access +to one .dbf file. The contents of the DBFHandle are visible (see shapefil.h) +but should be ignored by the application. It is intended that all information +be accessed by API functions. Note that there should be exactly one record +in the .dbf file for each shape in the .shp/.shx files. This constraint +must be maintained by the application.

+ + + +

DBFOpen()

+ +
+DBFHandle DBFOpen( const char * pszDBFFile, const char * pszAccess );
+
+  pszDBFFile:		The name of the xBase (.dbf) file to access.
+
+  pszAccess:		The fopen() style access string.  At this time only
+			"rb" (read-only binary) and "rb+" (read/write binary) 
+		        should be used.
+
+ + The DBFOpen() function should be used to establish access to an existing + xBase format table file. The returned DBFHandle is passed to other + access functions, and DBFClose() should be invoked to recover resources, and + flush changes to disk when complete. The DBFCreate() function should + called to create new xBase files. As a convenience, DBFOpen() can be + called with the name of a .shp or .shx file, and it will figure out the + name of the related .dbf file.

+ + + +

DBFCreate()

+ +
+DBFHandle DBFCreate( const char * pszDBFFile );
+
+  pszDBFFile:		The name of the xBase (.dbf) file to create.
+
+ + The DBFCreate() function creates a new xBase format file with the given + name, and returns an access handle that can be used with other DBF functions. + The newly created file will have no fields, and no records. Fields should + be added with DBFAddField() before any records add written. + + + +

DBFGetFieldCount()

+ +
+int DBFGetFieldCount( DBFHandle hDBF );
+
+  hDBF:		The access handle for the file to be queried, as returned
+                by DBFOpen(), or DBFCreate().
+
+ + The DBFGetFieldCount() function returns the number of fields currently + defined for the indicated xBase file. + + + +

DBFGetRecordCount()

+ +
+int DBFGetRecordCount( DBFHandle hDBF );
+
+  hDBF:		The access handle for the file to be queried, as returned by
+		DBFOpen(), or DBFCreate().
+
+ + The DBFGetRecordCount() function returns the number of records that + exist on the xBase file currently. Note that with shape files one xBase + record exists for each shape in the .shp/.shx files.

+ + + +

DBFGetFieldIndex()

+ +
+int DBFGetFieldIndex( DBFHandle hDBF, const char *pszFieldName );
+
+  hDBF:		The access handle for the file to be queried, as returned by
+		DBFOpen(), or DBFCreate().
+
+  pszFieldName: Name of the field to search for.
+
+ + Returns the index of the field matching this name, or -1 on failure. The + comparison is case insensitive. However, lengths must match exactly.

+ + + +

DBFGetFieldInfo()

+ +
+DBFFieldType DBFGetFieldInfo( DBFHandle hDBF, int iField, char * pszFieldName,
+                              int * pnWidth, int * pnDecimals );
+
+  hDBF:		The access handle for the file to be queried, as returned by
+		DBFOpen(), or DBFCreate().
+
+  iField:	The field to be queried.  This should be a number between 
+                0 and n-1, where n is the number fields on the file, as
+                returned by DBFGetFieldCount().
+
+  pszFieldName:	If this pointer is not NULL the name of the requested field
+		will be written to this location.  The pszFieldName buffer 
+                should be at least 12 character is size in order to hold
+		the longest possible field name of 11 characters plus a 
+                terminating zero character.
+
+  pnWidth:	If this pointer is not NULL, the width of the requested field
+		will be returned in the int pointed to by pnWidth.  This is
+                the width in characters.  
+
+  pnDecimals:	If this pointer is not NULL, the number of decimal places
+                precision defined for the field will be returned.  This is
+                zero for integer fields, or non-numeric fields.
+
+ + The DBFGetFieldInfo() returns the type of the requested field, which is + one of the DBFFieldType enumerated values. As well, the field name, and + field width information can optionally be returned. The field type returned + does not correspond one to one with the xBase field types. For instance + the xBase field type for Date will just be returned as being FTInteger.

+ +

+    typedef enum {
+      FTString,			/* fixed length string field 		*/
+      FTInteger,		/* numeric field with no decimals 	*/
+      FTDouble,			/* numeric field with decimals 		*/
+      FTLogical,		/* logical field.                       */
+      FTInvalid                 /* not a recognised field type 		*/
+    } DBFFieldType;
+
+ + + +

DBFAddField()

+ +
+int DBFAddField( DBFHandle hDBF, const char * pszFieldName, 
+                 DBFFieldType eType, int nWidth, int nDecimals );
+
+  hDBF:		The access handle for the file to be updated, as returned by
+		DBFOpen(), or DBFCreate().
+
+  pszFieldName:	The name of the new field.  At most 11 character will be used.
+                In order to use the xBase file in some packages it may be
+                necessary to avoid some special characters in the field names
+                such as spaces, or arithmetic operators.
+
+  eType:	One of FTString, FTInteger or FTDouble in order to establish
+                the type of the new field.  Note that some valid xBase field
+                types cannot be created such as date fields.
+
+  nWidth:	The width of the field to be created.  For FTString fields this
+                establishes the maximum length of string that can be stored.
+                For FTInteger this establishes the number of digits of the
+                largest number that can
+                be represented.  For FTDouble fields this in combination
+                with the nDecimals value establish the size, and precision
+                of the created field.
+
+  nDecimals:    The number of decimal places to reserve for FTDouble fields.
+                For all other field types this should be zero.  For instance
+                with nWidth=7, and nDecimals=3 numbers would be formatted
+                similarly to `123.456'.
+
+ + The DBFAddField() function is used to add new fields to an existing xBase + file opened with DBFOpen(), or created with DBFCreate().

+ + The DBFAddField() return value is the field number of the new field, or + -1 if the addition of the field failed.

+ + + +

DBFReadIntegerAttribute()

+ +
+int DBFReadIntegerAttribute( DBFHandle hDBF, int iShape, int iField );
+  
+  hDBF:		The access handle for the file to be queried, as returned by
+		DBFOpen(), or DBFCreate().
+
+  iShape:	The record number (shape number) from which the field value
+                should be read.
+
+  iField:	The field within the selected record that should be read.
+
+ + The DBFReadIntegerAttribute() will read the value of one field and return + it as an integer. This can be used even with FTString fields, though the + returned value will be zero if not interpretable as a number.

+ + + +

DBFReadDoubleAttribute()

+ +
+double DBFReadDoubleAttribute( DBFHandle hDBF, int iShape, int iField );
+  
+  hDBF:		The access handle for the file to be queried, as returned by
+		DBFOpen(), or DBFCreate().
+
+  iShape:	The record number (shape number) from which the field value
+                should be read.
+
+  iField:	The field within the selected record that should be read.
+
+ + The DBFReadDoubleAttribute() will read the value of one field and return + it as a double. This can be used even with FTString fields, though the + returned value will be zero if not interpretable as a number.

+ + + +

DBFReadStringAttribute()

+ +
+const char *DBFReadStringAttribute( DBFHandle hDBF, int iShape, int iField );
+  
+  hDBF:		The access handle for the file to be queried, as returned by
+		DBFOpen(), or DBFCreate().
+
+  iShape:	The record number (shape number) from which the field value
+                should be read.
+
+  iField:	The field within the selected record that should be read.
+
+ + The DBFReadStringAttribute() will read the value of one field and return + it as a string. This function may be used on any field type (including + FTInteger and FTDouble) and will return the string representation stored + in the .dbf file. The returned pointer is to an internal buffer + which is only valid untill the next DBF function call. It's contents may + be copied with normal string functions such as strcpy(), or strdup(). If + the TRIM_DBF_WHITESPACE macro is defined in shapefil.h (it is by default) + then all leading and trailing space (ASCII 32) characters will be stripped + before the string is returned.

+ + + +

DBFIsAttributeNULL()

+ +
+int DBFIsAttributeNULL( DBFHandle hDBF, int iShape, int iField );
+  
+  hDBF:		The access handle for the file to be queried, as returned by
+		DBFOpen(), or DBFCreate().
+
+  iShape:	The record number (shape number) from which the field value
+                should be read.
+
+  iField:	The field within the selected record that should be read.
+
+ + This function will return TRUE if the indicated field is NULL valued + otherwise FALSE. Note that NULL fields are represented in the .dbf file + as having all spaces in the field. Reading NULL fields will result in + a value of 0.0 or an empty string with the other DBFRead*Attribute() + functions.

+ + + +

DBFWriteIntegerAttribute

+ +
+int DBFWriteIntegerAttribute( DBFHandle hDBF, int iShape, int iField,
+                              int nFieldValue );
+
+  hDBF:		The access handle for the file to be written, as returned by
+		DBFOpen(), or DBFCreate().
+
+  iShape:	The record number (shape number) to which the field value
+                should be written.
+
+  iField:	The field within the selected record that should be written.
+
+  nFieldValue:	The integer value that should be written.
+
+ +The DBFWriteIntegerAttribute() function is used to write a value to a numeric +field (FTInteger, or FTDouble). If the write succeeds the value TRUE will +be returned, otherwise FALSE will be returned. If the value is too large to +fit in the field, it will be truncated and FALSE returned.

+ + + +

DBFWriteDoubleAttribute()

+ +
+int DBFWriteDoubleAttribute( DBFHandle hDBF, int iShape, int iField,
+                             double dFieldValue );
+
+  hDBF:		The access handle for the file to be written, as returned by
+		DBFOpen(), or DBFCreate().
+
+  iShape:	The record number (shape number) to which the field value
+                should be written.
+
+  iField:	The field within the selected record that should be written.
+
+  dFieldValue:	The floating point value that should be written.
+
+ +The DBFWriteDoubleAttribute() function is used to write a value to a numeric +field (FTInteger, or FTDouble). If the write succeeds the value TRUE will +be returned, otherwise FALSE will be returned. If the value is too large to +fit in the field, it will be truncated and FALSE returned.

+ + + +

DBFWriteStringAttribute()

+ +
+int DBFWriteStringAttribute( DBFHandle hDBF, int iShape, int iField,
+                             const char * pszFieldValue );
+
+  hDBF:		The access handle for the file to be written, as returned by
+		DBFOpen(), or DBFCreate().
+
+  iShape:	The record number (shape number) to which the field value
+                should be written.
+
+  iField:	The field within the selected record that should be written.
+
+  pszFieldValue: The string to be written to the field.
+
+ +The DBFWriteStringAttribute() function is used to write a value to a string +field (FString). If the write succeeds the value TRUE willbe returned, +otherwise FALSE will be returned. If the value is too large to +fit in the field, it will be truncated and FALSE returned.

+ + + +

DBFWriteNULLAttribute()

+ +
+int DBFWriteNULLAttribute( DBFHandle hDBF, int iShape, int iField );
+
+  hDBF:		The access handle for the file to be written, as returned by
+		DBFOpen(), or DBFCreate().
+
+  iShape:	The record number (shape number) to which the field value
+                should be written.
+
+  iField:	The field within the selected record that should be written.
+
+ +The DBFWriteNULLAttribute() function is used to clear the indicated field +to a NULL value. In the .dbf file this is represented by setting the entire +field to spaces. If the write succeeds the value TRUE willbe returned, +otherwise FALSE will be returned.

+ + + +

DBFClose()

+ +
+void DBFClose( DBFHandle hDBF );
+
+  hDBF:		The access handle for the file to be closed.
+
+ + The DBFClose() function will close the indicated xBase file (opened with + DBFOpen(), or DBFCreate()), flushing out all information to the file on + disk, and recovering any resources associated with having the file open. + The file handle (hDBF) should not be used again with the DBF API after + calling DBFClose().

+ + + +

DBFIsRecordDeleted()

+ +
+int DBFIsRecordDeleted( DBFHandle hDBF, int iShape );
+
+  hDBF:		The access handle for the file to be checked.
+  iShape:       The record index to check.
+
+ + Returns TRUE (non-zero) if the record is marked for deletion, otherwise + it returns FALSE.

+ + + +

DBFMarkRecordDeleted()

+ +
+int DBFMarkRecordDeleted( DBFHandle hDBF, int iShape, int bIsDeleted );
+
+  hDBF:		The access handle for the file.
+  iShape:       The record index to update.
+  bIsDeleted:   TRUE to mark record deleted, or FALSE to undelete it.
+
+ + Returns TRUE on success, or FALSE on error.

+ + + +

DBFGetNativeFieldType()

+ +
+char DBFGetNativeFieldType( DBFHandle hDBF, int iField );
+
+  hDBF:		The access handle for the file.
+  iField:       The field index to query.
+  
+
+ + This function returns the DBF type code of the indicated field. It will + be one of:

+ +

    +
  • 'C' (String) +
  • 'D' (Date) +
  • 'F' (Float) +
  • 'N' (Numeric, with or without decimal) +
  • 'L' (Logical) +
  • 'M' (Memo: 10 digits .DBT block ptr) +
  • ' ' (field out of range) +
+ + + diff --git a/libs/shapelib/web/index.html b/libs/shapelib/web/index.html new file mode 100644 index 0000000..19a4336 --- /dev/null +++ b/libs/shapelib/web/index.html @@ -0,0 +1,232 @@ + + +Shapefile C Library + + + + +

Shapefile C Library

+ +

Purpose

+ +The Shapefile C Library provides the ability to write simple C programs +for reading, writing and updating (to a limited extent) ESRI Shapefiles, +and the associated attribute file (.dbf).

+ +

Supporting Information

+ + + +

What is a Shapefile?

+ +If you don't know, you probably don't need this library. The Shapefile +format is a working and interchange format promulagated by +ESRI for simple vector data with attributes. +

+ +An excellent white paper on the shapefile format +is available from ESRI, +but it is .pdf format, so you will need Adobe Acrobat to browse it.

+ +The file format actually consists of three files.

+ +

+XXX.shp - holds the actual vertices.
+XXX.shx - hold index data pointing to the structures in the .shp file.
+XXX.dbf - holds the attributes in xBase (dBase) format.  
+
+ +

Download

+ +Source code, and some other odds and ends can be downloaded from +http://download.osgeo.org/shapelib.

+ +Shapelib is available for anonymous CVS access: + +

+  cvs -d :pserver:cvsanon@cvs.maptools.org:/cvs/maptools/cvsroot login
+  Password: (hit enter)
+  cvs -d :pserver:cvsanon@cvs.maptools.org:/cvs/maptools/cvsroot co shapelib
+
+ +

Bugs, Maintainance and Support

+ +This library is maintained by Frank +Warmerdam. Please send me bug reports, patches and suggestions for the +library via the maptools.org Bugzilla. Shapelib bugs can also be +queried. +

+ +Shapelib is hosted at +shapelib.maptools.org. A mailing +list for discussion of how to use shapelib, and announcing new releases +is +available. To only find out about new releases of Shapelib select the +"Subscribe to new releases" option from the link at +Freshmeat.

+ +

Credits

+ +I didn't start this section anywhere near soon enough, so alot of earlier +contributors to Shapelib are lost in pre-history. + +
    +
  • Bill Miller (NY-DOT) for shputils.c +
  • Carl Anderson for the contents of the contrib directory, and +the "tuple" additions to dbfopen.c. +
  • Andrea Giacomelli for patches for dbfopen.c. +
  • Doug Matthews for portability improvements. +
  • Jan-Oliver Wagner for convincing me to make it available under LGPL, +shared library support, and various other patches. +
  • Dennis Christopher (of Avenza) for testing and bug fixes. +
  • Miko Syrj (of 3D-system Oy) for a record size bug fix. +
  • Steven Lime and Curtis Hill for help with NULL shapes. +
  • Jim Matthews for support of NULL attributes in dbf files. +
  • PCI Geomatics who let me +release a modified version of their shapefile code in the beginning and +who hosted shapelib for years. +
+ +

In Memorium

+ +I would like to dedicate Shapelib to the memory of Sol Katz. While I never +met him in person, his generous contributions to the GIS community took +many forms, including free distribution of a variety of GIS translators +with source. The fact that he used this Shapelib in some of his utilities, +and thanked me was a great encouragement to me. I hope I can do his memory +honour by trying to contribute in a similar fashion.

+ +

Portability

+ +The Shapefile C Library should port easily to 32bit systems with ANSI C +compilers. It should work on 64 bit architectures (such as the DEC AXP).

+ +Care should also be taken to pass the binary access flag into SHPOpen() +and DBFOpen() when operating on systems with special text file translation +such as MSDOS.

+ +The shputils.c module is contributed, and may not take the same approach +to portability as the rest of the package.

+ +On Linux, and most unix systems it should be possible to build and +install shapefile support as a shared library using the "lib" and "lib_install" +targets of the Makefile. Note that this Makefile doesn't use autoconf +mechanisms and will generally require some hand tailoring for your environment. + +

Limitations

+ +
    + +
  • You can't modify the vertices of existing structures (though you + can update the attributes of existing structures, and create new + structures).

    + +

  • Not written in such a way as to be particularly fast. This is +particularly true of the 1.2 API. For applications more concerned with +speed it may be worth using the V1.1 API.

    + +

  • Doesn't set the last access time properly in the .dbf files.

    + +

  • There is no way to synchronize information to the file except to close it. +

    + +

  • Poor error checking and reporting.

    + +

  • Not professionally supported (well it can be, if you want to pay).

    + +

  • Some aspects of xBase files not supported, though I believe they are +not used by ESRI.

    + +

  • The application must keep the .dbf file in sync with the .shp/.shx +files through appropriate use of the DBF and SHP APIs.

    + +

  • No support for the undocumented .sbn/.sbx spatial index files.

    + +

+ +

Other Shapefile Resources

+ +
    +
  • Shapefile Format Specifications (pdf)

    + +

  • Xbase (.dbf) File Format Description.

    + +

  • Language ID / Code Page mappings

    + +

  • Shapelib is used within the multiformat +OGR library. If you are looking for a +high level C++ library with support for many geospatial vector formats you +might want to check it out.

    + +

  • Ari Jolma has produced an initial perl binding on top of shapelib, +which can be found at CPAN as Geo::ShapeFile under the +Geo module. +

    + +

  • Bernhard Herzog has produced python bindings for Shapelib with +SWIG, available at http://ftp.intevation.de/users/bh/pyshapelib. A new version not using swig is +available as part of Thuban.

    + +

  • Delphi +bindings for Shapelib courtesy of Alexander Weidauer.

    + +

  • Miguel Filgueiras has implemented +Tcl bindings for Shapelib +as part of GPSMan.

    + +

  • David Gancarz has implemented a Microsoft +.NET wrapper for +Shapelib. An example of using shapelib with VB6 is also icluded in the .NET wrapper project file.

    + +

  • Andrey Hristov (php at hristov dot com) has developed a PHP extension +based on Shapelib. It can be found in CVS at http://cvs.php.net/pecl/shp.

    + +

  • Toyoda Eizi has developed Ruby bindings found at +http://sourceforge.net/projects/ruby-shapelib.

    + +

  • Davide Cesari has developed FORTRAN bindings that can be found at + +http://www.webalice.it/o.drofa/davide/shapelib-fortran. + +
  • Jan-Oliver Wagner has implemented a commandline program +(gen2shp) for producing shapefiles from Arc/Info Generate format ASCII +files. He maintains a web page for his work.

    + +

  • Tom Russo has implemented a shpcs2cs program, which reprojects shapefiles +using arguments similar to the PROJ.4 cs2cs program including datum conversion. +Use as an alternate to the contrib/shpproj which doesn't do datums. It is +available at the bottom of Tom's Xastir Shapefile Resources page.

    + +

  • +Andrew Williamson's +Useful +Scripts and Stuff page for ArcView, which includes ShapeChecker.

    + +

  • The University of Bonn +sf4java project apparently includes Java classes for reading Shapefiles.

    + +

  • The ShapeIO2 Visual Basic libraries may be of interest to those wanting +VB access to Shapefiles. Also available locally.

    + +

  • The ShapeFile Read/Write OCX is another option for Visual Basic programmers.

    + +

  • Isovist Analyst is a sort-of-free isovist generating extension for +ArcView using shapelib.

    + +

  • shpdiff utility +by Bryce Nesbitt.

    + +

  • Aequometer: a program for +MS Excel to calculate the area of polygons and export as shapefiles.

    + +

+ + + diff --git a/libs/shapelib/web/license.html b/libs/shapelib/web/license.html new file mode 100644 index 0000000..8f82616 --- /dev/null +++ b/libs/shapelib/web/license.html @@ -0,0 +1,78 @@ + + +Shapelib License + + + + +

License

+ +The source for the Shapefile C Library is (c) 1998 Frank Warmerdam, +and released under the following conditions. The intent is that anyone +can do anything with the code, but that I do not assume any liability, nor +express any warranty for this code.

+ +As of Shapelib 1.2.6 the core portions of the library are made available +under two possible licenses. The licensee can choose to use the code +under either the Library GNU Public License (LGPL) described in +COPYING or under the following MIT style license. Any files in +the Shapelib distribution without explicit copyright license terms +(such as this documentation, the Makefile and so forth) should be +considered to have the following licensing terms. Some auxilary portions +of Shapelib, notably some of the components in the contrib directory +come under slightly different license restrictions. Check the source +files that you are actually using for conditions.

+ +

Default License Terms

+ + +Copyright (c) 1999, Frank Warmerdam

+ +This software is available under the following "MIT Style" license, +or at the option of the licensee under the LGPL (see COPYING). This +option is discussed in more detail in shapelib.html.

+ +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions:

+ +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software.

+ +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE.

+ + +

Shapelib Modifications

+ +I am pleased to receive bug fixes, and improvements for Shapelib. Unless +the submissions indicate otherwise I will assume that changes submitted to +me remain under the the above "dual license" terms. If changes are made +to the library with the intention that those changes should be protected by +the LGPL then I should be informed upon submission. Note that I will not +generally incorporate changes into the core of Shapelib that are protected +under the LGPL as this would effectively limit the whole file and +distribution to LGPL terms.

+ +

Opting for LGPL

+ +For licensee's opting to use Shapelib under LGPL as opposed to the MIT +Style license above, and wishing to redistribute the software based on +Shapelib, I would ask that all "dual license" modules be updated to +indicate that only the LGPL (and not the MIT Style license) applies. This +action represents opting for the LGPL, and thereafter LGPL terms apply to +any redistribution and modification of the affected modules.

+ + + + + + diff --git a/libs/shapelib/web/manifest.html b/libs/shapelib/web/manifest.html new file mode 100644 index 0000000..c512112 --- /dev/null +++ b/libs/shapelib/web/manifest.html @@ -0,0 +1,87 @@ + + +Shapefile C Library V1.2 + + + + +

Shapelib Manifest

+ +
    +
  • web/index.html: This file - general documentation on the +Shapefile C Library.

    + +

  • web/shp_api.html: Documentation +for the API for accessing the .shp/.shx files.

    + +

  • web/dbf_api.html: Documentation +for the API for accessing the .dbf attribute files.

    + +

  • shpopen.c: C code for access to .shp/.shx vertex files.

    + +

  • dbfopen.c: C code for access to .dbf attribute file.

    + +

  • shapefil.h: Include file defining all the services of dbfopen.c +and shpopen.c.

    + +

  • contrib/: A directory of "in progress" contributed programs +from Carl Anderson.

    + +

  • dbfcreate.c: Simple example program for creating a new .dbf file. +

    + +

  • dbfadd.c: + Simple example program for adding a record to a .dbf file.

    + +

  • dbfdump.c: Simple example program for displaying the contents of + a .dbf file.

    + +

  • shpcreate.c: Simple example program for creating a new .shp and +.shx file.

    + +

  • shpadd.c: Simple example program for adding a shape to an existing + shape file.

    + +

  • shpdump.c: Simple program for dumping all the vertices in a + shapefile with an indicating of the parts.

    + +

  • shputils.c: Complex contributed program capable of clipping and + appending + shapefiles as well as a few other things. Type shputils + after building to get a full usage message.

    + +

  • Makefile: A simple makefile to compile the library and example + programs.

    + +

  • makeshape.sh: A simple script for running some of the example +programs.

    + +

  • shptest.c: A simple test harnass to generate each of the supported + types of shapefiles.

    + + +

  • shptree.c: Implements a simple quadtree algorithm for fast +spatial searches of shapefiles.

    + +

  • shptreedump.c: A simple mainly showing information on quad +trees build using the quad tree api.

    + +

  • stream1.sh - A test script, which should produce stream1.out. +Note this will only work if you have the example data downloaded.

    + +

  • stream1.out: Expected output of stream1.sh test script.

    + +

  • stream2.sh: A test script, which should produce stream2.out.

    + +

  • stream2.out: Expected output of stream2.sh test script.

    + +

  • pyshapelib-0.1: Prototype contributed Python bindings.

    + +

+ + + + + + + diff --git a/libs/shapelib/web/maptools.css b/libs/shapelib/web/maptools.css new file mode 100644 index 0000000..0ff995d --- /dev/null +++ b/libs/shapelib/web/maptools.css @@ -0,0 +1,357 @@ +/* Redefined Tags */ + +body { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; +} +h1 { + font-family: Arial, Helvetica, sans-serif; + font-size: 24px; + line-height: 32px; + color: #006699; + border-bottom-width: 2px; + border-bottom-style: solid; + border-bottom-color: #80B3CC; +} +h2 { + font-family: Arial, Helvetica, sans-serif; + font-size: 20px; + line-height: 26px; + color: #006699; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: #80B3CC; +} +h3 { + font-family: Arial, Helvetica, sans-serif; + font-size: 16px; + line-height: 20px; + font-weight: bold; + color: #006699; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: #80B3CC; +} +h4 { + font-family: Arial, Helvetica, sans-serif; + font-size: 14px; + line-height: 18px; + font-weight: bold; + color: #006699; +} +h5 { + font-family: Arial, Helvetica, sans-serif; + font-size: 13px; + font-weight: bold; + color: #006699; +} +h6 { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + font-weight: bold; +} + +p { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + line-height: 16px; +} +span { + font-family: Arial, Helvetica, sans-serif; +} +div { + font-family: Arial, Helvetica, sans-serif; +} +blockquote { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; +} +pre { + font-family: "Courier New", Courier, mono; + font-size: 12px; +} +ol { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + line-height: 16px; +} +ul { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + line-height: 16px; + list-style-type: square; + list-style-image: url(images/bullets/squarebullet.gif); +} +ul.download { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + line-height: 16px; + list-style-type: square; + list-style-image: url(images/bullets/dlbullet.gif); +} +ul.document { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + line-height: 16px; + list-style-type: square; + list-style-image: url(images/bullets/pagebullet.gif); +} +li { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + line-height: 16px; + margin-top: 4px; +} +dl { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; +} +dd { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; +} +dt { + margin-top: 8px; + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; +} +td { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; +} +font { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; +} + + +a[href] { + font-family: Arial, Helvetica, sans-serif; + color: #006699; + text-decoration: underline; +} +a[href]:link { + font-family: Arial, Helvetica, sans-serif; + color: #006699; + text-decoration: underline; +} +a[href]:hover { + font-family: Arial, Helvetica, sans-serif; + color: #003366; + text-decoration: underline; +} +a[href]:visited { + font-family: Arial, Helvetica, sans-serif; + color: #003366; + text-decoration: underline; +} +a[href]:active { + font-family: Arial, Helvetica, sans-serif; + color: #199DBF; + text-decoration: underline; +} + + +/* Defined Classes */ + +.copyright { + font-family: Arial, Helvetica, sans-serif; + font-size: 10px; + line-height: 12px; + color: #FFFFFF; + text-decoration: none; +} +a.copyright { + font-family: Arial, Helvetica, sans-serif; + font-size: 10px; + line-height: 12px; + color: #FFFFFF; + text-decoration: none; +} +a.copyright:link { + font-family: Arial, Helvetica, sans-serif; + font-size: 10px; + line-height: 12px; + color: #FFFFFF; + text-decoration: none; +} +a.copyright:hover { + font-family: Arial, Helvetica, sans-serif; + font-size: 10px; + line-height: 12px; + color: #FFFFFF; + text-decoration: underline; +} +a.copyright:visited { + font-family: Arial, Helvetica, sans-serif; + font-size: 10px; + line-height: 12px; + color: #FFFFFF; + text-decoration: none; +} +a.copyright:active { + font-family: Arial, Helvetica, sans-serif; + font-size: 10px; + line-height: 12px; + color: #FFFFFF; + text-decoration: underline; +} + + +.TechNewsHead { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + color: #003366; + line-height: 16px; + margin:0px; + padding: 3px; + padding-top: 14px; + padding-left: 20px; + padding-right: 20px; +} +.TechNewsBody { + font-family: Arial, Helvetica, sans-serif; + font-size: 11px; + line-height: 13px; + color: #000000; + margin:0px; + padding: 3px; + padding-left: 20px; + padding-right: 20px; +} + + +.Intro { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + line-height: normal; + color: #003366; + background-color: #EFF3F7; + border: 1px dashed #DCE4ED; + padding: 6px; +} + +.shopbox { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + line-height: normal; + color: #003366; + border: 1px dashed #E7E4DA; + background-color: #F7F7EF; + padding: 6px; + padding-bottom: 18px; + padding-top: 18px; +} + +.shopboxTitle { + font-family: Arial, Helvetica, sans-serif; + font-size: 16px; + line-height: 20px; + font-weight: bold; + margin-bottom: 2px; + color: #006699; + text-align: left; +} + +.welcomeTitle { + font-family: Arial, Helvetica, sans-serif; + font-size: 16px; + line-height: 18px; + font-weight: bold; + color: #006699; + text-align: left; +} + +.license { + padding: 5px; + border: 1px solid #003366; +} +table.BlueBox { + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + background-color: #003366; + border-spacing: 1px; +} +td.BlueBox { + background-color: #EFF3F7; + font-size: 12px; + color: #003366; + margin:0px; + padding: 4px; +} + +.BlueCopyLt { + color: #006699; +} +.BlueCopyDk { + color: #003366; +} + + +.SideTitle { + font-size: 12px; + font-weight: bold; + line-height: 16px; + color: #003366; + margin:0px; + padding: 4px; + padding-left: 7px; +} +.SideMenuItem { + font-size: 11px; + line-height: 14px; + color: #003366; + margin:0px; + padding:4px; + padding-left: 7px; +} +.SideText { + font-size: 11px; + line-height: 14px; + margin:0px; + padding: 4px; + padding-left: 7px; +} +.TopMenu { + font-size: 11px; + color: #FFFFFF; + margin:0px; + padding: 4px; + padding-left: 7px; +} + +TopMenuItem { + font-size: 11px; + color: #FFFFFF; +} + +a.TopMenuItem { + font-size: 11px; + color: #FFFFFF; + text-decoration: underline; +} + +a.TopMenuItem:link { + font-size: 11px; + color: #FFFFFF; + text-decoration: underline; +} + +a.TopMenuItem:hover { + font-size: 11px; + color: #AFBFCF; + text-decoration: underline; +} + +a.TopMenuItem:visited { + font-size: 11px; + color: #FFFFFF; + text-decoration: underline; +} + +a.TopMenuItem:active { + font-size: 11px; + color: #A0CFFF; + text-decoration: underline; +} + diff --git a/libs/shapelib/web/release.html b/libs/shapelib/web/release.html new file mode 100644 index 0000000..ad2349d --- /dev/null +++ b/libs/shapelib/web/release.html @@ -0,0 +1,103 @@ + + +Shapelib Release Notes + + + + +

Shapelib Release Notes

+ +To get notification of new releases of Shapelib subscribe to +the project at www.freshmeat.net. This is currently the only reliable +way of finding out about new releases since there is no shapelib specific +mailing list.

+ +Release 1.4.1: +

    +
  • Fix a regression regarding re-writing the last shape + of a file (GDAL #7031) +
+ +Release 1.4.0: +
    +
  • Old Makefile build replaced by autoconf/automake (by Sandro Mani) +
  • CMake build system added (by Alan W. Irwin) +
  • Added read support for ESRI .sbn spatial index +
  • Resynchronization with GDAL's Shapefile driver. Mostly cleanups. + SHPObject and DBFInfo structures extended with new members +
  • Add DBFSetLastModifiedDate() to modify the update date in the .dbf +
  • Add SHPSetFastModeReadObject() to read faster (but shapes got that way + share state in the handle, so only one shape at a time can be used) +
  • Add SHPRestoreSHX() to recreate a missing .shx from the .shp and + SHPOpenLLEx(). +
  • Write DBF end-of-file character 0x1A by default. + This behaviour can be controlled with the DBFSetWriteEndOfFileChar() + function. +
+ +Release 1.3.0: +
    +
  • Major rework to us application provided hooks for file io, and error reporting (SAHooks). +
  • Added contrib/Shape_PointInPoly.cpp from Marko Podgorsek. +
  • Added shapelib tools documentation from Eduardo Patto Kanegae. +
  • Added dbf deletion support. +
  • Added DBFAddNativeFieldType(). +
  • Added DBFDeleteField(), DBFReorderFields() and DBFAlterFields() to +rework DBF schema. +
  • likely a variety of other changes - it has been eight years since 1.2.10! +
+ +Release 1.2.10: Added SHPRewindObject() function, and shprewind utility +program. Added FTLogical, DBFReadLogicalAttribute() and +DBFWriteLogicalAttribute() (thanks to Olek Neyman).

+ +Release 1.2.9: Good support for reading and writing NULL fields +in .dbf files, good support for NULL shapes and addition of the +DBFGetFieldIndex() functions (all contributed by Jim Matthews).

+ +An upgraded shputils.c has been contributed by Bill Miller. Daniel +Morissette contributed DBFGetNativeFieldType(). Better error checking +for disk errors in dbfopen.c. Various other bug fixes and safety improvements. +

+ +Release 1.2.8: Added hacked libtool support (supplied by Jan) +and "rpm ready" install logic.

+ +Release 1.2.7: Fix record size (was 4 bytes too long). Modify +SHPReadObject() to handle null shapes properly. Use atof() instead of +sscanf(). Support .DBF as well as .dbf.

+ +Release 1.2.6: Now available under old MIT style license, or at the +users option, LGPL. Added the contrib directory of stuff from Carl Anderson +and the shptree.c API for quadtree based spatial searches.

+ +Release 1.2.5: SHPOpen() now forcably uses "rb" or "r+b" access string +to avoid common mistakes on Windows. Also fixed a serious bug with .dbf +files with a 'F' field type.

+ +Release 1.2.4: DBFOpen() will now automatically translate a .shp +extension to .dbf for convenience. SHPOpen() will try datasets with lower +and uppercase extension. DBFAddField() now returns the field number, +not TRUE/FALSE.

+ +Release 1.2.3: Disable writing measures to multi-patches as ArcView +seems to puke on them (as reported by Monika Sester). Add white space +trimming, and string/numeric attribute interchangability in DBF API +as suggested by Steve Lime. Dbfdump was updated to include several +reporting options.

+ +Release 1.2.2: Added proper support for multipatch (reading and +writing) - this release just for testing purposes.

+ +Release 1.2 is mostly a rewrite of the .shp/.shx access API to account +for ArcView 3.x 3D shapes, and to encapsulate the shapes in a structure. +Existing code using the shapefile library will require substantial changes +to use release 1.2.

+ +Release V1.1 has been built on a number of platforms, and used by a +number of people successfully. V1.1 is the first release with the xBase API +documentation.

+ + + + diff --git a/libs/shapelib/web/shapelib-tools.html b/libs/shapelib/web/shapelib-tools.html new file mode 100644 index 0000000..6ff8ea3 --- /dev/null +++ b/libs/shapelib/web/shapelib-tools.html @@ -0,0 +1,352 @@ + + +ShapeLib Tools - User Guide + + + + +

ShapeLib Tools - User Guide

+ShapeLib is maintained by Frank Warmerdam
+This guide was created by Eduardo Patto Kanegae < eduardo~at~consultoria~dot~eti~dot~br > + + +

dbfcreate

+Purpose: creates a new and empty .dbf file. +
+Usage: dbfcreate xbase_file [[-s field_name width],[-n field_name width decimals]]... +
+
    +
  • xbase_file: the name of xBase file to be created. Doesn't need the extension.
  • +
  • -s field_name width: creates a string field with name field_name and size width.
  • +
  • -n field_name width decimals: creates a numeric field with name field_name, width of width and with decimals places sized by decimals.
  • +
+Example +
+$ dbfcreate testbase -s NAME 20, -n AREA 9 3, -n VALUE 9 2 +
# this will create a file named testbase.dbf with 3 fields: NAME ( string (20)), +AREA ( float (9,3)) and VALUE ( float (9,2)) +
+
+ +

dbfadd

+Purpose: adds a record into an existing .dbf file. +
+Usage: dbfadd xbase_file field_values +
+
    +
  • xbase_file: the name of an existing xBase file.
  • +
  • field_values: list of values to be inserted into the xBase file. + You must specify a number of values equal to the number of fields the xBase file has. + The order of values must also reflect the order of fields inside xBase file.
  • +
+Example +
+$ dbfadd testbase.dbf REGION1 25.656 150.22 +
# assuming that testbase.dbf has 3 fields( NAME, AREA and VALUE), this command line +will insert a new record into testbase.dbf with the value "REGION1" for NAME, +'25.656' for AREA and '150.22' for VALUE field. +
+
+ +

dbfdump

+Purpose: dumps the content of a xBase file to the terminal. +
+Usage: dbfdump [-h] [-r] [-m] xbase_file +
+
    +
  • -h: output header info( field descriptions).
  • +
  • -r: output raw field info, numeric values not reformatted.
  • +
  • -m: output one line per field.
  • +
  • xbase_file: the name of an existing xBase file.
  • +
+Example +
+$ dbfdump -h testbase.dbf +
# assuming that testbase.dbf has 1 record( inserted by previous example using 'dbfadd'), +this command line will produce the following output:
+ +Field 0: Type=String, Title=`NAME', Width=20, Decimals=0
+Field 1: Type=Double, Title=`AREA', Width=9, Decimals=3
+Field 2: Type=Double, Title=`VALUE', Width=9, Decimals=2
+NAME AREA VALUE
+REGION1 25.656 150.22 +
+
+
+ +

shpcreate

+Purpose: creates a new and empty shapefile. +
+Usage: shpcreate shp_file [point|arc|polygon|multipoint] +
+
    +
  • shp_file: the name of shapefile to be created. Doesn't need the extension.
  • +
  • point/arc/polygon/multipoint: the type of shapefile that you wish to create. You must specify a valid option.
  • +
+Example +
+$ shpcreate testpolygon polygon +
# this will create a point shapefile named testpolygon( in fact testpolygon.shp and testpolygon.shx will be created). +
+
+ +

shpadd

+Purpose: adds a shape into an existing shapefile. +
+Usage: shpadd shp_file [[x y] [+]]* +
+
    +
  • shp_file: the name of an existing shapefile.
  • +
  • x1 y1 x2 y2 ... xn yn: the set of x,y coordinates that describes the shape that you wish to add. Note that you must specify the correct number of parameters for a given type of shapefile. e.g.: for point shapefiles you have to pass 1 pair of XY coordinates and for a polygon shapefile you should pass at least 4 pairs of XY coordinates( where the first and the last point must have the same coordinates).
  • +
+Example +
+$ shpadd testpolygon 100000 7000000 250000 6500000 200000 6000000 100000 7000000 +
# assuming that testpolygon is a polygon shapefile, this command line will insert a new shape( a triangle) into testpolygon with the following XY coordinates:
+vertice 0: 100000 7000000 ( this will also be the vertice where the shape starts and ends)
+vertice 1: 250000 6500000
+vertice 2: 200000 6000000
+vertice 3: 100000 7000000
+
+ +

shpdump

+Purpose: dumps content of shapefile showing information like shape type, file extents, total of objects and vertices coordinates. +
+Usage: shpdump [-validate] shp_file +
+
    +
  • -validate: count the number of objects that has invalid ring orderings.
  • +
  • shp_file: the name of an existing shapefile.
  • +
+Example +
+$ shpdump testpolygon +
# assuming that testpolygon is an existing shapefile previously created, this command line will output the following result: +
Shapefile Type: Polygon   # of Shapes: 1
+
+File Bounds: (  100000.000, 6000000.000,0,0)
+         to  (  250000.000, 7000000.000,0,0)
+
+Shape:0 (Polygon)  nVertices=4, nParts=1
+  Bounds:(  100000.000, 6000000.000, 0, 0)
+      to (  250000.000, 7000000.000, 0, 0)
+     (  100000.000, 7000000.000, 0, 0) Ring
+     (  250000.000, 6500000.000, 0, 0)
+     (  200000.000, 6000000.000, 0, 0)
+     (  100000.000, 7000000.000, 0, 0)
+
+ +

shprewind

+Purpose: validates and resets the winding order of rings in polygon geometries to match the ordering required by shapefile specification. This is useful for shapefiles having troubles when checked with a 'shpdump -validate'. +
+Usage: shprewind in_shp_file out_shp_file +
+
    +
  • in_shp_file: the name of an existing shapefile.
  • +
  • out_shp_file: the name of the new fixed shapefile that will be created.
  • +
+Example +
+$ shprewind badshapefile newshapefile +
+
+ +

dbfinfo

+Purpose: displays basic information for a given xBase file, like number of columns, number of records and type of each column. +
+Usage: dbfinfo xbase_file +
+
    +
  • xbase_file: the name of an existing xBase file.
  • +
+Example +
+$ dbfinfo testbase +
+
Info for testbase.dbf
+3 Columns,  1 Records in file
+           NAME          string  (20,0)
+           AREA           float  (9,3)
+          VALUE           float  (9,2)
+
+
+
+ +

dbfcat

+Purpose: appends the records of a source xBase file into a destiny xBase file. Both files must have the same number of fields. +
+Usage: dbfcat [-v] [-f] from_DBFfile to_DBFfile +
+
    +
  • -v: verbose mode.
  • +
  • -f: forces data conversion if data field types is not the same at both files or if is there any null value into from_DBFfile.
  • +
  • from_DBFfile: source xBase file.
  • +
  • to_DBFfile: destiny xBase file.
  • +
+Example +
+$ dbfcat -v testbase1 testbase2 +
+
+ +

shpinfo

+Purpose: displays basic information for a given shapefile, like shapefile type, number of objects and its extents. +
+Usage: shpinfo shp_file +
+
    +
  • shp_file: the name of an existing shapefile.
  • +
+Example +
+$ shpinfo testpolygon +
+
Info for testpolygon
+Polygon(5), 1 Records in file
+File Bounds: (         100000,        6000000)
+        (         250000,        7000000)
+
+ +

shpcat

+Purpose: appends the content of a source shapefile into a destiny shapefile. Both files must be the same shapefile type. +
+Usage: shpcat from_shpfile to_shpfile +
+
    +
  • from_shpfile: source shapefile
  • +
  • to_shpfile: destiny shapefile
  • +
+Example +
+$ shpcat shapefile1 shapefile2 +
+
+ +

shpcentrd

+Purpose: computes XY centroid for polygon shapefiles. +
+Usage: shpcentrd shp_file new_shp_file +
+
    +
  • shp_file: the name of an existing polygon shapefile.
  • +
  • new_shp_file: the name of the point shapefile that will created.
  • +
+Example +
+$ shpcentrd apolygonfile pointcentrd +
+
+ +

shpdxf

+Purpose: creates a DXF file from an existing shapefile. +
+Usage: shpdxf shapefile {idfield} +
+
    +
  • shapefile: the name of an existing shapefile.
  • +
  • idfield: explain
  • +
+Example +
+$ shpdxf testshapefile IDFIELD +
# explain the command +
+
+ +

shpfix

+Purpose: Utility program to fix nulls and inconsistencies in Shapefiles +as happens from time to time. +
+Usage: shpfix shpfile new_file <Record# to Blank> +
+
    +
  • shpfile: input file
  • +
  • new_file: output file
  • +
+Example +
+$ shpfix broken fixed +
+
+ +

shpproj

+Purpose: Reproject Shapefiles using PROJ.4 +
+Usage: shpproj shp_file new_shp ( -i=in_proj_file | -i="in_params" | -i=geographic ) ( -o=out_info_file | -o="out_params" | -o=geographic ) +
+
    +
  • param1: explain
  • +
  • param2: explain
  • +
+

+ +INPUT
+ Input can come from one of three sources. A projection parameter file, + directly through parameters or geographic. If the shapefile has an associated + prj file, name the same as the shapefile but ending in ".prj" it will be used + by default ignoring all other parameters. If input is omitted it defaults to + geographic, unless the default prj file exists.

+ +OUTPUT
+ Output can come from one of three sources. A projection parameter file, + directly through parameters or geographic. If output is omitted it defaults + to geographic.

+ +PROJECTION PARAMETER FILE
+ This file MUST end with the extension ".prj". It has the form of one + projection parameter per line. Parameters can be in any order. The + projection parameters are those used to define a PROJ.4 projection.

+ +PROJECTION PARAMETERS
+ Are the same as used by proj and invproj.

+

+  use      proj -lP   to see available projections
+	   proj -lu   to see available units
+	   proj -le   to see available ellipsoid
+
+ +Or visit the PROJ.4 web page at http://www.remotesensing.org/proj for more details.

+ +

+ +Example
+ +the following example projects file rowtest to row3, moving data from Stateplane NAD83 zone 1002 to utm zone 16 in meters

+ +

+ 
+shpproj rowtest row -i="init=nad83:1002 units=us-ft" -o="proj=utm zone=16 units=m"
+
+shpproj rowtest row3 -o="proj=utm zone=18 units=m" -i="zone=16 proj=utm units=us-ft"
+
+shpproj rowtest row3 -o="proj=utm zone=18 units=m" 
+
+shpproj rowtest row3 -i=myfile.prj -o=geographic
+shpproj rowtest row3 -is=myfile.prj
+
+ +
+ + + diff --git a/libs/shapelib/web/shp_api.html b/libs/shapelib/web/shp_api.html new file mode 100644 index 0000000..d773e3e --- /dev/null +++ b/libs/shapelib/web/shp_api.html @@ -0,0 +1,376 @@ + + +.SHP File API + + + +

.SHP File API

+ +The .SHP API uses a SHPHandle to represent an open .shp/.shx file pair. +The contents of the SHPHandle are visible (see shapefile.h) but should +be ignored by the application. It is intended that all information be +accessed by the API functions.

+ + + +

Shape Types

+ +Shapes have types associated with them. The following is a list of the +different shapetypes supported by Shapefiles. At this time all shapes in +a Shapefile must be of the same type (with the exception of NULL shapes).

+ +

+  #define SHPT_NULL             0
+
+  2D Shape Types (pre ArcView 3.x):
+
+  #define SHPT_POINT		1	Points
+  #define SHPT_ARC		3	Arcs (Polylines, possible in parts)
+  #define SHPT_POLYGON		5	Polygons (possible in parts)
+  #define SHPT_MULTIPOINT	8	MultiPoint (related points)
+
+  3D Shape Types (may include "measure" values for vertices):
+
+  #define SHPT_POINTZ		11	
+  #define SHPT_ARCZ		13
+  #define SHPT_POLYGONZ		15
+  #define SHPT_MULTIPOINTZ 	18
+
+  2D + Measure Types:
+
+  #define SHPT_POINTM		21
+  #define SHPT_ARCM		23
+  #define SHPT_POLYGONM		25
+  #define SHPT_MULTIPOINTM 	28
+
+  Complex (TIN-like) with Z, and Measure:
+
+  #define SHPT_MULTIPATCH 	31
+
+ + + +

SHPObject

+ +An individual shape is represented by the SHPObject structure. SHPObject's +created with SHPCreateObject(), SHPCreateSimpleObject(), or SHPReadObject() +should be disposed of with SHPDestroyObject().

+ +

+  typedef struct
+  {
+    int		nSHPType;	Shape Type (SHPT_* - see list above)
+
+    int		nShapeId; 	Shape Number (-1 is unknown/unassigned)
+
+    int		nParts;		# of Parts (0 implies single part with no info)
+    int		*panPartStart;  Start Vertex of part
+    int		*panPartType;	Part Type (SHPP_RING if not SHPT_MULTIPATCH)
+    
+    int		nVertices;	Vertex list 
+    double	*padfX;		
+    double	*padfY;
+    double	*padfZ;		(all zero if not provided)
+    double	*padfM;		(all zero if not provided)
+
+    double	dfXMin;		Bounds in X, Y, Z and M dimensions
+    double	dfYMin;
+    double	dfZMin;
+    double	dfMMin;
+
+    double	dfXMax;
+    double	dfYMax;
+    double	dfZMax;
+    double	dfMMax;
+  } SHPObject;
+
+ + + +

SHPOpen()

+ +
+SHPHandle SHPOpen( const char * pszShapeFile, const char * pszAccess );
+
+  pszShapeFile:		The name of the layer to access.  This can be the
+			name of either the .shp or the .shx file or can
+			just be the path plus the basename of the pair.
+
+  pszAccess:		The fopen() style access string.  At this time only
+			"rb" (read-only binary) and "rb+" (read/write binary) 
+		        should be used.
+
+ + The SHPOpen() function should be used to establish access to the two files + for accessing vertices (.shp and .shx). Note that both files have to + be in the indicated directory, and must have the expected extensions in + lower case. The returned SHPHandle is passed to other access functions, + and SHPClose() should be invoked to recover resources, and flush changes + to disk when complete.

+ + + +

SHPGetInfo()

+ +
+void SHPGetInfo( SHPHandle hSHP, int * pnEntities, int * pnShapeType,
+                 double * padfMinBound, double * padfMaxBound );
+
+  hSHP:			The handle previously returned by SHPOpen() 
+			or SHPCreate().
+
+  pnEntities:		A pointer to an integer into which the number of
+			entities/structures should be placed.  May be NULL.
+
+  pnShapetype:		A pointer to an integer into which the shapetype
+			of this file should be placed.  Shapefiles may contain
+			either SHPT_POINT, SHPT_ARC, SHPT_POLYGON or 
+			SHPT_MULTIPOINT entities.  This may be NULL.
+
+  padfMinBound:		The X, Y, Z and M minimum values will be placed into
+                        this four entry array.  This may be NULL.
+			
+  padfMaxBound:		The X, Y, Z and M maximum values will be placed into
+                        this four entry array.  This may be NULL.
+
+ + The SHPGetInfo() function retrieves various information about shapefile + as a whole. The bounds are read from the file header, and may be + inaccurate if the file was improperly generated.

+ + + +

SHPReadObject()

+ +
+SHPObject *SHPReadObject( SHPHandle hSHP, int iShape );
+
+  hSHP:			The handle previously returned by SHPOpen() 
+			or SHPCreate().
+
+  iShape:		The entity number of the shape to read.  Entity 
+			numbers are between 0 and nEntities-1 (as returned
+			by SHPGetInfo()).
+
+ + The SHPReadObject() call is used to read a single structure, or entity + from the shapefile. See the definition of the SHPObject structure for + detailed information on fields of a SHPObject. SHPObject's returned from + SHPReadObject() should be deallocated with SHPDestroyShape(). + SHPReadObject() will return NULL if an illegal iShape value is requested.

+ + Note that the bounds placed into the SHPObject are those read from the + file, and may not be correct. For points the bounds are generated from + the single point since bounds aren't normally provided for point types.

+ + Generally the shapes returned will be of the type of the file as a whole. + However, any file may also contain type SHPT_NULL shapes which will have + no geometry. Generally speaking applications should skip rather than + preserve them, as they usually represented interactively deleted shapes.

+ + + +

SHPClose()

+ +
+void	SHPClose( SHPHandle hSHP );
+
+  hSHP:			The handle previously returned by SHPOpen() 
+			or SHPCreate().
+
+ + The SHPClose() function will close the .shp and .shx files, and flush + all outstanding header information to the files. It will also recover + resources associated with the handle. After this call the hSHP handle + cannot be used again.

+ + + +

SHPCreate()

+ +
+SHPHandle SHPCreate( const char * pszShapeFile, int nShapeType );
+
+  pszShapeFile:		The name of the layer to access.  This can be the
+			name of either the .shp or the .shx file or can
+			just be the path plus the basename of the pair.
+
+  nShapeType:		The type of shapes to be stored in the newly created
+			file.  It may be either SHPT_POINT, SHPT_ARC, 
+		        SHPT_POLYGON or SHPT_MULTIPOINT.
+
+ + The SHPCreate() function will create a new .shp and .shx file of the + desired type.

+ + + +

SHPCreateSimpleObject()

+ +
+SHPObject * 
+     SHPCreateSimpleObject( int nSHPType, int nVertices, 
+			    double *padfX, double * padfY, double *padfZ, );
+
+  nSHPType:		The SHPT_ type of the object to be created, such
+                        as SHPT_POINT, or SHPT_POLYGON.
+  
+  nVertices:		The number of vertices being passed in padfX,    
+                        padfY, and padfZ. 
+
+  padfX:		An array of nVertices X coordinates of the vertices
+                        for this object.
+
+  padfY:		An array of nVertices Y coordinates of the vertices
+                        for this object.
+
+  padfZ:		An array of nVertices Z coordinates of the vertices
+                        for this object.  This may be NULL in which case
+		        they are all assumed to be zero.
+
+ + The SHPCreateSimpleObject() allows for the convenient creation of + simple objects. This is normally used so that the SHPObject can be + passed to SHPWriteObject() to write it to the file. The simple object + creation API assumes an M (measure) value of zero for each vertex. For + complex objects (such as polygons) it is assumed that there is only one + part, and that it is of the default type (SHPP_RING).

+ + Use the SHPCreateObject() function for more sophisticated objects. The + SHPDestroyObject() function should be used to free resources associated with + an object allocated with SHPCreateSimpleObject().

+ + This function computes a bounding box for the SHPObject from the given + vertices.

+ + + +

SHPCreateObject()

+ +
+SHPObject * 
+     SHPCreateObject( int nSHPType, int iShape,
+                      int nParts, int * panPartStart, int * panPartType,
+                      int nVertices, double *padfX, double * padfY, 
+                      double *padfZ, double *padfM );
+
+  nSHPType:		The SHPT_ type of the object to be created, such
+                        as SHPT_POINT, or SHPT_POLYGON.
+
+  iShape:		The shapeid to be recorded with this shape.
+
+  nParts:		The number of parts for this object.  If this is
+                        zero for ARC, or POLYGON type objects, a single 
+                        zero valued part will be created internally.
+  
+  panPartStart:		The list of zero based start vertices for the rings
+                        (parts) in this object.  The first should always be
+                        zero.  This may be NULL if nParts is 0.
+  
+  panPartType:		The type of each of the parts.  This is only meaningful
+                        for MULTIPATCH files.  For all other cases this may
+                        be NULL, and will be assumed to be SHPP_RING.
+  
+  nVertices:		The number of vertices being passed in padfX,    
+                        padfY, and padfZ. 
+
+  padfX:		An array of nVertices X coordinates of the vertices
+                        for this object.
+
+  padfY:		An array of nVertices Y coordinates of the vertices
+                        for this object.
+
+  padfZ:		An array of nVertices Z coordinates of the vertices
+                        for this object.  This may be NULL in which case
+		        they are all assumed to be zero.
+
+  padfM:		An array of nVertices M (measure values) of the 
+			vertices for this object.  This may be NULL in which 
+			case they are all assumed to be zero.
+
+ + The SHPCreateSimpleObject() allows for the creation of objects (shapes). + This is normally used so that the SHPObject can be passed to + SHPWriteObject() to write it to the file.

+ + The SHPDestroyObject() function should be used to free resources associated + with an object allocated with SHPCreateObject().

+ + This function computes a bounding box for the SHPObject from the given + vertices.

+ + + +

SHPComputeExtents()

+ +
+void SHPComputeExtents( SHPObject * psObject );
+
+  psObject:		An existing shape object to be updated in place.
+
+ + This function will recompute the extents of this shape, replacing the + existing values of the dfXMin, dfYMin, dfZMin, dfMMin, dfXMax, dfYMax, + dfZMax, and dfMMax values based on the current set of vertices for the + shape. This function is automatically called by SHPCreateObject() but + if the vertices of an existing object are altered it should be called again + to fix up the extents.

+ + + +

SHPWriteObject()

+ +
+int SHPWriteObject( SHPHandle hSHP, int iShape, SHPObject *psObject );
+
+  hSHP:			The handle previously returned by SHPOpen("r+") 
+			or SHPCreate().
+
+  iShape:		The entity number of the shape to write.  A value of
+		        -1 should be used for new shapes.  
+
+  psObject:		The shape to write to the file. This should have
+                        been created with SHPCreateObject(), or 
+                        SHPCreateSimpleObject().
+
+ + The SHPWriteObject() call is used to write a single structure, or entity + to the shapefile. See the definition of the SHPObject structure for + detailed information on fields of a SHPObject. The return value is the + entity number of the written shape.

+ + + +

SHPDestroyObject()

+ +
+void SHPDestroyObject( SHPObject *psObject );
+
+  psObject:		The object to deallocate.
+
+ + This function should be used to deallocate the resources associated with + a SHPObject when it is no longer needed, including those created with + SHPCreateSimpleObject(), SHPCreateObject() and returned from SHPReadObject(). +

+ + + +

SHPRewindObject()

+ +
+int SHPRewindObject( SHPHandle hSHP, SHPObject *psObject );
+
+  hSHP:                 The shapefile (not used at this time).
+  psObject:		The object to deallocate.
+
+ + This function will reverse any rings necessary in order to enforce the + shapefile restrictions on the required order of inner and outer rings in + the Shapefile specification. It returns TRUE if a change is made and FALSE + if no change is made. Only polygon objects will be affected though any + object may be passed. +

+ + + diff --git a/qgcimages.qrc b/qgcimages.qrc index 7ae70c7..8a42f26 100644 --- a/qgcimages.qrc +++ b/qgcimages.qrc @@ -149,14 +149,6 @@ src/FirmwarePlugin/PX4/PX4BrandImage.png src/ui/toolbar/Images/Quad.svg src/AutoPilotPlugins/Common/Images/RadioComponentIcon.png - src/ui/toolbar/Images/RidEmergencyBackgroundHighlight.svg - src/ui/toolbar/Images/RidEmergencyBackground.svg - src/ui/toolbar/Images/RidFlagBackgroundGreen.svg - src/ui/toolbar/Images/RidFlagBackgroundRed.svg - src/ui/toolbar/Images/RidIconGreen.svg - src/ui/toolbar/Images/RidIconGrey.svg - src/ui/toolbar/Images/RidIconRed.svg - src/ui/toolbar/Images/RidIconYellow.svg src/ui/toolbar/Images/RC.svg src/AutoPilotPlugins/PX4/Images/RCLoss.svg src/AutoPilotPlugins/PX4/Images/RCLossLight.svg @@ -180,8 +172,6 @@ src/ui/toolbar/Images/Signal80.svg src/AutoPilotPlugins/Common/Images/StationMode.svg src/AutoPilotPlugins/APM/Images/SubFrameComponentIcon.png - src/AutoPilotPlugins/APM/Images/ForwardingSupportIcon.svg - src/AutoPilotPlugins/APM/Images/ForwardingSupportIconGreen.svg resources/CogWheels.png src/FlightMap/Images/sub.png src/ui/toolbar/Images/TelemRSSI.svg diff --git a/qgcresources.qrc b/qgcresources.qrc index be6ac2c..c35e1ce 100644 --- a/qgcresources.qrc +++ b/qgcresources.qrc @@ -31,7 +31,6 @@ resources/LockClosed.svg resources/LockOpen.svg resources/notile.png - resources/NoVideoBackground.jpg resources/Pause.svg resources/pause-mission.svg resources/pencil.svg @@ -55,9 +54,6 @@ resources/XDelete.svg resources/XDeleteBlack.svg resources/waypoint.svg - resources/Gripper.svg - resources/GripperRelease.svg - resources/GripperGrab.svg resources/icons/qgroundcontrol.ico diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index dc55248..21dd80e 100644 --- a/qgroundcontrol.pro +++ b/qgroundcontrol.pro @@ -45,10 +45,7 @@ MacBuild { } LinuxBuild { - CONFIG += qesp_linux_udev - system("$$QMAKE_LINK -fuse-ld=gold -Wl,--version &>/dev/null") { - CONFIG += use_gold_linker - } + CONFIG += qesp_linux_udev } WindowsBuild { @@ -182,12 +179,13 @@ contains (CONFIG, QGC_DISABLE_PX4_PLUGIN_FACTORY) { # Bluetooth contains (DEFINES, QGC_DISABLE_BLUETOOTH) { - message("Bluetooth support disabled (manual override from command line)") + message("Skipping support for Bluetooth (manual override from command line)") DEFINES -= QGC_ENABLE_BLUETOOTH } else:exists(user_config.pri):infile(user_config.pri, DEFINES, QGC_DISABLE_BLUETOOTH) { - message("Bluetooth support disabled (manual override from user_config.pri)") + message("Skipping support for Bluetooth (manual override from user_config.pri)") DEFINES -= QGC_ENABLE_BLUETOOTH } else:exists(user_config.pri):infile(user_config.pri, DEFINES, QGC_ENABLE_BLUETOOTH) { + message("Including support for Bluetooth (manual override from user_config.pri)") DEFINES += QGC_ENABLE_BLUETOOTH } @@ -356,9 +354,9 @@ CustomBuild { RESOURCES += $$PWD/resources/InstrumentValueIcons/InstrumentValueIcons.qrc } } else { - DEFINES += QGC_APPLICATION_NAME=\"\\\"QGroundControl\\\"\" - DEFINES += QGC_ORG_NAME=\"\\\"QGroundControl.org\\\"\" - DEFINES += QGC_ORG_DOMAIN=\"\\\"org.qgroundcontrol\\\"\" + DEFINES += QGC_APPLICATION_NAME=\"\\\"Spiri\\\"\" + DEFINES += QGC_ORG_NAME=\"\\\"Spiri.org\\\"\" + DEFINES += QGC_ORG_DOMAIN=\"\\\"org.spiri\\\"\" RESOURCES += \ $$PWD/qgroundcontrol.qrc \ $$PWD/qgcresources.qrc \ @@ -430,8 +428,6 @@ contains (DEFINES, QGC_ENABLE_PAIRING) { # HEADERS += \ - src/QmlControls/CustomAction.h \ - src/QmlControls/CustomActionManager.h \ src/QmlControls/QmlUnitsConversion.h \ src/Vehicle/VehicleEscStatusFactGroup.h \ src/api/QGCCorePlugin.h \ @@ -446,7 +442,6 @@ contains (DEFINES, QGC_ENABLE_PAIRING) { } SOURCES += \ - src/QmlControls/CustomActionManager.cc \ src/Vehicle/VehicleEscStatusFactGroup.cc \ src/api/QGCCorePlugin.cc \ src/api/QGCOptions.cc \ @@ -498,7 +493,6 @@ DebugBuild { PX4FirmwarePlugin { PX4FirmwarePluginFactory { APMFirmwarePlugin { src/MissionManager/TransectStyleComplexItemTestBase.h \ src/MissionManager/VisualMissionItemTest.h \ src/qgcunittest/ComponentInformationCacheTest.h \ - src/qgcunittest/ComponentInformationTranslationTest.h \ src/qgcunittest/GeoTest.h \ src/qgcunittest/MavlinkLogTest.h \ src/qgcunittest/MultiSignalSpy.h \ @@ -547,7 +541,6 @@ DebugBuild { PX4FirmwarePlugin { PX4FirmwarePluginFactory { APMFirmwarePlugin { src/MissionManager/TransectStyleComplexItemTestBase.cc \ src/MissionManager/VisualMissionItemTest.cc \ src/qgcunittest/ComponentInformationCacheTest.cc \ - src/qgcunittest/ComponentInformationTranslationTest.cc \ src/qgcunittest/GeoTest.cc \ src/qgcunittest/MavlinkLogTest.cc \ src/qgcunittest/MultiSignalSpy.cc \ @@ -649,7 +642,6 @@ HEADERS += \ src/Geo/PolarStereographic.hpp \ src/QGC.h \ src/QGCApplication.h \ - src/QGCCachedFileDownload.h \ src/QGCComboBox.h \ src/QGCConfig.h \ src/QGCFileDownload.h \ @@ -682,7 +674,6 @@ HEADERS += \ src/Settings/AppSettings.h \ src/Settings/AutoConnectSettings.h \ src/Settings/BrandImageSettings.h \ - src/Settings/RemoteIDSettings.h \ src/Settings/FirmwareUpgradeSettings.h \ src/Settings/FlightMapSettings.h \ src/Settings/FlyViewSettings.h \ @@ -712,19 +703,16 @@ HEADERS += \ src/Vehicle/CompInfoGeneral.h \ src/Vehicle/ComponentInformationCache.h \ src/Vehicle/ComponentInformationManager.h \ - src/Vehicle/ComponentInformationTranslation.h \ src/Vehicle/EventHandler.h \ src/Vehicle/FTPManager.h \ src/Vehicle/GPSRTKFactGroup.h \ - src/Vehicle/HealthAndArmingCheckReport.h \ + src/Vehicle/HealthAndArmingChecks.h \ src/Vehicle/ImageProtocolManager.h \ src/Vehicle/InitialConnectStateMachine.h \ src/Vehicle/MAVLinkLogManager.h \ src/Vehicle/MAVLinkStreamConfig.h \ src/Vehicle/MultiVehicleManager.h \ - src/Vehicle/RemoteIDManager.h \ src/Vehicle/StateMachine.h \ - src/Vehicle/StandardModes.h \ src/Vehicle/SysStatusSensorInfo.h \ src/Vehicle/TerrainFactGroup.h \ src/Vehicle/TerrainProtocolHandler.h \ @@ -745,8 +733,6 @@ HEADERS += \ src/Vehicle/VehicleVibrationFactGroup.h \ src/Vehicle/VehicleWindFactGroup.h \ src/Vehicle/VehicleHygrometerFactGroup.h \ - src/Vehicle/VehicleGeneratorFactGroup.h \ - src/Vehicle/VehicleEFIFactGroup.h \ src/VehicleSetup/JoystickConfigController.h \ src/comm/LinkConfiguration.h \ src/comm/LinkInterface.h \ @@ -799,7 +785,7 @@ contains (DEFINES, QGC_ENABLE_PAIRING) { } } -!contains(DEFINES, NO_SERIAL_LINK) { +!NoSerialBuild { HEADERS += \ src/comm/QGCSerialPortInfo.h \ src/comm/SerialLink.h \ @@ -908,7 +894,6 @@ SOURCES += \ src/Geo/PolarStereographic.cpp \ src/QGC.cc \ src/QGCApplication.cc \ - src/QGCCachedFileDownload.cc \ src/QGCComboBox.cc \ src/QGCFileDownload.cc \ src/QGCLoggingCategory.cc \ @@ -940,7 +925,6 @@ SOURCES += \ src/Settings/AppSettings.cc \ src/Settings/AutoConnectSettings.cc \ src/Settings/BrandImageSettings.cc \ - src/Settings/RemoteIDSettings.cc \ src/Settings/FirmwareUpgradeSettings.cc \ src/Settings/FlightMapSettings.cc \ src/Settings/FlyViewSettings.cc \ @@ -970,19 +954,16 @@ SOURCES += \ src/Vehicle/CompInfoGeneral.cc \ src/Vehicle/ComponentInformationCache.cc \ src/Vehicle/ComponentInformationManager.cc \ - src/Vehicle/ComponentInformationTranslation.cc \ src/Vehicle/EventHandler.cc \ src/Vehicle/FTPManager.cc \ src/Vehicle/GPSRTKFactGroup.cc \ - src/Vehicle/HealthAndArmingCheckReport.cc \ + src/Vehicle/HealthAndArmingChecks.cc \ src/Vehicle/ImageProtocolManager.cc \ src/Vehicle/InitialConnectStateMachine.cc \ src/Vehicle/MAVLinkLogManager.cc \ src/Vehicle/MAVLinkStreamConfig.cc \ src/Vehicle/MultiVehicleManager.cc \ - src/Vehicle/RemoteIDManager.cc \ src/Vehicle/StateMachine.cc \ - src/Vehicle/StandardModes.cc \ src/Vehicle/SysStatusSensorInfo.cc \ src/Vehicle/TerrainFactGroup.cc \ src/Vehicle/TerrainProtocolHandler.cc \ @@ -1002,8 +983,6 @@ SOURCES += \ src/Vehicle/VehicleTemperatureFactGroup.cc \ src/Vehicle/VehicleVibrationFactGroup.cc \ src/Vehicle/VehicleHygrometerFactGroup.cc \ - src/Vehicle/VehicleGeneratorFactGroup.cc \ - src/Vehicle/VehicleEFIFactGroup.cc \ src/Vehicle/VehicleWindFactGroup.cc \ src/VehicleSetup/JoystickConfigController.cc \ src/comm/LinkConfiguration.cc \ @@ -1033,7 +1012,7 @@ SOURCES += \ src/comm/MockLinkMissionItemHandler.cc \ } -!contains(DEFINES, NO_SERIAL_LINK) { +!NoSerialBuild { SOURCES += \ src/comm/QGCSerialPortInfo.cc \ src/comm/SerialLink.cc \ @@ -1088,7 +1067,7 @@ HEADERS+= \ src/FirmwarePlugin/FirmwarePluginManager.h \ src/VehicleSetup/VehicleComponent.h \ -!MobileBuild { !contains(DEFINES, NO_SERIAL_LINK) { +!MobileBuild { !NoSerialBuild { HEADERS += \ src/VehicleSetup/Bootloader.h \ src/VehicleSetup/FirmwareImage.h \ @@ -1110,7 +1089,7 @@ SOURCES += \ src/FirmwarePlugin/FirmwarePluginManager.cc \ src/VehicleSetup/VehicleComponent.cc \ -!MobileBuild { !contains(DEFINES, NO_SERIAL_LINK) { +!MobileBuild { !NoSerialBuild { SOURCES += \ src/VehicleSetup/Bootloader.cc \ src/VehicleSetup/FirmwareImage.cc \ @@ -1142,6 +1121,7 @@ APMFirmwarePlugin { src/AutoPilotPlugins/APM/APMAirframeComponentController.h \ src/AutoPilotPlugins/APM/APMAutoPilotPlugin.h \ src/AutoPilotPlugins/APM/APMCameraComponent.h \ + src/AutoPilotPlugins/APM/APMCompassCal.h \ src/AutoPilotPlugins/APM/APMFlightModesComponent.h \ src/AutoPilotPlugins/APM/APMFlightModesComponentController.h \ src/AutoPilotPlugins/APM/APMFollowComponent.h \ @@ -1157,7 +1137,6 @@ APMFirmwarePlugin { src/AutoPilotPlugins/APM/APMSensorsComponentController.h \ src/AutoPilotPlugins/APM/APMSubMotorComponentController.h \ src/AutoPilotPlugins/APM/APMTuningComponent.h \ - src/AutoPilotPlugins/APM/APMRemoteSupportComponent.h \ src/FirmwarePlugin/APM/APMFirmwarePlugin.h \ src/FirmwarePlugin/APM/APMParameterMetaData.h \ src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.h \ @@ -1170,6 +1149,7 @@ APMFirmwarePlugin { src/AutoPilotPlugins/APM/APMAirframeComponentController.cc \ src/AutoPilotPlugins/APM/APMAutoPilotPlugin.cc \ src/AutoPilotPlugins/APM/APMCameraComponent.cc \ + src/AutoPilotPlugins/APM/APMCompassCal.cc \ src/AutoPilotPlugins/APM/APMFlightModesComponent.cc \ src/AutoPilotPlugins/APM/APMFlightModesComponentController.cc \ src/AutoPilotPlugins/APM/APMFollowComponent.cc \ @@ -1185,7 +1165,6 @@ APMFirmwarePlugin { src/AutoPilotPlugins/APM/APMSensorsComponentController.cc \ src/AutoPilotPlugins/APM/APMSubMotorComponentController.cc \ src/AutoPilotPlugins/APM/APMTuningComponent.cc \ - src/AutoPilotPlugins/APM/APMRemoteSupportComponent.cc \ src/FirmwarePlugin/APM/APMFirmwarePlugin.cc \ src/FirmwarePlugin/APM/APMParameterMetaData.cc \ src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.cc \ @@ -1215,6 +1194,7 @@ PX4FirmwarePlugin { src/AutoPilotPlugins/PX4/AirframeComponentController.h \ src/AutoPilotPlugins/PX4/CameraComponent.h \ src/AutoPilotPlugins/PX4/FlightModesComponent.h \ + src/AutoPilotPlugins/PX4/PX4AdvancedFlightModesController.h \ src/AutoPilotPlugins/PX4/PX4AirframeLoader.h \ src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.h \ src/AutoPilotPlugins/PX4/PX4FlightBehavior.h \ @@ -1236,6 +1216,7 @@ PX4FirmwarePlugin { src/AutoPilotPlugins/PX4/AirframeComponentController.cc \ src/AutoPilotPlugins/PX4/CameraComponent.cc \ src/AutoPilotPlugins/PX4/FlightModesComponent.cc \ + src/AutoPilotPlugins/PX4/PX4AdvancedFlightModesController.cc \ src/AutoPilotPlugins/PX4/PX4AirframeLoader.cc \ src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.cc \ src/AutoPilotPlugins/PX4/PX4FlightBehavior.cc \ @@ -1350,6 +1331,123 @@ contains (DEFINES, QGC_GST_MICROHARD_DISABLED) { src/Microhard/MicrohardSettings.cc \ } } +#------------------------------------------------------------------------------------- +# AirMap + +contains (DEFINES, QGC_AIRMAP_ENABLED) { + + #-- These should be always enabled but not yet + INCLUDEPATH += \ + src/AirspaceManagement + + HEADERS += \ + src/AirspaceManagement/AirspaceAdvisoryProvider.h \ + src/AirspaceManagement/AirspaceFlightPlanProvider.h \ + src/AirspaceManagement/AirspaceManager.h \ + src/AirspaceManagement/AirspaceRestriction.h \ + src/AirspaceManagement/AirspaceRestrictionProvider.h \ + src/AirspaceManagement/AirspaceRulesetsProvider.h \ + src/AirspaceManagement/AirspaceVehicleManager.h \ + src/AirspaceManagement/AirspaceWeatherInfoProvider.h \ + + SOURCES += \ + src/AirspaceManagement/AirspaceAdvisoryProvider.cc \ + src/AirspaceManagement/AirspaceFlightPlanProvider.cc \ + src/AirspaceManagement/AirspaceManager.cc \ + src/AirspaceManagement/AirspaceRestriction.cc \ + src/AirspaceManagement/AirspaceRestrictionProvider.cc \ + src/AirspaceManagement/AirspaceRulesetsProvider.cc \ + src/AirspaceManagement/AirspaceVehicleManager.cc \ + src/AirspaceManagement/AirspaceWeatherInfoProvider.cc \ + + #-- This is the AirMap implementation of the above + RESOURCES += \ + src/Airmap/airmap.qrc + + INCLUDEPATH += \ + src/Airmap \ + src/Airmap/services + + HEADERS += \ + src/Airmap/AirMapAdvisoryManager.h \ + src/Airmap/AirMapFlightManager.h \ + src/Airmap/AirMapFlightPlanManager.h \ + src/Airmap/AirMapManager.h \ + src/Airmap/AirMapRestrictionManager.h \ + src/Airmap/AirMapRulesetsManager.h \ + src/Airmap/AirMapSettings.h \ + src/Airmap/AirMapSharedState.h \ + src/Airmap/AirMapTelemetry.h \ + src/Airmap/AirMapTrafficMonitor.h \ + src/Airmap/AirMapVehicleManager.h \ + src/Airmap/AirMapWeatherInfoManager.h \ + src/Airmap/LifetimeChecker.h \ + src/Airmap/services/advisory.h \ + src/Airmap/services/aircrafts.h \ + src/Airmap/services/airspaces.h \ + src/Airmap/services/authenticator.h \ + src/Airmap/services/client.h \ + src/Airmap/services/dispatcher.h \ + src/Airmap/services/flight_plans.h \ + src/Airmap/services/flights.h \ + src/Airmap/services/logger.h \ + src/Airmap/services/pilots.h \ + src/Airmap/services/rulesets.h \ + src/Airmap/services/status.h \ + src/Airmap/services/telemetry.h \ + src/Airmap/services/traffic.h \ + src/Airmap/services/types.h \ + + SOURCES += \ + src/Airmap/AirMapAdvisoryManager.cc \ + src/Airmap/AirMapFlightManager.cc \ + src/Airmap/AirMapFlightPlanManager.cc \ + src/Airmap/AirMapManager.cc \ + src/Airmap/AirMapRestrictionManager.cc \ + src/Airmap/AirMapRulesetsManager.cc \ + src/Airmap/AirMapSettings.cc \ + src/Airmap/AirMapSharedState.cc \ + src/Airmap/AirMapTelemetry.cc \ + src/Airmap/AirMapTrafficMonitor.cc \ + src/Airmap/AirMapVehicleManager.cc \ + src/Airmap/AirMapWeatherInfoManager.cc \ + src/Airmap/services/advisory.cpp \ + src/Airmap/services/aircrafts.cpp \ + src/Airmap/services/airspaces.cpp \ + src/Airmap/services/authenticator.cpp \ + src/Airmap/services/client.cpp \ + src/Airmap/services/dispatcher.cpp \ + src/Airmap/services/flight_plans.cpp \ + src/Airmap/services/flights.cpp \ + src/Airmap/services/logger.cpp \ + src/Airmap/services/pilots.cpp \ + src/Airmap/services/rulesets.cpp \ + src/Airmap/services/status.cpp \ + src/Airmap/services/telemetry.cpp \ + src/Airmap/services/traffic.cpp \ + src/Airmap/services/types.cpp \ + + #-- Do we have an API key? + exists(src/Airmap/Airmap_api_key.h) { + message("Using compile time Airmap API key") + HEADERS += \ + src/Airmap/Airmap_api_key.h + DEFINES += QGC_AIRMAP_KEY_AVAILABLE + } + + include(src/Airmap/QJsonWebToken/src/qjsonwebtoken.pri) + +} else { + #-- Dummies + INCLUDEPATH += \ + src/Airmap/dummy + RESOURCES += \ + src/Airmap/dummy/airmap_dummy.qrc + HEADERS += \ + src/Airmap/dummy/AirspaceManager.h + SOURCES += \ + src/Airmap/dummy/AirspaceManager.cc +} #------------------------------------------------------------------------------------- # Video Streaming diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc index 99940a5..6eeef4f 100644 --- a/qgroundcontrol.qrc +++ b/qgroundcontrol.qrc @@ -14,11 +14,9 @@ src/ui/toolbar/ModeIndicator.qml src/ui/toolbar/MultiVehicleSelector.qml src/ui/toolbar/RCRSSIIndicator.qml - src/ui/toolbar/RemoteIDIndicator.qml src/ui/toolbar/ROIIndicator.qml src/ui/toolbar/TelemetryRSSIIndicator.qml src/ui/toolbar/VTOLModeIndicator.qml - src/ui/toolbar/APMSupportForwardingIndicator.qml src/FlightDisplay/DefaultChecklist.qml @@ -40,7 +38,6 @@ src/ui/preferences/BluetoothSettings.qml src/PlanView/CorridorScanEditor.qml src/ui/preferences/DebugWindow.qml - src/ui/preferences/RemoteIDSettings.qml src/AutoPilotPlugins/Common/ESP8266Component.qml src/AutoPilotPlugins/Common/ESP8266ComponentSummary.qml src/ui/ExitWithErrorWindow.qml @@ -111,7 +108,6 @@ src/QmlControls/KMLOrSHPFileDialog.qml src/QmlControls/LogReplayStatusBar.qml src/ui/toolbar/MainStatusIndicator.qml - src/ui/toolbar/FlightModeMenuIndicator.qml src/ui/toolbar/MainToolBar.qml src/QmlControls/MainWindowSavedState.qml src/QmlControls/MAVLinkChart.qml @@ -133,7 +129,6 @@ src/QmlControls/PreFlightCheckGroup.qml src/QmlControls/PreFlightCheckModel.qml src/QmlControls/QGCButton.qml - src/QmlControls/QGCColumnButton.qml src/QmlControls/AutotuneUI.qml src/QmlControls/QGCCheckBox.qml src/QmlControls/QGCColoredImage.qml @@ -156,10 +151,10 @@ src/QmlControls/QGCMouseArea.qml src/QmlControls/QGCMovableItem.qml src/QmlControls/QGCPopupDialog.qml + src/QmlControls/QGCPopupDialogContainer.qml src/QmlControls/QGCPipOverlay.qml src/QmlControls/QGCPipState.qml src/QmlControls/QGCRadioButton.qml - src/QmlControls/QGCSimpleMessageDialog.qml src/QmlControls/QGCSlider.qml src/QmlControls/QGCSwitch.qml src/QmlControls/QGCTabBar.qml @@ -167,6 +162,9 @@ src/QmlControls/QGCTextField.qml src/QmlControls/QGCToolBarButton.qml src/QmlControls/QGCToolInsets.qml + src/QmlControls/QGCViewDialog.qml + src/QmlControls/QGCViewDialogContainer.qml + src/QmlControls/QGCViewMessage.qml src/QmlControls/QGroundControl/Controls/qmldir src/PlanView/RallyPointEditorHeader.qml src/PlanView/RallyPointItemEditor.qml @@ -185,7 +183,7 @@ src/PlanView/TerrainStatus.qml src/PlanView/TakeoffItemMapVisual.qml src/QmlControls/ToolStrip.qml - src/QmlControls/ToolStripHoverButton.qml + src/QmlControls/ToolStripHoverButton.qml src/PlanView/TransectStyleComplexItemEditor.qml src/PlanView/TransectStyleComplexItemStats.qml src/PlanView/TransectStyleComplexItemTabBar.qml @@ -206,6 +204,7 @@ src/QmlControls/QGroundControl/FactControls/qmldir src/FlightDisplay/FlightDisplayViewVideo.qml src/FlightDisplay/FlightDisplayViewWidgets.qml + src/FlightDisplay/FlyViewAirspaceIndicator.qml src/FlightDisplay/FlyView.qml src/FlightDisplay/FlyViewCustomLayer.qml src/FlightDisplay/FlyViewInstrumentPanel.qml @@ -222,11 +221,9 @@ src/FlightDisplay/GuidedActionLand.qml src/FlightDisplay/GuidedActionList.qml src/FlightDisplay/GuidedActionTakeoff.qml - src/FlightDisplay/GuidedActionGripper.qml - src/FlightDisplay/GripperMenu.qml src/FlightDisplay/GuidedActionPause.qml src/FlightDisplay/GuidedActionRTL.qml - src/FlightDisplay/GuidedValueSlider.qml + src/FlightDisplay/GuidedAltitudeSlider.qml src/FlightDisplay/GuidedToolStripAction.qml src/FlightDisplay/MultiVehicleList.qml src/FlightDisplay/PreFlightBatteryCheck.qml @@ -287,8 +284,6 @@ src/AnalyzeView/VibrationPage.qml src/FlightDisplay/VirtualJoystick.qml src/PlanView/VTOLLandingPatternEditor.qml - src/comm/MockLinkOptionsDlg.qml - src/FlightDisplay/FlyViewInsetViewer.qml src/FirstRunPromptDialogs/UnitsFirstRunPrompt.qml @@ -305,7 +300,6 @@ src/MissionManager/CameraSection.FactMetaData.json src/MissionManager/CameraSpec.FactMetaData.json src/MissionManager/CorridorScan.SettingsGroup.json - src/Settings/RemoteID.SettingsGroup.json src/QmlControls/EditPositionDialog.FactMetaData.json src/Settings/FirmwareUpgrade.SettingsGroup.json src/Settings/FlightMap.SettingsGroup.json @@ -347,8 +341,6 @@ src/Vehicle/VibrationFact.json src/Vehicle/WindFact.json src/Vehicle/HygrometerFact.json - src/Vehicle/GeneratorFact.json - src/Vehicle/EFIFact.json src/Settings/Video.SettingsGroup.json src/MissionManager/VTOLLandingPattern.FactMetaData.json @@ -359,6 +351,5 @@ src/comm/MockLink.General.MetaData.json.xz src/comm/MockLink.Parameter.MetaData.json.xz src/comm/MockLink.Parameter.MetaData.json - src/comm/Mocklink.Arduplane.params.ftp.bin diff --git a/resources/Gripper.svg b/resources/Gripper.svg deleted file mode 100644 index fd4d69e..0000000 --- a/resources/Gripper.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/resources/GripperGrab.svg b/resources/GripperGrab.svg deleted file mode 100644 index d375fb0..0000000 --- a/resources/GripperGrab.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/resources/GripperRelease.svg b/resources/GripperRelease.svg deleted file mode 100644 index d0b4797..0000000 --- a/resources/GripperRelease.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/resources/NoVideoBackground.jpg b/resources/NoVideoBackground.jpg deleted file mode 100644 index 678aa14..0000000 Binary files a/resources/NoVideoBackground.jpg and /dev/null differ diff --git a/resources/SDL_GameControllerDB/gamecontrollerdb.txt b/resources/SDL_GameControllerDB/gamecontrollerdb.txt index 43a462e..a3285fd 100755 --- a/resources/SDL_GameControllerDB/gamecontrollerdb.txt +++ b/resources/SDL_GameControllerDB/gamecontrollerdb.txt @@ -1,176 +1,1937 @@ -# Windows - DINPUT -8f0e1200000000000000504944564944,Acme,platform:Windows,x:b2,a:b0,b:b1,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2, -341a3608000000000000504944564944,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -ffff0000000000000000504944564944,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, -6d0416c2000000000000504944564944,Generic DirectInput Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -0d0f6e00000000000000504944564944,HORIPAD 4,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows, -6d0419c2000000000000504944564944,Logitech F710 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -88880803000000000000504944564944,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b9,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows, -4c056802000000000000504944564944,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Windows, -25090500000000000000504944564944,PS3 DualShock,a:b2,b:b1,back:b9,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b0,y:b3,platform:Windows, -4c05c405000000000000504944564944,Sony DualShock 4,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Windows, -4c05cc09000000000000504944564944,Sony DualShock 4,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Windows, -4c05a00b000000000000504944564944,Sony DualShock 4 Wireless Adaptor,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Windows, -6d0418c2000000000000504944564944,Logitech RumblePad 2 USB,platform:Windows,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3, -36280100000000000000504944564944,OUYA Controller,platform:Windows,a:b0,b:b3,y:b2,x:b1,start:b14,guide:b15,leftstick:b6,rightstick:b7,leftshoulder:b4,rightshoulder:b5,dpup:b8,dpleft:b10,dpdown:b9,dpright:b11,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b12,righttrigger:b13, -4f0400b3000000000000504944564944,Thrustmaster Firestorm Dual Power,a:b0,b:b2,y:b3,x:b1,start:b10,guide:b8,back:b9,leftstick:b11,rightstick:b12,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,platform:Windows, -00f00300000000000000504944564944,RetroUSB.com RetroPad,a:b1,b:b5,x:b0,y:b4,back:b2,start:b3,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Windows, -00f0f100000000000000504944564944,RetroUSB.com Super RetroPort,a:b1,b:b5,x:b0,y:b4,back:b2,start:b3,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Windows, -28040140000000000000504944564944,GamePad Pro USB,platform:Windows,a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,lefttrigger:b6,righttrigger:b7, -ff113133000000000000504944564944,SVEN X-PAD,platform:Windows,a:b2,b:b3,y:b1,x:b0,start:b5,back:b4,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a4,lefttrigger:b8,righttrigger:b9, -8f0e0300000000000000504944564944,Piranha xtreme,platform:Windows,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2, -8f0e0d31000000000000504944564944,Multilaser JS071 USB,platform:Windows,a:b1,b:b2,y:b3,x:b0,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7, -10080300000000000000504944564944,PS2 USB,platform:Windows,a:b2,b:b1,y:b0,x:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a4,righty:a2,lefttrigger:b4,righttrigger:b5, -79000600000000000000504944564944,G-Shark GS-GP702,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a4,lefttrigger:b6,righttrigger:b7,platform:Windows, -4b12014d000000000000504944564944,NYKO AIRFLO,a:b0,b:b1,x:b2,y:b3,back:b8,guide:b10,start:b9,leftstick:a0,rightstick:a2,leftshoulder:a3,rightshoulder:b5,dpup:h0.1,dpdown:h0.0,dpleft:h0.8,dpright:h0.2,leftx:h0.6,lefty:h0.12,rightx:h0.9,righty:h0.4,lefttrigger:b6,righttrigger:b7,platform:Windows, -d6206dca000000000000504944564944,PowerA Pro Ex,a:b1,b:b2,x:b0,y:b3,back:b8,guide:b12,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.0,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows, -a3060cff000000000000504944564944,Saitek P2500,a:b2,b:b3,y:b1,x:b0,start:b4,guide:b10,back:b5,leftstick:b8,rightstick:b9,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,platform:Windows, -4f0415b3000000000000504944564944,Thrustmaster Dual Analog 3.2,platform:Windows,x:b1,a:b0,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3, -6f0e1e01000000000000504944564944,Rock Candy Gamepad for PS3,platform:Windows,a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,guide:b12,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2, -83056020000000000000504944564944,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,y:b2,x:b3,start:b7,back:b6,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Windows, -10080100000000000000504944564944,PS1 USB,platform:Windows,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,leftshoulder:b6,rightshoulder:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2, -49190204000000000000504944564944,Ipega PG-9023,a:b0,b:b1,x:b3,y:b4,back:b10,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b8,righttrigger:b9,platform:Windows, -4f0423b3000000000000504944564944,Dual Trigger 3-in-1,a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:b6,righttrigger:b7,platform:Windows, -0d0f4900000000000000504944564944,Hatsune Miku Sho Controller,a:b1,b:b2,x:b0,y:b3,back:b8,guide:b12,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows, -79004318000000000000504944564944,Mayflash GameCube Controller Adapter,platform:Windows,a:b1,b:b2,x:b0,y:b3,back:b0,start:b9,guide:b0,leftshoulder:b4,rightshoulder:b7,leftstick:b0,rightstick:b0,leftx:a0,lefty:a1,rightx:a5,righty:a2,lefttrigger:a3,righttrigger:a4,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2, -79000018000000000000504944564944,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows, -2509e803000000000000504944564944,Mayflash Wii Classic Controller,a:b1,b:b0,x:b3,y:b2,back:b8,guide:b10,start:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:b11,dpdown:b13,dpleft:b12,dpright:b14,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Windows, -300f1001000000000000504944564944,Saitek P480 Rumble Pad,a:b2,b:b3,x:b0,y:b1,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b5,righttrigger:b7,platform:Windows, -10280900000000000000504944564944,8Bitdo SFC30 GamePad,a:b1,b:b0,y:b3,x:b4,start:b11,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,platform:Windows, -63252305000000000000504944564944,USB Vibration Joystick (BM),platform:Windows,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3, -20380900000000000000504944564944,8Bitdo NES30 PRO Wireless,platform:Windows,a:b0,b:b1,x:b3,y:b4,leftshoulder:b6,rightshoulder:b7,lefttrigger:b8,righttrigger:b9,back:b10,start:b11,leftstick:b13,rightstick:b14,leftx:a0,lefty:a1,rightx:a3,righty:a4,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8, -02200090000000000000504944564944,8Bitdo NES30 PRO USB,platform:Windows,a:b0,b:b1,x:b3,y:b4,leftshoulder:b6,rightshoulder:b7,lefttrigger:b8,righttrigger:b9,back:b10,start:b11,leftstick:b13,rightstick:b14,leftx:a0,lefty:a1,rightx:a3,righty:a4,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8, -ff113133000000000000504944564944,Gembird JPD-DualForce,platform:Windows,a:b2,b:b3,x:b0,y:b1,start:b9,back:b8,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a4,lefttrigger:b6,righttrigger:b7,leftstick:b10,rightstick:b11, -341a0108000000000000504944564944,EXEQ RF USB Gamepad 8206,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,leftstick:b8,rightstick:b7,back:b8,start:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,platform:Windows, -c0111352000000000000504944564944,Battalife Joystick,platform:Windows,x:b4,a:b6,b:b7,y:b5,back:b2,start:b3,leftshoulder:b0,rightshoulder:b1,leftx:a0,lefty:a1, -100801e5000000000000504944564944,NEXT Classic USB Game Controller,a:b0,b:b1,back:b8,start:b9,rightx:a2,righty:a3,leftx:a0,lefty:a1,platform:Windows, -79000600000000000000504944564944,NGS Phantom,a:b2,b:b3,y:b1,x:b0,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a4,lefttrigger:b6,righttrigger:b7,platform:Windows, +# Game Controller DB for SDL in 2.0.16 format +# Source: https://github.com/gabomdq/SDL_GameControllerDB -# OS X -0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, -6d0400000000000016c2000000000000,Logitech F310 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -6d0400000000000018c2000000000000,Logitech F510 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -6d040000000000001fc2000000000000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -6d0400000000000019c2000000000000,Logitech Wireless Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -4c050000000000006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X, -4c05000000000000c405000000000000,Sony DualShock 4,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Mac OS X, -4c05000000000000cc09000000000000,Sony DualShock 4 V2,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Mac OS X, -5e040000000000008e02000000000000,X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -891600000000000000fd000000000000,Razer Onza Tournament,a:b0,b:b1,y:b3,x:b2,start:b8,guide:b10,back:b9,leftstick:b6,rightstick:b7,leftshoulder:b4,rightshoulder:b5,dpup:b11,dpleft:b13,dpdown:b12,dpright:b14,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Mac OS X, -4f0400000000000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,y:b3,x:b1,start:b10,guide:b8,back:b9,leftstick:b11,rightstick:,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,platform:Mac OS X, -8f0e0000000000000300000000000000,Piranha xtreme,platform:Mac OS X,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2, -0d0f0000000000004d00000000000000,HORI Gem Pad 3,platform:Mac OS X,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7, -79000000000000000600000000000000,G-Shark GP-702,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b6,righttrigger:b7,platform:Mac OS X, -4f0400000000000015b3000000000000,Thrustmaster Dual Analog 3.2,platform:Mac OS X,x:b1,a:b0,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3, -AD1B00000000000001F9000000000000,Gamestop BB-070 X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, -050000005769696d6f74652028303000,Wii Remote,a:b4,b:b5,y:b9,x:b10,start:b6,guide:b8,back:b7,dpup:b2,dpleft:b0,dpdown:b3,dpright:b1,leftx:a0,lefty:a1,lefttrigger:b12,righttrigger:,leftshoulder:b11,platform:Mac OS X, -83050000000000006020000000000000,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,x:b3,y:b2,back:b6,start:b7,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Mac OS X, -bd1200000000000015d0000000000000,Tomee SNES USB Controller,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Mac OS X, -79000000000000001100000000000000,Retrolink Classic Controller,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a3,lefty:a4,platform:Mac OS X, -5e04000000000000dd02000000000000,Xbox One Wired Controller,platform:Mac OS X,x:b2,a:b0,b:b1,y:b3,back:b9,guide:b10,start:b8,dpleft:b13,dpdown:b12,dpright:b14,dpup:b11,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b6,rightstick:b7,leftx:a0,lefty:a1,rightx:a3,righty:a4, -5e04000000000000ea02000000000000,Xbox Wireless Controller,platform:Mac OS X,x:b2,a:b0,b:b1,y:b3,back:b9,guide:b10,start:b8,dpleft:b13,dpdown:b12,dpright:b14,dpup:b11,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b6,rightstick:b7,leftx:a0,lefty:a1,rightx:a3,righty:a4, -5e04000000000000e002000000000000,Xbox Wireless Controller,platform:Mac OS X,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b10,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a3,righty:a4, -050000005769696d6f74652028313800,Wii U Pro Controller,a:b16,b:b15,x:b18,y:b17,back:b7,guide:b8,start:b6,leftstick:b23,rightstick:b24,leftshoulder:b19,rightshoulder:b20,dpup:b11,dpdown:b12,dpleft:b13,dpright:b14,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b21,righttrigger:b22,platform:Mac OS X, -79000000000000000018000000000000,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b4,b:b8,x:b0,y:b12,back:b32,start:b36,leftstick:b40,rightstick:b44,leftshoulder:b16,rightshoulder:b20,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a4,rightx:a8,righty:a12,lefttrigger:b24,righttrigger:b28,platform:Mac OS X, -2509000000000000e803000000000000,Mayflash Wii Classic Controller,a:b1,b:b0,x:b3,y:b2,back:b8,guide:b10,start:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:b11,dpdown:b13,dpleft:b12,dpright:b14,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Mac OS X, -351200000000000021ab000000000000,SFC30 Joystick,a:b1,b:b0,x:b4,y:b3,back:b10,start:b11,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Mac OS X, -b4040000000000000a01000000000000,Sega Saturn USB Gamepad,a:b0,b:b1,x:b3,y:b4,back:b5,guide:b2,start:b8,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Mac OS X, -81170000000000007e05000000000000,Sega Saturn,x:b0,a:b2,b:b4,y:b6,start:b13,dpleft:b15,dpdown:b16,dpright:b14,dpup:b17,leftshoulder:b8,lefttrigger:a5,lefttrigger:b10,rightshoulder:b9,righttrigger:a4,righttrigger:b11,leftx:a0,lefty:a2,platform:Mac OS X, -10280000000000000900000000000000,8Bitdo SFC30 GamePad,a:b1,b:b0,x:b4,y:b3,back:b10,start:b11,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Mac OS X, -d814000000000000cecf000000000000,MC Cthulhu,platform:Mac OS X,leftx:,lefty:,rightx:,righty:,lefttrigger:b6,a:b1,b:b2,y:b3,x:b0,start:b9,back:b8,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,righttrigger:b7, -0d0f0000000000006600000000000000,HORIPAD FPS PLUS 4,platform:Mac OS X,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:b6,righttrigger:a4, +# Windows +03000000300f00000a01000000000000,3 In 1 Conversion Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b8,x:b3,y:b0,platform:Windows, +03000000fa2d00000100000000000000,3dRudder Foot Motion Controller,leftx:a0,lefty:a1,rightx:a5,righty:a2,platform:Windows, +03000000d0160000040d000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, +03000000d0160000050d000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, +03000000d0160000060d000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, +03000000d0160000070d000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, +03000000d0160000600a000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, +03000000c82d00000031000000000000,8BitDo Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000531000000000000,8BitDo Adapter 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000951000000000000,8BitDo Dogbone,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightx:a3,righty:a5,start:b11,platform:Windows, +03000000008000000210000000000000,8BitDo F30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +030000003512000011ab000000000000,8BitDo F30 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000c82d00001028000000000000,8BitDo F30 Arcade Joystick,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d000011ab000000000000,8BitDo F30 Arcade Joystick,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000801000000900000000000000,8BitDo F30 Arcade Stick,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001038000000000000,8BitDo F30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000090000000000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00001251000000000000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00001151000000000000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000150000000000000,8BitDo M30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000151000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000650000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00005106000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,guide:b2,leftshoulder:b8,lefttrigger:b9,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000310000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000451000000000000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightx:a3,righty:a5,start:b11,platform:Windows, +03000000c82d00002028000000000000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00008010000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d0000e002000000000000,8BitDo N30,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,start:b6,platform:Windows, +03000000c82d00000190000000000000,8BitDo N30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00001590000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00006528000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000290000000000000,8BitDo N64,+rightx:b9,+righty:b3,-rightx:b4,-righty:b8,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,platform:Windows, +03000000c82d00003038000000000000,8BitDo N64,+rightx:b9,+righty:b3,-rightx:b4,-righty:b8,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,platform:Windows, +03000000c82d00006928000000000000,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b11,platform:Windows, +030000003512000012ab000000000000,8BitDo NES30,a:b2,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Windows, +03000000c82d000012ab000000000000,8BitDo NES30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000022000000090000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000203800000900000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00002038000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000751000000000000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000851000000000000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000360000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000361000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000660000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000131000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000231000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000331000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000431000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00002867000000000000,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a2,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a5,start:b10,x:b3,y:b4,platform:Windows, +03000000c82d00000130000000000000,8BitDo SF30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000060000000000000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000061000000000000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000102800000900000000000000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d000021ab000000000000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00003028000000000000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +030000003512000020ab000000000000,8BitDo SN30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000030000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000351000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a2,rightshoulder:b7,rightx:a3,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00001290000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d000020ab000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00004028000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00006228000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000021000000000000,8BitDo SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000260000000000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000261000000000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00001230000000000000,8BitDo Ultimate,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001530000000000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001630000000000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001730000000000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001130000000000000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001330000000000000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000121000000000000,8BitDo Xbox One SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000a00500003232000000000000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001890000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00003032000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +030000008f0e00001200000000000000,Acme GA02,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +03000000c01100000355000000000000,Acrux,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000fa190000f0ff000000000000,Acteck AGJ 3200,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000d1180000402c000000000000,ADT1,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a3,rightx:a2,righty:a5,x:b3,y:b4,platform:Windows, +03000000341a00003608000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00000263000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001101000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001401000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001402000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001901000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001a01000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001301000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e00001302000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e00001304000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e00001413000000000000,Afterglow Xbox Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00003901000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ab1200000103000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000000f9000000000000,Afterglow Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000100000008200000000000000,Akishop Customs PS360,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000007c1800000006000000000000,Alienware Dual Compatible PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000491900001904000000000000,Amazon Luna Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows, +03000000710100001904000000000000,Amazon Luna Controller,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b8,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b4,rightstick:b7,rightx:a3,righty:a4,start:b6,x:b3,y:b2,platform:Windows, +03000000830500000160000000000000,Arcade,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b3,x:b4,y:b4,platform:Windows, +03000000120c0000100e000000000000,Armor 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000490b00004406000000000000,ASCII Seamic Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +03000000869800002500000000000000,Astro C40 TR PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000a30c00002700000000000000,Astro City Mini,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, +03000000a30c00002800000000000000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, +03000000050b00000579000000000000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000050b00000679000000000000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000503200000110000000000000,Atari VCS Classic Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,start:b3,platform:Windows, +03000000503200000210000000000000,Atari VCS Modern Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows, +03000000e4150000103f000000000000,Batarang,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000d6200000e557000000000000,Batarang PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000c01100001352000000000000,Battalife Joystick,a:b6,b:b7,back:b2,leftshoulder:b0,leftx:a0,lefty:a1,rightshoulder:b1,start:b3,x:b4,y:b5,platform:Windows, +030000006f0e00003201000000000000,Battlefield 4 PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000ad1b000001f9000000000000,BB 070,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000d62000002a79000000000000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000bc2000005250000000000000,Beitong G3,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b5,righttrigger:b9,rightx:a3,righty:a4,start:b15,x:b3,y:b4,platform:Windows, +030000000d0500000208000000000000,Belkin Nostromo N40,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +03000000bc2000006012000000000000,Betop 2126F,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000bc2000000055000000000000,Betop BFM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000bc2000006312000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000bc2000006321000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000bc2000006412000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000c01100000555000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000c01100000655000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000790000000700000000000000,Betop Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +03000000808300000300000000000000,Betop Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +030000006f0e00006401000000000000,BF One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows, +03000000300f00000202000000000000,Bigben,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a5,righty:a2,start:b7,x:b2,y:b3,platform:Windows, +030000006b1400000209000000000000,Bigben,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006b1400000055000000000000,Bigben PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000006b1400000103000000000000,Bigben PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, +03000000120c0000200e000000000000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000210e000000000000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000f10e000000000000,Brook PS2 Adapter,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000310c000000000000,Brook Super Converter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, +03000000d81d00000b00000000000000,Buffalo BSGP1601 Series,a:b5,b:b3,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b4,y:b2,platform:Windows, +030000005b1c00002400000000000000,Capcom Home Arcade Controller,a:b3,b:b4,back:b7,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b6,x:b0,y:b1,platform:Windows, +030000005b1c00002500000000000000,Capcom Home Arcade Controller,a:b3,b:b4,back:b7,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b6,x:b0,y:b1,platform:Windows, +030000006d04000042c2000000000000,ChillStream,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000e82000006058000000000000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000457500000401000000000000,Cobra,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000b0400003365000000000000,Competition Pro,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Windows, +030000004c050000c505000000000000,CronusMax Adapter,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000d814000007cd000000000000,Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000d8140000cefa000000000000,Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000260900008888000000000000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a4,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Windows, +030000003807000002cb000000000000,Cyborg,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000a306000022f6000000000000,Cyborg V.3 Rumble,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000f806000000a3000000000000,DA Leader,a:b7,b:b6,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b0,leftstick:b8,lefttrigger:b1,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:b3,rightx:a2,righty:a3,start:b12,x:b4,y:b5,platform:Windows, +030000001a1c00000001000000000000,Datel Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000451300000830000000000000,Defender Game Racer X7,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000791d00000103000000000000,Dual Box Wii,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000c0160000e105000000000000,Dual Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +030000004f040000070f000000000000,Dual Power,a:b8,b:b9,back:b4,dpdown:b1,dpleft:b2,dpright:b3,dpup:b0,leftshoulder:b13,leftstick:b6,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b12,rightstick:b7,righttrigger:b15,start:b5,x:b10,y:b11,platform:Windows, +030000004f04000012b3000000000000,Dual Power 3,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +030000004f04000020b3000000000000,Dual Trigger,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +03000000bd12000002e0000000000000,Dual Vibration Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Windows, +03000000ff1100003133000000000000,DualForce,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b1,platform:Windows, +030000008f0e00000910000000000000,DualShock 2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Windows, +03000000317300000100000000000000,DualShock 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +030000006f0e00003001000000000000,EA Sports PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000fc0400000250000000000000,Easy Grip,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +030000006e0500000a20000000000000,Elecom DUX60 MMO,a:b2,b:b3,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b14,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b15,righttrigger:b13,rightx:a3,righty:a4,start:b20,x:b0,y:b1,platform:Windows, +03000000b80500000410000000000000,Elecom Gamepad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, +03000000b80500000610000000000000,Elecom Gamepad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, +030000006e0500000520000000000000,Elecom P301U PlayStation Controller Adapter,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, +03000000411200004450000000000000,Elecom U1012,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, +030000006e0500000320000000000000,Elecom U3613M,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, +030000006e0500000e20000000000000,Elecom U3912T,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, +030000006e0500000f20000000000000,Elecom U4013S,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, +030000006e0500001320000000000000,Elecom U4113,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006e0500001020000000000000,Elecom U4113S,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows, +030000006e0500000720000000000000,Elecom W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, +030000007d0400000640000000000000,Eliminator AfterShock,a:b1,b:b2,back:b9,dpdown:+a3,dpleft:-a5,dpright:+a5,dpup:-a3,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a4,righty:a2,start:b8,x:b0,y:b3,platform:Windows, +03000000120c0000f61c000000000000,Elite,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000430b00000300000000000000,EMS Production PS2 Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000242f000000b7000000000000,ESM 9110,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Windows, +03000000101c0000181c000000000000,Essential,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b4,leftx:a1,lefty:a0,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +030000008f0e00000f31000000000000,EXEQ,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, +03000000341a00000108000000000000,EXEQ RF Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000006f0e00008401000000000000,Faceoff Deluxe Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00008001000000000000,Faceoff Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000021000000090000000000000,FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +0300000011040000c600000000000000,FC801,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, +03000000852100000201000000000000,FF GP1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000ad1b000028f0000000000000,Fightpad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b00002ef0000000000000,Fightpad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000038f0000000000000,Fightpad TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, +03005036852100000000000000000000,Final Fantasy XIV Online Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000f806000001a3000000000000,Firestorm,a:b9,b:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b0,leftstick:b10,lefttrigger:b1,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,start:b12,x:b8,y:b4,platform:Windows, +03000000b50700000399000000000000,Firestorm 2,a:b2,b:b4,back:b10,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,righttrigger:b9,start:b11,x:b3,y:b5,platform:Windows, +03000000b50700001302000000000000,Firestorm D3,a:b0,b:b2,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,x:b1,y:b3,platform:Windows, +03000000b40400001024000000000000,Flydigi Apex,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000151900004000000000000000,Flydigi Vader 2,a:b27,b:b26,back:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b23,leftstick:b17,lefttrigger:b21,leftx:a0,lefty:a1,misc1:b15,paddle1:b11,paddle2:b10,paddle3:b13,paddle4:b12,rightshoulder:b22,rightstick:b16,righttrigger:b20,rightx:a3,righty:a4,start:b18,x:b25,y:b24,platform:Windows, +03000000b40400001124000000000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b14,paddle1:b4,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b2,y:b3,platform:Windows, +03000000b40400001224000000000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:b8,leftx:a0,lefty:a1,misc1:b2,paddle1:b16,paddle2:b17,paddle3:b14,paddle4:b15,rightshoulder:b7,rightstick:b13,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +030000008305000000a0000000000000,G08XU,a:b0,b:b1,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b5,x:b2,y:b3,platform:Windows, +0300000066f700000100000000000000,Game VIB Joystick,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows, +03000000260900002625000000000000,GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,lefttrigger:a4,leftx:a0,lefty:a1,righttrigger:a5,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Windows, +03000000341a000005f7000000000000,GameCube Controller,a:b2,b:b3,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b1,y:b0,platform:Windows, +03000000430b00000500000000000000,GameCube Controller,a:b0,b:b2,dpdown:b10,dpleft:b8,dpright:b9,dpup:b11,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a3,rightx:a5,righty:a2,start:b7,x:b1,y:b3,platform:Windows, +03000000790000004718000000000000,GameCube Controller,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +03000000790000004618000000000000,GameCube Controller Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +030000008f0e00000d31000000000000,Gamepad 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000ac0500003d03000000000000,GameSir G3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000ac0500005b05000000000000,GameSir G3w,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000ac0500002d02000000000000,GameSir G4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000ac0500004d04000000000000,GameSir G4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000ac0500001a06000000000000,GameSir-T3 2.02,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +030000004c0e00001035000000000000,Gamester,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +030000000d0f00001110000000000000,GameStick Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +0300000047530000616d000000000000,GameStop,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000c01100000140000000000000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000b62500000100000000000000,Gametel GT004 01,a:b3,b:b0,dpdown:b10,dpleft:b9,dpright:b8,dpup:b11,leftshoulder:b4,rightshoulder:b5,start:b7,x:b1,y:b2,platform:Windows, +030000008f0e00001411000000000000,Gamo2 Divaller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000a857000000000000,Gator Claw,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000c9110000f055000000000000,GC100XF,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000008305000009a0000000000000,Genius,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000008305000031b0000000000000,Genius Maxfire Blaze 3,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000451300000010000000000000,Genius Maxfire Grandias 12,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000005c1a00003330000000000000,Genius MaxFire Grandias 12V,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +03000000300f00000b01000000000000,GGE909 Recoil,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000f0250000c283000000000000,Gioteck PlayStation Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000f025000021c1000000000000,Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000f025000031c1000000000000,Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000f0250000c383000000000000,Gioteck VX2 PlayStation Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000f0250000c483000000000000,Gioteck VX2 PlayStation Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000004f04000026b3000000000000,GP XID,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +0300000079000000d418000000000000,GPD Win,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c6240000025b000000000000,GPX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000007d0400000840000000000000,Gravis Destroyer Tilt,+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,x:b0,y:b3,platform:Windows, +030000007d0400000540000000000000,Gravis Eliminator Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000280400000140000000000000,Gravis GamePad Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a3,dpup:-a4,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000008f0e00000610000000000000,GreenAsia,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a5,righty:a2,start:b11,x:b3,y:b0,platform:Windows, +03000000ac0500006b05000000000000,GT2a,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000341a00000302000000000000,Hama Scorpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00004900000000000000,Hatsune Miku Sho PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000001008000001e1000000000000,Havit HV G60,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b0,platform:Windows, +030000000d0f00000c00000000000000,HEXT,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000d81400000862000000000000,HitBox Edition Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, +03000000632500002605000000000000,HJD X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +030000000d0f00000a00000000000000,Hori DOA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f00008500000000000000,Hori Fighting Commander 2016 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00002500000000000000,Hori Fighting Commander 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00002d00000000000000,Hori Fighting Commander 3 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005f00000000000000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005e00000000000000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00008400000000000000,Hori Fighting Commander 5,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005100000000000000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00008600000000000000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f0000ba00000000000000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f00008800000000000000,Hori Fighting Stick mini 4 (PS3),a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows, +030000000d0f00008700000000000000,Hori Fighting Stick mini 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00001000000000000000,Hori Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00003200000000000000,Hori Fightstick 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000c000000000000000,Hori Fightstick 4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f00000d00000000000000,Hori Fightstick EX2,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +030000000d0f00003701000000000000,Hori Fightstick Mini,a:b1,b:b0,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Windows, +030000000d0f00004000000000000000,Hori Fightstick Mini 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00002100000000000000,Hori Fightstick V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00002700000000000000,Hori Fightstick V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000a000000000000000,Hori Grip TAC4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b13,x:b0,y:b3,platform:Windows, +030000000d0f0000a500000000000000,Hori Miku Project Diva X HD PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000a600000000000000,Hori Miku Project Diva X HD PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00000101000000000000,Hori Mini Hatsune Miku FT,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005400000000000000,Hori Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00000900000000000000,Hori Pad 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00004d00000000000000,Hori Pad A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00003801000000000000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Windows, +030000000d0f00009200000000000000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00002301000000000000,Hori PS4 Controller Light,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +030000000d0f00001100000000000000,Hori Real Arcade Pro 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00002600000000000000,Hori Real Arcade Pro 3P,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00004b00000000000000,Hori Real Arcade Pro 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006a00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006b00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00008a00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00008b00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006f00000000000000,Hori Real Arcade Pro 4 VLX,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00007000000000000000,Hori Real Arcade Pro 4 VLX,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00003d00000000000000,Hori Real Arcade Pro N3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b10,leftstick:b4,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b6,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000ae00000000000000,Hori Real Arcade Pro N4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f00008c00000000000000,Hori Real Arcade Pro P4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f0000aa00000000000000,Hori Real Arcade Pro S,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000d800000000000000,Hori Real Arcade Pro S,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Windows, +030000000d0f00002200000000000000,Hori Real Arcade Pro V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005b00000000000000,Hori Real Arcade Pro V4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005c00000000000000,Hori Real Arcade Pro V4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000af00000000000000,Hori Real Arcade Pro VHS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00001b00000000000000,Hori Real Arcade Pro VX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000002f5000000000000,Hori Real Arcade Pro VX,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Windows, +030000000d0f00009c00000000000000,Hori TAC Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000c900000000000000,Hori Taiko Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000c100000000000000,Horipad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006400000000000000,Horipad 3TP,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00001300000000000000,Horipad 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005500000000000000,Horipad 4 FPS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006e00000000000000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006600000000000000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00004200000000000000,Horipad A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000ad1b000001f5000000000000,Horipad EXT2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f0000ee00000000000000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006700000000000000,Horipad One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f0000dc00000000000000,Horipad Switch,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000242e00000b20000000000000,Hyperkin Admiral N64 Controller,+rightx:b11,+righty:b13,-rightx:b8,-righty:b12,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,platform:Windows, +03000000242e0000ff0b000000000000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Windows, +03000000790000004e95000000000000,Hyperkin N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a5,righty:a2,start:b9,platform:Windows, +03000000242e00006a38000000000000,Hyperkin Trooper 2,a:b0,b:b1,back:b4,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b3,start:b5,platform:Windows, +03000000d81d00000e00000000000000,iBuffalo AC02 Arcade Joystick,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,rightx:a2,righty:a5,start:b8,x:b4,y:b5,platform:Windows, +03000000d81d00000f00000000000000,iBuffalo BSGP1204 Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000d81d00001000000000000000,iBuffalo BSGP1204P Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000005c0a00000285000000000000,iDroidCon,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b6,platform:Windows, +03000000696400006964000000000000,iDroidCon Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000b50700001403000000000000,Impact Black,a:b2,b:b3,back:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +030000006f0e00002401000000000000,Injustice Fightstick PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000830500005130000000000000,InterAct ActionPad,a:b0,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +03000000ef0500000300000000000000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows, +03000000fd0500000230000000000000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a5,start:b11,x:b0,y:b1,platform:Windows, +03000000fd0500000030000000000000,Interact GoPad,a:b3,b:b4,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,x:b0,y:b1,platform:Windows, +03000000fd0500003902000000000000,InterAct Hammerhead,a:b3,b:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b2,lefttrigger:b8,rightshoulder:b7,rightstick:b5,righttrigger:b9,start:b10,x:b0,y:b1,platform:Windows, +03000000fd0500002a26000000000000,InterAct Hammerhead FX,a:b3,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b0,y:b1,platform:Windows, +03000000fd0500002f26000000000000,InterAct Hammerhead FX,a:b4,b:b5,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b1,y:b2,platform:Windows, +03000000fd0500005302000000000000,InterAct ProPad,a:b3,b:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,x:b0,y:b1,platform:Windows, +03000000ac0500002c02000000000000,Ipega Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000491900000204000000000000,Ipega PG9023,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000491900000304000000000000,Ipega PG9087,+righty:+a5,-righty:-a4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,start:b11,x:b3,y:b4,platform:Windows, +030000007e0500000620000000000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Windows, +030000007e0500000720000000000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows, +03000000250900000017000000000000,Joypad Adapter,a:b2,b:b1,back:b9,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b8,x:b3,y:b0,platform:Windows, +03000000bd12000003c0000000000000,Joypad Alpha Shock,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000ff1100004033000000000000,JPD FFB,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a2,start:b15,x:b3,y:b0,platform:Windows, +03000000242f00002d00000000000000,JYS Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000242f00008a00000000000000,JYS Adapter,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows, +03000000c4100000c082000000000000,KADE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000828200000180000000000000,Keio,a:b4,b:b5,back:b8,leftshoulder:b2,lefttrigger:b3,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b9,x:b0,y:b1,platform:Windows, +03000000790000000200000000000000,King PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +03000000bd12000001e0000000000000,Leadership,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +030000006f0e00000103000000000000,Logic3,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e00000104000000000000,Logic3,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000008f0e00001300000000000000,Logic3,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000006d040000d1ca000000000000,Logitech ChillStream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d040000d2ca000000000000,Logitech Cordless Precision,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d04000011c2000000000000,Logitech Cordless Wingman,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b5,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b2,righttrigger:b7,rightx:a3,righty:a4,x:b4,platform:Windows, +030000006d04000016c2000000000000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d0400001dc2000000000000,Logitech F310,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006d04000018c2000000000000,Logitech F510,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d0400001ec2000000000000,Logitech F510,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006d04000019c2000000000000,Logitech F710,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d0400001fc2000000000000,Logitech F710,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006d0400001ac2000000000000,Logitech Precision,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000006d04000009c2000000000000,Logitech WingMan,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows, +030000006d0400000bc2000000000000,Logitech WingMan Action Pad,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b8,lefttrigger:a5~,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b5,righttrigger:a2~,start:b8,x:b3,y:b4,platform:Windows, +030000006d0400000ac2000000000000,Logitech WingMan RumblePad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,rightx:a3,righty:a4,x:b3,y:b4,platform:Windows, +03000000380700005645000000000000,Lynx,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000222200006000000000000000,Macally,a:b1,b:b2,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b33,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700003888000000000000,Mad Catz Arcade Fightstick TE S Plus PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008532000000000000,Mad Catz Arcade Fightstick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700006352000000000000,Mad Catz CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700006652000000000000,Mad Catz CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000380700005032000000000000,Mad Catz Fightpad Pro PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700005082000000000000,Mad Catz Fightpad Pro PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008031000000000000,Mad Catz FightStick Alpha PS3 ,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000003807000038b7000000000000,Mad Catz Fightstick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, +03000000380700008433000000000000,Mad Catz Fightstick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008483000000000000,Mad Catz Fightstick TE S PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008134000000000000,Mad Catz Fightstick TE2 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b7,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b4,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008184000000000000,Mad Catz Fightstick TE2 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,leftstick:b10,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700006252000000000000,Mad Catz Micro CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008232000000000000,Mad Catz PlayStation Brawlpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008731000000000000,Mad Catz PlayStation Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000003807000056a8000000000000,Mad Catz PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700001888000000000000,Mad Catz SFIV Fightstick PS3,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b6,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000380700008081000000000000,Mad Catz SFV Arcade Fightstick Alpha PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700001847000000000000,Mad Catz Street Fighter 4 Xbox 360 FightStick,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, +03000000380700008034000000000000,Mad Catz TE2 PS3 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008084000000000000,Mad Catz TE2 PS4 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000002a0600001024000000000000,Matricom,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows, +030000009f000000adbb000000000000,MaxJoypad Virtual Controller,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000250900000128000000000000,Mayflash Arcade Stick,a:b1,b:b2,back:b8,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b5,y:b6,platform:Windows, +030000008f0e00001330000000000000,Mayflash Controller Adapter,a:b1,b:b2,back:b8,dpdown:h0.8,dpleft:h0.2,dpright:h0.1,dpup:h0.4,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3~,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000242f00003700000000000000,Mayflash F101,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000790000003018000000000000,Mayflash F300 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000242f00003900000000000000,Mayflash F300 Elite Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000790000004418000000000000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000790000004318000000000000,Mayflash GameCube Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000242f00007300000000000000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows, +0300000079000000d218000000000000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000d620000010a7000000000000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000242f0000f400000000000000,Mayflash N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a5,start:b9,platform:Windows, +03000000790000007918000000000000,Mayflash N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,righttrigger:b7,rightx:a3,righty:a2,start:b8,platform:Windows, +030000008f0e00001030000000000000,Mayflash Saturn Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:b7,rightshoulder:b6,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +0300000025090000e803000000000000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:a5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, +03000000790000000318000000000000,Mayflash Wii DolphinBar,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, +03000000790000000018000000000000,Mayflash Wii U Pro Adapter,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000790000002418000000000000,Mega Drive Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b2,start:b9,x:b3,y:b4,platform:Windows, +0300000079000000ae18000000000000,Mega Drive Controller,a:b0,b:b1,back:b7,dpdown:b14,dpleft:b15,dpright:b13,dpup:b2,rightshoulder:b6,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +03000000c0160000990a000000000000,Mega Drive Controller,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,righttrigger:b2,start:b3,platform:Windows, +030000005e0400002800000000000000,Microsoft Dual Strike,a:b3,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,rightx:a0,righty:a1~,start:b5,x:b1,y:b0,platform:Windows, +030000005e0400000300000000000000,Microsoft SideWinder,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows, +030000005e0400000700000000000000,Microsoft SideWinder,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +030000005e0400000e00000000000000,Microsoft SideWinder Freestyle Pro,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,start:b8,x:b3,y:b4,platform:Windows, +030000005e0400002700000000000000,Microsoft SideWinder Plug and Play,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,righttrigger:b5,x:b2,y:b3,platform:Windows, +03000000280d00000202000000000000,Miller Lite Cantroller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,start:b5,x:b2,y:b3,platform:Windows, +03000000ad1b000023f0000000000000,MLG,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a6,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000ad1b00003ef0000000000000,MLG Fightstick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, +03000000380700006382000000000000,MLG PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000ffff00000000000000000000,Mocute M053,a:b3,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b11,leftstick:b7,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b6,righttrigger:b4,rightx:a3,righty:a4,start:b8,x:b1,y:b0,platform:Windows, +03000000d6200000e589000000000000,Moga 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows, +03000000d62000007162000000000000,Moga Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows, +03000000d6200000ad0d000000000000,Moga Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c62400002a89000000000000,Moga XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c62400002b89000000000000,Moga XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c62400001a89000000000000,Moga XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c62400001b89000000000000,Moga XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000250900006688000000000000,MP-8866 Super Dual Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000091200004488000000000000,MUSIA PlayStation 2 Input Display,a:b0,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b7,righttrigger:b11,rightx:a2,righty:a3,start:b5,x:b1,y:b3,platform:Windows, +03000000f70600000100000000000000,N64 Adaptoid,+rightx:b2,+righty:b1,-rightx:b4,-righty:b5,a:b0,b:b3,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,platform:Windows, +030000006b140000010c000000000000,Nacon GC 400ES,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000006b1400001106000000000000,Nacon Revolution 3 PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000006b140000100d000000000000,Nacon Revolution Infinity PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006b140000080d000000000000,Nacon Revolution Unlimited Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000bd12000001c0000000000000,Nebular,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000eb0300000000000000000000,NeGcon Adapter,a:a2,b:b13,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,lefttrigger:a4,leftx:a1,righttrigger:b11,start:b3,x:a3,y:b12,platform:Windows, +0300000038070000efbe000000000000,NEO SE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +0300000092120000474e000000000000,NeoGeo X Arcade Stick,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b3,y:b2,platform:Windows, +03000000921200004b46000000000000,NES 2 port Adapter,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b11,platform:Windows, +03000000000f00000100000000000000,NES Controller,a:b1,b:b0,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Windows, +03000000921200004346000000000000,NES Controller,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Windows, +03000000790000004518000000000000,NEXILUX GameCube Controller Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +030000001008000001e5000000000000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Windows, +03000000050b00000045000000000000,Nexus,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Windows, +03000000152000000182000000000000,NGDS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000000d0500000308000000000000,Nostromo N45,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,platform:Windows, +030000007e0500001920000000000000,NSO N64 Controller,+rightx:b8,+righty:b2,-rightx:b3,-righty:b7,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,righttrigger:b10,start:b9,platform:Windows, +030000007e0500001720000000000000,NSO SNES Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b15,start:b9,x:b2,y:b3,platform:Windows, +03000000550900001472000000000000,NVIDIA Controller,a:b11,b:b10,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b7,leftstick:b5,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b4,righttrigger:a5,rightx:a3,righty:a6,start:b3,x:b9,y:b8,platform:Windows, +03000000550900001072000000000000,NVIDIA Shield,a:b9,b:b8,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b3,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b2,righttrigger:a4,rightx:a2,righty:a5,start:b0,x:b7,y:b6,platform:Windows, +030000005509000000b4000000000000,NVIDIA Virtual,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000120c00000288000000000000,Nyko Air Flo Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +030000004b120000014d000000000000,Nyko Airflo,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a3,leftstick:a0,lefttrigger:b6,rightshoulder:b5,rightstick:a2,righttrigger:b7,start:b9,x:b2,y:b3,platform:Windows, +03000000d62000001d57000000000000,Nyko Airflo PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000791d00000900000000000000,Nyko Playpad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000782300000a10000000000000,Onlive Controller,a:b15,b:b14,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b11,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b13,y:b12,platform:Windows, +030000000d0f00000401000000000000,Onyx,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000008916000001fd000000000000,Onza CE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a3,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000008916000000fd000000000000,Onza TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000d62000006d57000000000000,OPP PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006b14000001a1000000000000,Orange Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +03000000362800000100000000000000,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b13,rightx:a3,righty:a4,x:b1,y:b2,platform:Windows, +03000000120c0000f60e000000000000,P4 Gamepad,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b7,rightshoulder:b4,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, +03000000790000002201000000000000,PC Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000006f0e00008501000000000000,PDP Fightpad Pro,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b0,platform:Windows, +030000006f0e00000901000000000000,PDP PS3 Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000008f0e00004100000000000000,PlaySega,a:b1,b:b0,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b8,x:b4,y:b3,platform:Windows, +03000000666600006706000000000000,PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Windows, +03000000e30500009605000000000000,PlayStation Adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +030000004c050000da0c000000000000,PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, +03000000632500002306000000000000,PlayStation Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows, +03000000f0250000c183000000000000,PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000d9040000160f000000000000,PlayStation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +030000004c0500003713000000000000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000d62000006dca000000000000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +0300000062060000d570000000000000,PowerA PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000d620000013a7000000000000,PowerA Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d04000084ca000000000000,Precision,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000d62000009557000000000000,Pro Elite PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000c62400001a53000000000000,Pro Ex Mini,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000d62000009f31000000000000,Pro Ex mini PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000d6200000c757000000000000,Pro Ex mini PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000110e000000000000,Pro5,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000100800000100000000000000,PS1 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +030000008f0e00007530000000000000,PS1 Controller,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b1,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000100800000300000000000000,PS2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000250900000088000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000250900006888000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b6,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000250900008888000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +030000006b1400000303000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000009d0d00001330000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000151a00006222000000000000,PS2 Dual Plus Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000120a00000100000000000000,PS3 Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000120c00001307000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c00001cf1000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000f90e000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000250900000118000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000250900000218000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000250900000500000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b0,y:b3,platform:Windows, +030000004c0500006802000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b10,lefttrigger:a3~,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:a4~,rightx:a2,righty:a5,start:b8,x:b3,y:b0,platform:Windows, +030000004f1f00000800000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000632500007505000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000888800000803000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b9,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b0,platform:Windows, +03000000888800000804000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Windows, +030000008f0e00000300000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, +030000008f0e00001431000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000ba2200002010000000000000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b2,platform:Windows, +03000000120c00000807000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000111e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000121e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000130e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000150e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000180e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000181e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000191e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c00001e0e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000a957000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000aa57000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000f21c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000f31c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000f41c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000f51c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000f70e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000160e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000001a1e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004c050000a00b000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000004c050000cc09000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004c050000e60c000000000000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000004c050000f20d000000000000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +03000000830500005020000000000000,PSX,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b2,y:b3,platform:Windows, +03000000300f00000111000000000000,Qanba 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00000211000000000000,Qanba 2P,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000300f00000011000000000000,Qanba Arcade Stick 1008,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b10,x:b0,y:b3,platform:Windows, +03000000300f00001611000000000000,Qanba Arcade Stick 4018,a:b1,b:b2,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows, +03000000222c00000025000000000000,Qanba Dragon Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000222c00000020000000000000,Qanba Drone Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,rightshoulder:b5,righttrigger:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00001211000000000000,Qanba Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00001210000000000000,Qanba Joystick Plus,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows, +03000000341a00000104000000000000,Qanba Joystick Q4RAF,a:b5,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b1,y:b2,platform:Windows, +03000000222c00000223000000000000,Qanba Obsidian Arcade Stick PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000222c00000023000000000000,Qanba Obsidian Arcade Stick PS4,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000008a2400006682000000000000,R1 Mobile Controller,a:b3,b:b1,back:b7,leftx:a0,lefty:a1,start:b6,x:b4,y:b0,platform:Windows, +03000000086700006626000000000000,RadioShack,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, +03000000ff1100004733000000000000,Ramox FPS Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b0,platform:Windows, +030000009b2800002300000000000000,Raphnet 3DO Adapter,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b2,start:b3,platform:Windows, +030000009b2800006900000000000000,Raphnet 3DO Adapter,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b2,start:b3,platform:Windows, +030000009b2800000800000000000000,Raphnet Dreamcast Adapter,a:b2,b:b1,dpdown:b5,dpleft:b6,dpright:b7,dpup:b4,lefttrigger:a2,leftx:a0,righttrigger:a3,righty:a1,start:b3,x:b10,y:b9,platform:Windows, +030000009b2800006200000000000000,Raphnet GameCube Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows, +030000009b2800003200000000000000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:+a2,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows, +030000009b2800006000000000000000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:+a2,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows, +030000009b2800001800000000000000,Raphnet Jaguar Adapter,a:b2,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b0,righttrigger:b10,start:b3,x:b11,y:b12,platform:Windows, +030000009b2800006300000000000000,Raphnet N64 Adapter,+rightx:b9,+righty:b7,-rightx:b8,-righty:b6,a:b0,b:b1,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,lefttrigger:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Windows, +030000009b2800000200000000000000,Raphnet NES Adapter,a:b7,b:b6,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,start:b4,platform:Windows, +030000009b2800004400000000000000,Raphnet PS1 and PS2 Adapter,a:b1,b:b2,back:b5,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b9,rightx:a3,righty:a4,start:b4,x:b0,y:b3,platform:Windows, +030000009b2800004300000000000000,Raphnet Saturn,a:b0,b:b1,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows, +030000009b2800000500000000000000,Raphnet Saturn Adapter 2.0,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows, +030000009b2800000300000000000000,Raphnet SNES Adapter,a:b0,b:b4,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, +030000009b2800005600000000000000,Raphnet SNES Adapter,a:b1,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Windows, +030000009b2800005700000000000000,Raphnet SNES Adapter,a:b1,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Windows, +030000009b2800001e00000000000000,Raphnet Vectrex Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a1,lefty:a2,x:b2,y:b3,platform:Windows, +030000009b2800002b00000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows, +030000009b2800002c00000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows, +030000009b2800008000000000000000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows, +03000000321500000003000000000000,Razer Hydra,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000f8270000bf0b000000000000,Razer Kishi,a:b6,b:b7,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b18,leftshoulder:b12,leftstick:b19,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b13,rightstick:b20,righttrigger:b15,rightx:a2,righty:a5,start:b17,x:b9,y:b10,platform:Windows, +03000000321500000204000000000000,Razer Panthera PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000104000000000000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000010000000000000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000507000000000000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000321500000707000000000000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000321500000710000000000000,Razer Raiju TE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000a10000000000000,Razer Raiju TE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000410000000000000,Razer Raiju UE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000910000000000000,Razer Raiju UE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000011000000000000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000009000000000000,Razer Serval,+lefty:+a2,-lefty:-a1,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,leftx:a0,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000921200004547000000000000,Retro Bit Sega Genesis Controller Adapter,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b6,x:b3,y:b4,platform:Windows, +03000000790000001100000000000000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows, +03000000830500006020000000000000,Retro Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b8,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, +03000000bd12000013d0000000000000,Retrolink Sega Saturn Classic Controller,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b5,lefttrigger:b6,rightshoulder:b2,righttrigger:b7,start:b8,x:b3,y:b4,platform:Windows, +03000000bd12000015d0000000000000,Retrolink SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Windows, +03000000341200000400000000000000,RetroUSB N64 RetroPort,+rightx:b8,+righty:b10,-rightx:b9,-righty:b11,a:b7,b:b6,dpdown:b2,dpleft:b1,dpright:b0,dpup:b3,leftshoulder:b13,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b12,start:b4,platform:Windows, +0300000000f000000300000000000000,RetroUSB RetroPad,a:b1,b:b5,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Windows, +0300000000f00000f100000000000000,RetroUSB Super RetroPort,a:b1,b:b5,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Windows, +03000000830500000960000000000000,Revenger,a:b0,b:b1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b3,x:b4,y:b5,platform:Windows, +030000006b140000010d000000000000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000006b140000020d000000000000,Revolution Pro Controller 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000006b140000130d000000000000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001f01000000000000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e00004601000000000000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c6240000fefa000000000000,Rock Candy Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e00001e01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00002801000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00002f01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00008701000000000000,Rock Candy Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000050b0000e318000000000000,ROG Chakram,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows, +03000000050b0000e518000000000000,ROG Chakram,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows, +03000000050b00005819000000000000,ROG Chakram Core,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows, +03000000050b0000181a000000000000,ROG Chakram X,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows, +03000000050b00001a1a000000000000,ROG Chakram X,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows, +03000000050b00001c1a000000000000,ROG Chakram X,a:b1,b:b0,leftx:a0,lefty:a1,x:b2,y:b3,platform:Windows, +030000004f04000001d0000000000000,Rumble Force,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +030000008916000000fe000000000000,Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c6240000045d000000000000,Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000a30600001af5000000000000,Saitek Cyborg,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000a306000023f6000000000000,Saitek Cyborg V.1 Game,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00001201000000000000,Saitek Dual Analog,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +03000000a30600000701000000000000,Saitek P220,a:b2,b:b3,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,x:b0,y:b1,platform:Windows, +03000000a30600000cff000000000000,Saitek P2500 Force Rumble,a:b2,b:b3,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b0,y:b1,platform:Windows, +03000000a30600000d5f000000000000,Saitek P2600,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b8,x:b0,y:b3,platform:Windows, +03000000a30600000dff000000000000,Saitek P2600,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b8,x:b0,y:b3,platform:Windows, +03000000a30600000c04000000000000,Saitek P2900,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000a306000018f5000000000000,Saitek P3200,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00001001000000000000,Saitek P480 Rumble,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +03000000a30600000901000000000000,Saitek P880,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b8,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b5,rightx:a3,righty:a2,x:b0,y:b1,platform:Windows, +03000000a30600000b04000000000000,Saitek P990,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000a30600002106000000000000,Saitek PS1000 PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000a306000020f6000000000000,Saitek PS2700 PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00001101000000000000,Saitek Rumble,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +03000000e804000000a0000000000000,Samsung EIGP20,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c01100000252000000000000,Sanwa Easy Grip,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +03000000c01100004350000000000000,Sanwa Micro Grip P3,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,x:b3,y:b2,platform:Windows, +03000000411200004550000000000000,Sanwa Micro Grip Pro,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a1,righty:a2,start:b9,x:b1,y:b3,platform:Windows, +03000000c01100004150000000000000,Sanwa Micro Grip Pro,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +03000000c01100004450000000000000,Sanwa Online Grip,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,rightstick:b11,righttrigger:b9,rightx:a3,righty:a2,start:b14,x:b3,y:b4,platform:Windows, +03000000730700000401000000000000,Sanwa PlayOnline Mobile,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Windows, +03000000830500006120000000000000,Sanwa Smart Grip II,a:b0,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,x:b1,y:b3,platform:Windows, +03000000c01100000051000000000000,Satechi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +030000004f04000028b3000000000000,Score A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000952e00002577000000000000,Scuf PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000a30c00002500000000000000,Sega Genesis Mini 3B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Windows, +03000000a30c00002400000000000000,Sega Mega Drive Mini 6B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, +0300000000050000289b000000000000,Sega Saturn Adapter,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows, +0300000000f000000800000000000000,Sega Saturn Controller,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b7,righttrigger:b3,start:b0,x:b5,y:b6,platform:Windows, +03000000730700000601000000000000,Sega Saturn Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +03000000b40400000a01000000000000,Sega Saturn Controller,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows, +030000003b07000004a1000000000000,SFX,a:b0,b:b2,back:b7,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b5,start:b8,x:b1,y:b3,platform:Windows, +03000000f82100001900000000000000,Shogun Bros Chameleon X1,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000120c00001c1e000000000000,SnakeByte 4S PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +0300000003040000c197000000000000,SNES Controller,a:b0,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, +0300000081170000960a000000000000,SNES Controller,a:b4,b:b0,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b5,y:b1,platform:Windows, +03000000811700009d0a000000000000,SNES Controller,a:b0,b:b4,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, +030000008b2800000300000000000000,SNES Controller,a:b0,b:b4,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, +03000000921200004653000000000000,SNES Controller,a:b0,b:b4,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, +03000000ff000000cb01000000000000,Sony PlayStation Portable,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, +03000000341a00000208000000000000,Speedlink 6555,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:-a4,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a3,righty:a2,start:b7,x:b2,y:b3,platform:Windows, +03000000341a00000908000000000000,Speedlink 6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000380700001722000000000000,Speedlink Competition Pro,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,x:b2,y:b3,platform:Windows, +030000008f0e00000800000000000000,Speedlink Strike FX,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000c01100000591000000000000,Speedlink Torid,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000d11800000094000000000000,Stadia Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b11,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows, +03000000de280000fc11000000000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000de280000ff11000000000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000120c0000160e000000000000,Steel Play Metaltech PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000110100001914000000000000,SteelSeries,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000381000001214000000000000,SteelSeries Free,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows, +03000000110100003114000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000381000003014000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000381000003114000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000381000001814000000000000,SteelSeries Stratus XL,a:b0,b:b1,back:b18,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b19,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b2,y:b3,platform:Windows, +03000000790000001c18000000000000,STK 7024X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000380700003847000000000000,Street Fighter Fightstick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,start:b7,x:b2,y:b3,platform:Windows, +030000001f08000001e4000000000000,Super Famicom Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Windows, +03000000790000000418000000000000,Super Famicom Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b33,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, +03000000341200001300000000000000,Super Racer,a:b2,b:b3,back:b8,leftshoulder:b5,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b7,x:b0,y:b1,platform:Windows, +03000000d620000011a7000000000000,Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000f600000000000000,Switch Hori Pad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000457500002211000000000000,Szmy Power PC Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000004f0400000ab1000000000000,T16000M,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b10,x:b2,y:b3,platform:Windows, +030000000d0f00007b00000000000000,TAC GEAR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000e40a00000207000000000000,Taito Egret II Mini Controller,a:b4,b:b2,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b9,rightshoulder:b0,righttrigger:b1,start:b7,x:b8,y:b3,platform:Windows, +03000000d814000001a0000000000000,TE Kitty,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000fa1900000706000000000000,Team 5,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000b50700001203000000000000,Techmobility X6-38V,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +03000000ba2200000701000000000000,Technology Innovation PS2 Adapter,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b2,platform:Windows, +03000000c61100001000000000000000,Tencent Xianyou Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,x:b3,y:b4,platform:Windows, +03000000790000002601000000000000,TGZ,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, +03000000591c00002400000000000000,THEC64 Joystick,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, +03000000591c00002600000000000000,THEGamepad,a:b2,b:b1,back:b6,leftx:a0,lefty:a1,start:b7,x:b3,y:b0,platform:Windows, +030000004f04000015b3000000000000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +030000004f04000023b3000000000000,Thrustmaster Dual Trigger PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004f0400000ed0000000000000,ThrustMaster eSwap Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004f04000008d0000000000000,ThrustMaster Ferrari 150 PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Windows, +030000004f04000004b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +030000004f04000003d0000000000000,ThrustMaster Run N Drive PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b7,leftshoulder:a3,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:a4,rightstick:b11,righttrigger:b5,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004f04000009d0000000000000,ThrustMaster Run N Drive PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d04000088ca000000000000,Thunderpad,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000666600000288000000000000,TigerGame PlayStation Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000666600000488000000000000,TigerGame PlayStation Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +030000004f04000007d0000000000000,TMini,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000571d00002100000000000000,Tomee NES Controller Adapter,a:b1,b:b0,back:b2,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,start:b3,platform:Windows, +03000000571d00002000000000000000,Tomee SNES Controller Adapter,a:b0,b:b1,back:b6,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, +03000000d62000006000000000000000,Tournament PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000c01100000055000000000000,Tronsmart,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000005f140000c501000000000000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000b80500000210000000000000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000004f04000087b6000000000000,TWCS Throttle,dpdown:b8,dpleft:b9,dpright:b7,dpup:b6,leftstick:b5,lefttrigger:-a5,leftx:a0,lefty:a1,righttrigger:+a5,platform:Windows, +03000000411200000450000000000000,Twin Shock,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a4,start:b11,x:b3,y:b0,platform:Windows, +03000000d90400000200000000000000,TwinShock PS2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000151900005678000000000000,Uniplay U6,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000101c0000171c000000000000,uRage Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000000b0400003065000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, +03000000242f00006e00000000000000,USB Controller,a:b1,b:b4,back:b10,leftshoulder:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b7,rightx:a2,righty:a5,start:b11,x:b0,y:b3,platform:Windows, +03000000300f00000701000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000341a00002308000000000000,USB Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000666600000188000000000000,USB Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +030000006b1400000203000000000000,USB Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000790000000a00000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +03000000b404000081c6000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, +03000000b50700001503000000000000,USB Controller,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +03000000bd12000012d0000000000000,USB Controller,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, +03000000ff1100004133000000000000,USB Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000632500002305000000000000,USB Vibration Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000790000001a18000000000000,Venom,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000790000001b18000000000000,Venom Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00000302000000000000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00000702000000000000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +0300000034120000adbe000000000000,vJoy Device,a:b0,b:b1,back:b15,dpdown:b6,dpleft:b7,dpright:b8,dpup:b5,guide:b16,leftshoulder:b9,leftstick:b13,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b14,righttrigger:b12,rightx:a3,righty:a4,start:b4,x:b2,y:b3,platform:Windows, +03000000120c0000ab57000000000000,Warrior Joypad JS083,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000007e0500003003000000000000,Wii U Pro,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,leftshoulder:b6,leftstick:b11,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b12,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, +0300000032150000030a000000000000,Wildcat,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +0300000032150000140a000000000000,Wolverine,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000002e160000efbe000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,rightshoulder:b5,righttrigger:b11,start:b7,x:b2,y:b3,platform:Windows, +03000000380700001647000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000380700002045000000000000,Xbox 360 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700002644000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a2,righty:a5,start:b8,x:b2,y:b3,platform:Windows, +03000000380700002647000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000003807000026b7000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000380700003647000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a7,righty:a5,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400001907000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400008e02000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400009102000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000000fd000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000001fd000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000016f0000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b00008e02000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c62400000053000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c6240000fdfa000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000380700002847000000000000,Xbox 360 Fightpad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000a102000000000000,Xbox 360 Wireless Receiver,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400000a0b000000000000,Xbox Adaptive Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000120c00000a88000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a2,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000120c00001088000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2~,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5~,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000002a0600002000000000000000,Xbox Controller,a:b0,b:b1,back:b13,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,leftshoulder:b5,leftstick:b14,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b15,righttrigger:b7,rightx:a2,righty:a5,start:b12,x:b2,y:b3,platform:Windows, +03000000300f00008888000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:b13,dpleft:b10,dpright:b11,dpup:b12,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000380700001645000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000380700002645000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000380700003645000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000380700008645000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400000202000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +030000005e0400008502000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400008702000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b7,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +030000005e0400008902000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b10,leftstick:b8,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b9,righttrigger:b4,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +030000000d0f00006300000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400000c0b000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000d102000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000dd02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000e002000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000e302000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000ea02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000fd02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000ff02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e0000a802000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e0000c802000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c62400003a54000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000130b000000000000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000341a00000608000000000000,Xeox,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000450c00002043000000000000,Xeox SL6556BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000006f0e00000300000000000000,XGear,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000172700004431000000000000,Xiaomi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a7,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000172700003350000000000000,Xiaomi XMGP01YM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000bc2000005060000000000000,Xiaomi XMGP01YM,+lefty:+a2,+righty:+a5,-lefty:-a1,-righty:-a4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,start:b11,x:b3,y:b4,platform:Windows, +xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000007d0400000340000000000000,Xterminator Digital Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:-a4,lefttrigger:+a4,leftx:a0,lefty:a1,paddle1:b7,paddle2:b6,rightshoulder:b5,rightstick:b9,righttrigger:b2,rightx:a3,righty:a5,start:b8,x:b3,y:b4,platform:Windows, +03000000790000004f18000000000000,ZDT Android Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000120c00000500000000000000,Zeroplus Adapter,a:b2,b:b1,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b0,righttrigger:b5,rightx:a3,righty:a2,start:b8,x:b3,y:b0,platform:Windows, +03000000120c0000101e000000000000,Zeroplus P4 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, + +# Mac OS X +030000008f0e00000300000009010000,2 In 1 Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000c82d00000031000001000000,8BitDo Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00000531000000020000,8BitDo Adapter 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00000951000000010000,8BitDo Dogbone,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Mac OS X, +03000000c82d00000090000001000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001038000000010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001251000000010000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001251000000020000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001151000000010000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001151000000020000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000a30c00002400000006020000,8BitDo M30,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,guide:b9,leftshoulder:b6,lefttrigger:b5,rightshoulder:b4,righttrigger:b7,start:b8,x:b3,y:b0,platform:Mac OS X, +03000000c82d00000151000000010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00000650000001000000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00005106000000010000,8BitDo M30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b2,leftshoulder:b6,lefttrigger:a5,rightshoulder:b7,righttrigger:a4,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000451000000010000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Mac OS X, +03000000c82d00001590000001000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00006928000000010000,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,platform:Mac OS X, +030000003512000012ab000001000000,8BitDo NES30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d000012ab000001000000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00002028000000010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000022000000090000001000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000203800000900000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000190000001000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000751000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00000851000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00000660000000010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000660000000020000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000131000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000231000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000331000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000431000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00002867000000010000,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b3,y:b4,platform:Mac OS X, +03000000102800000900000000000000,8BitDo SFC30 Joystick,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000351000000010000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001290000001000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00004028000000010000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000160000001000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000260000001000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000261000000010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001230000000010000,8BitDo Ultimate,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00001530000001000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00001630000001000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00001730000001000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00001130000000020000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00001330000001000000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00001330000000020000,8BitDo Ultimate Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000a00500003232000008010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000a00500003232000009010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00001890000001000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a31,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000491900001904000001010000,Amazon Luna Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Mac OS X, +03000000710100001904000000010000,Amazon Luna Controller,a:b0,b:b1,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Mac OS X, +03000000a30c00002700000003030000,Astro City Mini,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000a30c00002800000003030000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000050b00000579000000010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b42,paddle1:b9,paddle2:b11,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X, +03000000050b00000679000000010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b23,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X, +03000000503200000110000047010000,Atari VCS Classic Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b3,start:b2,platform:Mac OS X, +03000000503200000210000047010000,Atari VCS Modern Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a2,righty:a3,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000c62400001a89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X, +03000000c62400001b89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000d62000002a79000000010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000120c0000200e000000010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000120c0000210e000000010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000008305000031b0000000000000,Cideko AK08b,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000d8140000cecf000000000000,Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000260900008888000088020000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Mac OS X, +03000000a306000022f6000001030000,Cyborg V3 Rumble Pad PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000791d00000103000009010000,Dual Box Wii Classic Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +030000006e0500000720000010020000,Elecom JC-W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Mac OS X, +030000006f0e00008401000003010000,Faceoff Premiere Wired Pro Controller for Nintendo Switch,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b13,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000151900004000000001000000,Flydigi Vader 2,a:b14,b:b15,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Mac OS X, +03000000b40400001124000001040000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b14,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000b40400001224000003030000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b2,paddle1:b16,paddle2:b17,paddle3:b14,paddle4:b15,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000790000004618000000010000,GameCube Controller Adapter,a:b4,b:b0,dpdown:b56,dpleft:b60,dpright:b52,dpup:b48,lefttrigger:a12,leftx:a0,lefty:a4,rightshoulder:b28,righttrigger:a16,rightx:a20,righty:a8,start:b36,x:b8,y:b12,platform:Mac OS X, +03000000ac0500001a06000002020000,GameSir-T3 2.02,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000ad1b000001f9000000000000,Gamestop BB070 X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000c01100000140000000010000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006f0e00000102000000000000,GameStop Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000ff1100003133000007010000,GameWare PC Control Pad,a:b2,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b0,platform:Mac OS X, +030000007d0400000540000001010000,Gravis Eliminator Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000280400000140000000020000,Gravis GamePad Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000008f0e00000300000007010000,GreenAsia Joystick,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Mac OS X, +030000000d0f00002d00000000100000,Hori Fighting Commander 3 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00005f00000000000000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00005f00000000010000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00005e00000000000000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00005e00000000010000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00008400000000010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00008500000000010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000341a00000302000014010000,Hori Fighting Stick Mini,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00008800000000010000,Hori Fighting Stick mini 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00008700000000010000,Hori Fighting Stick mini 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00004d00000000000000,Hori Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00003801000008010000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Mac OS X, +030000000d0f00009200000000010000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f0000aa00000072050000,Hori Real Arcade Pro,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +030000000d0f00000002000015010000,Hori Switch Split Pad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00006e00000000010000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00006600000000010000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00006600000000000000,Horipad FPS Plus 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f0000ee00000000010000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000242e0000ff0b000000010000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Mac OS X, +03000000790000004e95000000010000,Hyperkin N64 Controller Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a5,righty:a2,start:b9,platform:Mac OS X, +03000000830500006020000000000000,iBuffalo Super Famicom Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Mac OS X, +03000000ef0500000300000000020000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Mac OS X, +03000000fd0500000030000010010000,Interact GoPad,a:b3,b:b4,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,x:b0,y:b1,platform:Mac OS X, +030000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Mac OS X, +030000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000242f00002d00000007010000,JYS Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +030000006d04000019c2000000000000,Logitech Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000016c2000000020000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000016c2000000030000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000016c2000014040000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000016c2000000000000,Logitech F310,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000018c2000000000000,Logitech F510,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000019c2000005030000,Logitech F710,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d0400001fc2000000000000,Logitech F710,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000006d04000018c2000000010000,Logitech RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3~,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000380700005032000000010000,Mad Catz PS3 Fightpad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000380700008433000000010000,Mad Catz PS3 Fightstick TE S Plus,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000380700005082000000010000,Mad Catz PS4 Fightpad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000380700008483000000010000,Mad Catz PS4 Fightstick TE S Plus,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000790000000600000007010000,Marvo GT-004,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +030000008f0e00001330000011010000,Mayflash Controller Adapter,a:b2,b:b4,back:b16,dpdown:h0.8,dpleft:h0.2,dpright:h0.1,dpup:h0.4,leftshoulder:b12,lefttrigger:b16,leftx:a0,lefty:a2,rightshoulder:b14,rightx:a6~,righty:a4,start:b18,x:b0,y:b6,platform:Mac OS X, +03000000790000004318000000010000,Mayflash GameCube Adapter,a:b4,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a12,leftx:a0,lefty:a4,rightshoulder:b28,righttrigger:a16,rightx:a20,righty:a8,start:b36,x:b8,y:b12,platform:Mac OS X, +03000000790000004418000000010000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000242f00007300000000020000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Mac OS X, +0300000079000000d218000026010000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000d620000010a7000003010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000008f0e00001030000011010000,Mayflash Saturn Adapter,a:b0,b:b2,dpdown:b28,dpleft:b30,dpright:b26,dpup:b24,leftshoulder:b10,lefttrigger:b14,rightshoulder:b12,righttrigger:b4,start:b18,x:b6,y:b8,platform:Mac OS X, +0300000025090000e803000000000000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Mac OS X, +03000000790000000318000000010000,Mayflash Wii DolphinBar,a:b8,b:b12,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b44,leftshoulder:b16,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b4,platform:Mac OS X, +03000000790000000018000000000000,Mayflash Wii U Pro Adapter,a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,platform:Mac OS X, +03000000790000000018000000010000,Mayflash Wii U Pro Adapter,a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,platform:Mac OS X, +030000005e0400002800000002010000,Microsoft Dual Strike,a:b3,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,rightx:a0,righty:a1~,start:b5,x:b1,y:b0,platform:Mac OS X, +030000005e0400000300000006010000,Microsoft SideWinder,a:b0,b:b1,back:b9,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Mac OS X, +030000005e0400000700000006010000,Microsoft SideWinder,a:b0,b:b1,back:b8,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Mac OS X, +030000005e0400002700000001010000,Microsoft SideWinder Plug and Play,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,righttrigger:b5,x:b2,y:b3,platform:Mac OS X, +03000000d62000007162000001000000,Moga Pro 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Mac OS X, +03000000c62400002a89000000010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c62400002b89000000010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000632500007505000000020000,NeoGeo mini PAD Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000921200004b46000003020000,NES 2-port Adapter,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b11,platform:Mac OS X, +030000001008000001e5000006010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000d620000011a7000000020000,Nintendo Switch Core Plus Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000d620000011a7000010050000,Nintendo Switch PowerA Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +030000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +050000007e05000009200000ff070000,Nintendo Switch Pro Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b3,y:b2,platform:Mac OS X, +030000007e0500001920000001000000,NSO N64 Controller,+rightx:b8,+righty:b7,-rightx:b3,-righty:b2,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,righttrigger:b10,start:b9,platform:Mac OS X, +030000007e0500001720000001000000,NSO SNES Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b15,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000550900001472000025050000,NVIDIA Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Mac OS X, +030000004b120000014d000000010000,Nyko Airflo EX,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Mac OS X, +030000006f0e00000901000002010000,PDP PS3 Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000008f0e00000300000000000000,Piranha Xtreme PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000666600006706000088020000,PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Mac OS X, +030000004c050000da0c000000010000,PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +030000004c0500003713000000010000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000d62000006dca000000010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000100800000300000006010000,PS2 Adapter,a:b2,b:b1,back:b8,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +030000004c0500006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X, +030000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X, +030000004c0500006802000072050000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X, +030000004c050000a00b000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +030000004c050000f20d000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +050000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +050000004c050000f20d000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +030000005e040000e002000001000000,PXN P30 Pro Mobile,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Mac OS X, +03000000222c00000225000000010000,Qanba Dragon Arcade Joystick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000222c00000020000000010000,Qanba Drone Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000008916000000fd000000000000,Razer Onza TE,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000321500000204000000010000,Razer Panthera PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000321500000104000000010000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000321500000010000000010000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000321500000507000001010000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000321500000011000000010000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000321500000009000000020000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X, +030000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X, +0300000032150000030a000000000000,Razer Wildcat,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000632500008005000000010000,Redgear,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +030000000d0f0000c100000072050000,Retro Bit Sega Genesis 6B Controller,a:b2,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b8,rightshoulder:b6,righttrigger:b7,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000921200004547000000020000,Retro Bit Sega Genesis Controller Adapter,a:b0,b:b2,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,lefttrigger:b14,rightshoulder:b10,righttrigger:b4,start:b12,x:b6,y:b8,platform:Mac OS X, +03000000790000001100000000000000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000790000001100000005010000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b4,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000830500006020000000010000,Retro Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b8,righttrigger:b9,start:b7,x:b2,y:b3,platform:Mac OS X, +03000000790000001100000006010000,Retrolink SNES Controller,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000341200000400000000000000,RetroUSB N64 RetroPort,+rightx:b8,+righty:b10,-rightx:b9,-righty:b11,a:b7,b:b6,dpdown:b2,dpleft:b1,dpright:b0,dpup:b3,leftshoulder:b13,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b12,start:b4,platform:Mac OS X, +030000006b140000010d000000010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006b140000130d000000010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004c0500006802000002100000,Rii RK707,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b2,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b3,righttrigger:b9,rightx:a2,righty:a3,start:b1,x:b15,y:b12,platform:Mac OS X, +03000000c6240000fefa000000000000,Rock Candy PS3,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000006f0e00008701000005010000,Rock Candy Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000e804000000a000001b010000,Samsung EIGP20,a:b1,b:b3,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b11,leftx:a1,lefty:a3,rightshoulder:b12,rightx:a4,righty:a5,start:b16,x:b7,y:b9,platform:Mac OS X, +03000000730700000401000000010000,Sanwa PlayOnline Mobile,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Mac OS X, +03000000a30c00002500000006020000,Sega Genesis Mini 3B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Mac OS X, +03000000811700007e05000000000000,Sega Saturn,a:b2,b:b4,dpdown:b16,dpleft:b15,dpright:b14,dpup:b17,leftshoulder:b8,lefttrigger:a5,leftx:a0,lefty:a2,rightshoulder:b9,righttrigger:a4,start:b13,x:b0,y:b6,platform:Mac OS X, +03000000b40400000a01000000000000,Sega Saturn,a:b0,b:b1,back:b5,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b2,leftshoulder:b6,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Mac OS X, +030000003512000021ab000000000000,SFC30 Joystick,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +0300000000f00000f100000000000000,SNES RetroPort,a:b2,b:b3,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b5,rightshoulder:b7,start:b6,x:b0,y:b1,platform:Mac OS X, +030000004c050000a00b000000000000,Sony DualShock 4 Adapter,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004c050000cc09000000000000,Sony DualShock 4 V2,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000d11800000094000000010000,Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X, +030000005e0400008e02000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000110100002014000000000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X, +03000000110100002014000001000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X, +03000000381000002014000001000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X, +05000000484944204465766963650000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X, +050000004e696d6275732b0000000000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X, +03000000381000003014000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000381000003114000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000110100001714000000000000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,start:b12,x:b2,y:b3,platform:Mac OS X, +03000000110100001714000020010000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,start:b12,x:b2,y:b3,platform:Mac OS X, +030000000d0f0000f600000000010000,Switch Hori Pad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000457500002211000000010000,SZMY Power PC Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000790000001c18000003100000,TGZ Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000591c00002400000021000000,THEC64 Joystick,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Mac OS X, +03000000591c00002600000021000000,THEGamepad,a:b2,b:b1,back:b6,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Mac OS X, +030000004f04000015b3000000000000,Thrustmaster Dual Analog 3.2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Mac OS X, +030000004f0400000ed0000000020000,ThrustMaster eSwap Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Mac OS X, +03000000571d00002100000021000000,Tomee NES Controller Adapter,a:b1,b:b0,back:b2,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,start:b3,platform:Mac OS X, +03000000bd12000015d0000000010000,Tomee Retro Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000bd12000015d0000000000000,Tomee SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000571d00002000000021000000,Tomee SNES Controller Adapter,a:b0,b:b1,back:b6,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Mac OS X, +030000005f140000c501000000020000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000100800000100000000000000,Twin USB Joystick,a:b4,b:b2,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b12,leftstick:b20,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b14,rightstick:b22,righttrigger:b10,rightx:a6,righty:a4,start:b18,x:b6,y:b0,platform:Mac OS X, +03000000632500002605000000010000,Uberwith Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000151900005678000010010000,Uniplay U6,a:b3,b:b6,back:b25,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,leftstick:b31,lefttrigger:b21,leftx:a1,lefty:a3,rightshoulder:b19,rightstick:b33,righttrigger:b23,rightx:a4,righty:a5,start:b27,x:b11,y:b13,platform:Mac OS X, +030000006f0e00000302000025040000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006f0e00000702000003060000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +050000005769696d6f74652028303000,Wii Remote,a:b4,b:b5,back:b7,dpdown:b3,dpleft:b0,dpright:b1,dpup:b2,guide:b8,leftshoulder:b11,lefttrigger:b12,leftx:a0,lefty:a1,start:b6,x:b10,y:b9,platform:Mac OS X, +050000005769696d6f74652028313800,Wii U Pro Controller,a:b16,b:b15,back:b7,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b8,leftshoulder:b19,leftstick:b23,lefttrigger:b21,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b24,righttrigger:b22,rightx:a2,righty:a3,start:b6,x:b18,y:b17,platform:Mac OS X, +030000005e0400008e02000000000000,Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000006f0e00000104000000000000,Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000c6240000045d000000000000,Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e0400000a0b000000000000,Xbox Adaptive Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000050b000003090000,Xbox Elite Controller Series 2,a:b0,b:b1,back:b31,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b53,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000130b000011050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000200b000011050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000200b000013050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000200b000015050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000d102000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000dd02000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000e002000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Mac OS X, +030000005e040000e002000003090000,Xbox One Controller,a:b0,b:b1,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000e302000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000ea02000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000fd02000003090000,Xbox One Controller,a:b0,b:b1,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c62400003a54000000000000,Xbox One PowerA Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000130b000001050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000130b000009050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000130b000013050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000130b000015050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000172700004431000029010000,XiaoMi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000120c0000100e000000010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000120c0000101e000000010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, # Linux -0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, -03000000ba2200002010000001010000,Jess Technology USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, -030000006d04000019c2000010010000,Logitech Cordless RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000006d0400001dc2000014400000,Logitech F310 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006d04000016c2000011010000,Logitech F310 Gamepad (DInput),x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,platform:Linux, -030000006d0400001ec2000020200000,Logitech F510 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000006d04000019c2000011010000,Logitech F710 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000006d0400001fc2000005030000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000020010000,8BitDo Adapter,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c82d00000031000011010000,8BitDo Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00000951000000010000,8BitDo Dogbone,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Linux, +03000000021000000090000011010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000090000011010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00001038000000010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00001251000011010000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00001251000000010000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00001151000011010000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00001151000000010000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000151000000010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00000650000011010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,start:b11,x:b3,y:b4,platform:Linux, +05000000c82d00005106000000010000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00000451000000010000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Linux, +03000000c82d00001590000011010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00006928000000010000,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,platform:Linux, +03000000008000000210000011010000,8BitDo NES30,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000c82d00000310000011010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux, +05000000c82d00008010000000010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux, +03000000022000000090000011010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000190000011010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000203800000900000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00002038000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000751000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000c82d00000851000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00000660000011010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000660000000010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000631000014010000,8BitDo Pro 2 Wired Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c82d00001030000011010000,8BitDo Pro 2 Wired Controller,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000020000000000000,8BitDo Pro 2 Wired Controller for Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +06000000c82d00000020000006010000,8BitDo Pro 2 Wired Controller for Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c82d00000131000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000231000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000331000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000431000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00002867000000010000,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b3,y:b4,platform:Linux, +05000000c82d00000060000000010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000061000000010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +030000003512000012ab000010010000,8BitDo SFC30,a:b2,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Linux, +030000003512000021ab000010010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d000021ab000010010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +05000000102800000900000000010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00003028000000010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000351000000010000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000160000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00001290000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00006228000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000260000011010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000261000000010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000202800000900000000010000,8BitDo SNES30,a:b1,b:b0,back:b10,dpdown:b122,dpleft:b119,dpright:b120,dpup:b117,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00001230000000010000,8BitDo Ultimate,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00001730000011010000,8BitDo Ultimate a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00001530000011010000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00001630000011010000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00001130000011010000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b24,paddle2:b25,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00000760000011010000,8BitDo Ultimate Wireless,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00001230000011010000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00001330000011010000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00000121000011010000,8BitDo Xbox One SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000c82d00000121000000010000,8BitDo Xbox One SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000a00500003232000001000000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux, +05000000a00500003232000008010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00001890000011010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +050000005e040000e002000030110000,8BitDo Zero 2,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux, +05000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c01100000355000011010000,Acrux Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e00003901000000430000,Afterglow Prismatic Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00003901000013020000,Afterglow Prismatic Controller 048-007-NA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00001302000000010000,Afterglow Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00003901000020060000,Afterglow Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000100000008200000011010000,Akishop Customs PS360,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000007c1800000006000010010000,Alienware Dual Compatible Game PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Linux, +05000000491900000204000021000000,Amazon Fire Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b17,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b12,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000491900001904000011010000,Amazon Luna Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Linux, +05000000710100001904000000010000,Amazon Luna Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, +03000000790000003018000011010000,Arcade Fightstick F300,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000a30c00002700000011010000,Astro City Mini,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, +03000000a30c00002800000011010000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, +05000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux, +05000000050b00000045000040000000,ASUS Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux, +03000000050b00000579000011010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b36,paddle1:b52,paddle2:b53,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000050b00000679000000010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b21,paddle1:b22,paddle2:b23,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000503200000110000000000000,Atari Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux, +03000000503200000110000011010000,Atari Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux, +05000000503200000110000000000000,Atari Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux, +05000000503200000110000044010000,Atari Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux, +05000000503200000110000046010000,Atari Classic Controller,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,platform:Linux, +03000000503200000210000000000000,Atari Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a2,righty:a3,start:b8,x:b2,y:b3,platform:Linux, +03000000503200000210000011010000,Atari Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux, +05000000503200000210000000000000,Atari Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux, +05000000503200000210000045010000,Atari Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux, +05000000503200000210000046010000,Atari Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux, +05000000503200000210000047010000,Atari VCS Modern Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:-a4,rightx:a2,righty:a3,start:b8,x:b2,y:b3,platform:Linux, +03000000c62400001b89000011010000,BDA MOGA XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000d62000002a79000011010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000c21100000791000011010000,Be1 GC101 Controller 1.03,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000c31100000791000011010000,Be1 GC101 Controller 1.03,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000005e0400008e02000003030000,Be1 GC101 Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000bc2000004d50000011010000,BEITONG A1T2 BFM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000bc2000000055000001000000,BETOP AX1 BFM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000bc2000006412000011010000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b30,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000006b1400000209000011010000,Bigben,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000120c0000200e000011010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000120c0000210e000011010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000120c0000f70e000011010000,Brook Universal Fighting Board,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000e82000006058000001010000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000000b0400003365000000010000,Competition Pro,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Linux, +03000000260900008888000000010000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Linux, +03000000a306000022f6000011010000,Cyborg V3 Rumble,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux, +03000000791d00000103000010010000,Dual Box Wii Classic Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000006f0e00003001000001010000,EA Sports PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000c11100000191000011010000,EasySMX,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000242f00009100000000010000,EasySMX ESM-9101,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006e0500000320000010010000,Elecom U3613M,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Linux, +030000006e0500000720000010010000,Elecom W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Linux, +030000007d0400000640000010010000,Eliminator AfterShock,a:b1,b:b2,back:b9,dpdown:+a3,dpleft:-a5,dpright:+a5,dpup:-a3,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a4,righty:a2,start:b8,x:b0,y:b3,platform:Linux, +03000000430b00000300000000010000,EMS Production PS2 Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +03005036852100000201000010010000,Final Fantasy XIV Online Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000b40400001124000011010000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b14,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000b40400001224000011010000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b2,paddle1:b16,paddle2:b17,paddle3:b14,paddle4:b15,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000151900004000000001000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b14,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000007e0500003703000000000000,GameCube Adapter,a:b0,b:b1,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux, +19000000030000000300000002030000,GameForce Controller,a:b1,b:b0,back:b8,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b14,lefttrigger:b6,leftx:a1,lefty:a0,rightshoulder:b5,rightstick:b15,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +03000000ac0500005b05000010010000,GameSir G3w,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000bc2000000055000011010000,GameSir G3w,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000558500001b06000010010000,GameSir G4 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000ac0500002d0200001b010000,GameSir G4s,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b33,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000ac0500007a05000011010000,GameSir G5,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b16,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000bc2000005656000011010000,GameSir T4w,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000ac0500001a06000011010000,GameSir-T3 2.02,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000006f0e00000104000000010000,Gamestop Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000008f0e00000800000010010000,Gasia PlayStation Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000451300000010000010010000,Genius Maxfire Grandias 12,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +190000004b4800000010000000010000,GO-Advance Controller,a:b1,b:b0,back:b10,dpdown:b7,dpleft:b8,dpright:b9,dpup:b6,leftshoulder:b4,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b13,start:b15,x:b2,y:b3,platform:Linux, +190000004b4800000010000001010000,GO-Advance Controller,a:b1,b:b0,back:b12,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,leftshoulder:b4,leftstick:b13,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b16,righttrigger:b15,start:b17,x:b2,y:b3,platform:Linux, +190000004b4800000011000000010000,GO-Super Controller,a:b1,b:b0,back:b12,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b16,leftshoulder:b4,leftstick:b14,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b15,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b2,y:b3,platform:Linux, +03000000f0250000c183000010010000,Goodbetterbest Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +0300000079000000d418000000010000,GPD Win 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000007d0400000540000000010000,Gravis Eliminator Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000280400000140000000010000,Gravis GamePad Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000008f0e00000610000000010000,GreenAsia Electronics Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Linux, +030000008f0e00001200000010010000,GreenAsia Joystick,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +0500000047532067616d657061640000,GS gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000f0250000c383000010010000,GT VX2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +06000000adde0000efbe000002010000,Hidromancer Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d81400000862000011010000,HitBox PS3 PC Analog Mode,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b12,x:b0,y:b3,platform:Linux, +03000000c9110000f055000011010000,HJC Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000632500002605000010010000,HJDX,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000000d0f00000d00000000010000,Hori,a:b0,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b3,rightshoulder:b7,start:b9,x:b1,y:b2,platform:Linux, +030000000d0f00006d00000020010000,Hori EDGE 301,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:+a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000000d0f00008400000011010000,Hori Fighting Commander,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00005f00000011010000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00005e00000011010000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00005001000009040000,Hori Fighting Commander OCTA Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000000d0f00008500000010010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00008600000002010000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000000d0f00003701000013010000,Hori Fighting Stick Mini,a:b1,b:b0,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b3,y:b2,platform:Linux, +030000000d0f00008800000011010000,Hori Fighting Stick mini 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00008700000011010000,Hori Fighting Stick mini 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,rightshoulder:b5,rightstick:b11,righttrigger:a4,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00001000000011010000,Hori Fightstick 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000ad1b000003f5000033050000,Hori Fightstick VX,+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b8,guide:b10,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux, +030000000d0f00004d00000011010000,Hori Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000ad1b000001f5000033050000,Hori Pad EX Turbo 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000000d0f00003801000011010000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Linux, +030000000d0f00009200000011010000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f0000aa00000011010000,Hori Real Arcade Pro,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000000d0f00001100000011010000,Hori Real Arcade Pro 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00002200000011010000,Hori Real Arcade Pro 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00006a00000011010000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00006b00000011010000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00001600000000010000,Hori Real Arcade Pro EXSE,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux, +030000000d0f00008501000015010000,Hori Switch Split Pad Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000000d0f00006e00000011010000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00006600000011010000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f0000ee00000011010000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00006700000001010000,Horipad One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000000d0f0000c100000011010000,Horipad S,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +050000000d0f0000f600000001000000,Horipad Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000341a000005f7000010010000,HuiJia GameCube Controller Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Linux, +05000000242e00000b20000001000000,Hyperkin Admiral N64 Controller,+rightx:b11,+righty:b13,-rightx:b8,-righty:b12,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,platform:Linux, +03000000242e0000ff0b000011010000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Linux, +03000000242e00006a38000010010000,Hyperkin Trooper 2,a:b0,b:b1,back:b4,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b3,start:b5,platform:Linux, +03000000242e00008816000001010000,Hyperkin X91,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000f00300008d03000011010000,HyperX Clutch,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000830500006020000010010000,iBuffalo Super Famicom Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux, +050000006964726f69643a636f6e0000,idroidcon Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000b50700001503000010010000,Impact,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, +03000000d80400008200000003000000,IMS PCU0,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b5,x:b3,y:b2,platform:Linux, +03000000120c00000500000010010000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Linux, +03000000ef0500000300000000010000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Linux, +03000000fd0500000030000000010000,InterAct GoPad,a:b3,b:b4,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,x:b0,y:b1,platform:Linux, +03000000fd0500002a26000000010000,InterAct HammerHead FX,a:b3,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b2,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b5,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Linux, +0500000049190000020400001b010000,Ipega PG 9069,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b161,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000632500007505000011010000,Ipega PG 9099,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +0500000049190000030400001b010000,Ipega PG9099,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000491900000204000000000000,Ipega PG9118,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000300f00001001000010010000,Jess Tech Dual Analog Rumble,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, +03000000300f00000b01000010010000,Jess Tech GGE909 PC Recoil,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +03000000ba2200002010000001010000,Jess Technology Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +030000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Linux, +050000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Linux, +030000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Linux, +050000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Linux, +03000000bd12000003c0000010010000,Joypad Alpha Shock,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000242f00002d00000011010000,JYS Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000242f00008a00000011010000,JYS Adapter,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Linux, +030000006f0e00000103000000020000,Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d040000d1ca000000000000,Logitech Chillstream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d040000d1ca000011010000,Logitech Chillstream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d04000019c2000010010000,Logitech Cordless RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d04000016c2000010010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d04000016c2000011010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d0400001dc2000014400000,Logitech F310,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d0400001ec2000019200000,Logitech F510,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d0400001ec2000020200000,Logitech F510,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d04000019c2000011010000,Logitech F710,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d0400001fc2000005030000,Logitech F710,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d04000018c2000010010000,Logitech RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d04000011c2000010010000,Logitech WingMan Cordless RumblePad,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b10,rightx:a3,righty:a4,start:b8,x:b3,y:b4,platform:Linux, +030000006d0400000ac2000010010000,Logitech WingMan RumblePad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,rightx:a3,righty:a4,x:b3,y:b4,platform:Linux, +05000000380700006652000025010000,Mad Catz CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700008532000010010000,Mad Catz Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000380700005032000011010000,Mad Catz Fightpad Pro PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700005082000011010000,Mad Catz Fightpad Pro PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000ad1b00002ef0000090040000,Mad Catz Fightpad SFxT,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Linux, +03000000380700008034000011010000,Mad Catz Fightstick PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700008084000011010000,Mad Catz Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000380700008433000011010000,Mad Catz Fightstick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700008483000011010000,Mad Catz Fightstick TE S PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000380700001888000010010000,Mad Catz Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700003888000010010000,Mad Catz Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:a0,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700001647000010040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000380700003847000090040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000ad1b000016f0000090040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000120c00000500000000010000,Manta Dualshock 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +030000008f0e00001330000010010000,Mayflash Controller Adapter,a:b1,b:b2,back:b8,dpdown:h0.8,dpleft:h0.2,dpright:h0.1,dpup:h0.4,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3~,righty:a2,start:b9,x:b0,y:b3,platform:Linux, +03000000790000004318000010010000,Mayflash GameCube Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +03000000790000004418000010010000,Mayflash GameCube Controller,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +03000000242f00007300000011010000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Linux, +0300000079000000d218000011010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000d620000010a7000011010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000242f0000f700000001010000,Mayflash Magic S Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000008f0e00001030000010010000,Mayflash Saturn Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:b7,rightshoulder:b6,righttrigger:b2,start:b9,x:b3,y:b4,platform:Linux, +0300000025090000e803000001010000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:a5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, +03000000790000000318000011010000,Mayflash Wii DolphinBar,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Linux, +03000000790000000018000011010000,Mayflash Wii U Pro Adapter,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000b50700001203000010010000,Mega World Logic 3 Controller,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, +03000000b50700004f00000000010000,Mega World Logic 3 Controller,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Linux, +03000000780000000600000010010000,Microntek Joystick,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, +030000005e0400002800000000010000,Microsoft Dual Strike,a:b3,b:b2,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,rightx:a0,righty:a1~,start:b5,x:b1,y:b0,platform:Linux, +030000005e0400000300000000010000,Microsoft SideWinder,a:b0,b:b1,back:b9,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Linux, +030000005e0400000700000000010000,Microsoft SideWinder,a:b0,b:b1,back:b8,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Linux, +030000005e0400000e00000000010000,Microsoft SideWinder Freestyle Pro,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Linux, +030000005e0400002700000000010000,Microsoft SideWinder Plug and Play,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,righttrigger:b5,x:b2,y:b3,platform:Linux, +030000005e0400008502000000010000,Microsoft Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, +030000005e0400008902000021010000,Microsoft Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, +030000005e0400008e02000001000000,Microsoft Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.1,dpleft:h0.2,dpright:h0.8,dpup:h0.4,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000004010000,Microsoft Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000056210000,Microsoft Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000062230000,Microsoft Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000d102000001010000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000d102000003020000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000dd02000003020000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000ea02000008040000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +060000005e040000120b000009050000,Microsoft Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000e302000003020000,Microsoft Xbox One Elite,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000000b000007040000,Microsoft Xbox One Elite 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b12,paddle2:b14,paddle3:b13,paddle4:b15,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000000b000008040000,Microsoft Xbox One Elite 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b12,paddle2:b14,paddle3:b13,paddle4:b15,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000050b000003090000,Microsoft Xbox One Elite 2,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000005e040000120b00000b050000,Microsoft Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000030000000300000002000000,Miroof,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux, +050000004d4f435554452d3035335800,Mocute 053X,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +05000000e80400006e0400001b010000,Mocute 053X M59,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000004d4f435554452d3035305800,Mocute 054X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000d6200000e589000001000000,Moga 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, +05000000d6200000ad0d000001000000,Moga Pro,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, +05000000d62000007162000001000000,Moga Pro 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, +03000000c62400002b89000011010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000c62400002a89000000010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b22,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000c62400001a89000000010000,MOGA XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000250900006688000000010000,MP8866 Super Dual Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux, +030000005e0400008e02000010020000,MSI GC20 V2,a:b0,b:b1,back:b6,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006b1400000906000014010000,Nacon Asymmetric Wireless PS4 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006b140000010c000010010000,Nacon GC 400ES,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000853200000706000012010000,Nacon GC-100,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000000d0f00000900000010010000,Natec Genesis P44,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000004f1f00000800000011010000,NeoGeo PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +0300000092120000474e000000010000,NeoGeo X Arcade Stick,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b3,y:b2,platform:Linux, +03000000790000004518000010010000,Nexilux GameCube Controller Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +030000001008000001e5000010010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Linux, +060000007e0500003713000000000000,Nintendo 3DS,a:b0,b:b1,back:b8,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, +030000009b2800008000000020020000,Nintendo Classic Controller,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Linux, +030000007e0500003703000000016800,Nintendo GameCube Controller,a:b0,b:b2,dpdown:b6,dpleft:b4,dpright:b5,dpup:b7,lefttrigger:a4,leftx:a0,lefty:a1~,rightshoulder:b9,righttrigger:a5,rightx:a2,righty:a3~,start:b8,x:b1,y:b3,platform:Linux, +03000000790000004618000010010000,Nintendo GameCube Controller Adapter,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a5~,righty:a2~,start:b9,x:b2,y:b3,platform:Linux, +060000004e696e74656e646f20537700,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, +060000007e0500000620000000000000,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, +060000007e0500000820000000000000,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, +050000004c69632050726f20436f6e00,Nintendo Switch Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +050000007e0500000620000001800000,Nintendo Switch Left Joy-Con,a:b16,b:b15,back:b4,leftshoulder:b6,leftstick:b12,leftx:a1,lefty:a0~,rightshoulder:b8,start:b9,x:b14,y:b17,platform:Linux, +03000000d620000013a7000011010000,Nintendo Switch PowerA Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000d620000011a7000011010000,Nintendo Switch PowerA Core Plus Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000007e0500000920000000026803,Nintendo Switch Pro Controller,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Linux, +030000007e0500000920000011810000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, +050000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +050000007e0500000920000001800000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, +050000007e0500000720000001800000,Nintendo Switch Right Joy-Con,a:b1,b:b2,back:b9,leftshoulder:b4,leftstick:b10,leftx:a1~,lefty:a0,rightshoulder:b6,start:b8,x:b0,y:b3,platform:Linux, +05000000010000000100000003000000,Nintendo Wii Remote,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +050000007e0500003003000001000000,Nintendo Wii U Pro Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, +030000000d0500000308000010010000,Nostromo n45 Dual Analog,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,platform:Linux, +030000007e0500001920000011810000,NSO N64 Controller,+rightx:b10,+righty:b8,-rightx:b9,-righty:b7,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b3,lefttrigger:b2,leftx:a0,lefty:a1,misc1:b12,rightshoulder:b4,righttrigger:b5,start:b6,platform:Linux, +050000007e0500001920000001000000,NSO N64 Controller,+rightx:b8,+righty:b7,-rightx:b3,-righty:b2,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,righttrigger:b10,start:b9,platform:Linux, +050000007e0500001920000001800000,NSO N64 Controller,+rightx:b10,+righty:b8,-rightx:b9,-righty:b7,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b3,lefttrigger:b2,leftx:a0,lefty:a1,misc1:b12,rightshoulder:b4,righttrigger:b5,start:b6,platform:Linux, +030000007e0500001720000011810000,NSO SNES Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b2,platform:Linux, +050000007e0500001720000001000000,NSO SNES Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:b7,rightshoulder:b6,righttrigger:b8,start:b10,x:b3,y:b2,platform:Linux, +050000007e0500001720000001800000,NSO SNES Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b2,platform:Linux, +03000000550900001072000011010000,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b8,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000550900001472000011010000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux, +05000000550900001472000001000000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux, +03000000451300000830000010010000,NYKO CORE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +19000000010000000100000001010000,ODROID Go 2,a:b1,b:b0,dpdown:b7,dpleft:b8,dpright:b9,dpup:b6,guide:b10,leftshoulder:b4,leftstick:b12,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b13,righttrigger:b14,start:b15,x:b2,y:b3,platform:Linux, +19000000010000000200000011000000,ODROID Go 2,a:b1,b:b0,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b12,leftshoulder:b4,leftstick:b14,lefttrigger:b13,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b15,righttrigger:b16,start:b17,x:b2,y:b3,platform:Linux, +03000000c0160000dc27000001010000,OnyxSoft Dual JoyDivision,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b6,x:b2,y:b3,platform:Linux, +05000000362800000100000002010000,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux, +05000000362800000100000003010000,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux, +05000000362800000100000004010000,OUYA Controller,a:b0,b:b3,back:b14,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b13,rightx:a3,righty:a4,start:b16,x:b1,y:b2,platform:Linux, +03000000830500005020000010010000,Padix Rockfire PlayStation Bridge,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b2,y:b3,platform:Linux, +03000000ff1100003133000010010000,PC Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000006f0e0000b802000001010000,PDP Afterglow Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e0000b802000013020000,PDP Afterglow Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00006401000001010000,PDP Battlefield One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e0000d702000006640000,PDP Black Camo Wired Xbox Series X Controller,a:b0,b:b1,back:b6,dpdown:b13,dpleft:b14,dpright:b13,dpup:b14,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00003101000000010000,PDP EA Sports Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00008001000011010000,PDP Faceoff Nintendo Switch Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e0000c802000012010000,PDP Kingdom Hearts Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00008501000011010000,PDP Nintendo Switch Fightpad Pro,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000006f0e00002801000011010000,PDP PS3 Rock Candy Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e00000901000011010000,PDP PS3 Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000ad1b000004f9000000010000,PDP Xbox 360 Versus Fighting,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e0000a802000023020000,PDP Xbox One Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000006f0e0000a702000023020000,PDP Xbox One Raven Black,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e0000d802000006640000,PDP Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e0000ef02000007640000,PDP Xbox Series Kinetic Wired Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000666600006706000000010000,PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Linux, +030000004c050000da0c000011010000,PlayStation Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, +03000000d9040000160f000000010000,PlayStation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +030000004c0500003713000011010000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux, +03000000c62400000053000000010000,PowerA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c62400003a54000001010000,PowerA 1428124-01,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d62000000140000001010000,PowerA Fusion Pro 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c62400001a53000000010000,PowerA Mini Pro Ex,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d62000006dca000011010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000c62400001a58000001010000,PowerA Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d62000000220000001010000,PowerA Xbox One Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux, +03000000d62000000228000001010000,PowerA Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c62400001a54000001010000,PowerA Xbox One Mini Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d62000000240000001010000,PowerA Xbox One Spectra Infinity,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d62000000f20000001010000,PowerA Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b7,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d040000d2ca000011010000,Precision Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000ff1100004133000010010000,PS2 Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, +03000000341a00003608000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000004c0500006802000010010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +030000004c0500006802000010810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, 030000004c0500006802000011010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, -030000004c050000c405000011010000,Sony DualShock 4,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux, -050000004c050000c405000000010000,Sony DualShock 4 BT,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, -030000004c050000cc09000011010000,Sony DualShock 4 V2,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux, -050000004c050000cc09000000010000,Sony DualShock 4 V2 BT,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux, -030000004c050000a00b000011010000,Sony DualShock 4 Wireless Adaptor,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b13,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux, -030000006f0e00003001000001010000,EA Sports PS3 Controller,platform:Linux,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7, -03000000de280000ff11000001000000,Valve Streaming Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400008e02000014010000,X360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400008e02000010010000,X360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000005e0400001907000000010000,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000100800000100000010010000,Twin USB PS2 Adapter,a:b2,b:b1,y:b0,x:b3,start:b9,guide:,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5,platform:Linux, -03000000a306000023f6000011010000,Saitek Cyborg V.1 Game Pad,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a4,lefttrigger:b6,righttrigger:b7,platform:Linux, -030000004f04000020b3000010010000,Thrustmaster 2 in 1 DT,a:b0,b:b2,y:b3,x:b1,start:b9,guide:,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,platform:Linux, -030000004f04000023b3000000010000,Thrustmaster Dual Trigger 3-in-1,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a5, -030000008f0e00000300000010010000,GreenAsia Inc. USB Joystick ,platform:Linux,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2, -030000008f0e00001200000010010000,GreenAsia Inc. USB Joystick ,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a2, -030000005e0400009102000007010000,X360 Wireless Controller,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:b13,dpleft:b11,dpdown:b14,dpright:b12,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux, -030000006d04000016c2000010010000,Logitech Logitech Dual Action,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3, -03000000260900008888000000010000,GameCube {WiseGroup USB box},a:b0,b:b2,y:b3,x:b1,start:b7,leftshoulder:,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,rightstick:,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,platform:Linux, -030000006d04000011c2000010010000,Logitech WingMan Cordless RumblePad,a:b0,b:b1,y:b4,x:b3,start:b8,guide:b5,back:b2,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b9,righttrigger:b10,platform:Linux, -030000006d04000018c2000010010000,Logitech Logitech RumblePad 2 USB,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3, -05000000d6200000ad0d000001000000,Moga Pro,platform:Linux,a:b0,b:b1,y:b3,x:b2,start:b6,leftstick:b7,rightstick:b8,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4, -030000004f04000009d0000000010000,Thrustmaster Run N Drive Wireless PS3,platform:Linux,a:b1,b:b2,x:b0,y:b3,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7, -030000004f04000008d0000000010000,Thrustmaster Run N Drive Wireless,platform:Linux,a:b1,b:b2,x:b0,y:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:b6,righttrigger:b7, -0300000000f000000300000000010000,RetroUSB.com RetroPad,a:b1,b:b5,x:b0,y:b4,back:b2,start:b3,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Linux, -0300000000f00000f100000000010000,RetroUSB.com Super RetroPort,a:b1,b:b5,x:b0,y:b4,back:b2,start:b3,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1,platform:Linux, -030000006f0e00001f01000000010000,Generic X-Box pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4, -03000000280400000140000000010000,Gravis GamePad Pro USB ,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftx:a0,lefty:a1, -030000005e0400008902000021010000,Microsoft X-Box pad v2 (US),platform:Linux,x:b3,a:b0,b:b1,y:b4,back:b6,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:a2,rightshoulder:b2,righttrigger:a5,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a3,righty:a4, -030000005e0400008502000000010000,Microsoft X-Box pad (Japan),platform:Linux,x:b3,a:b0,b:b1,y:b4,back:b6,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:a2,rightshoulder:b2,righttrigger:a5,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a3,righty:a4, -030000006f0e00001e01000011010000,Rock Candy Gamepad for PS3,platform:Linux,a:b1,b:b2,x:b0,y:b3,back:b8,start:b9,guide:b12,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2, -03000000250900000500000000010000,Sony PS2 pad with SmartJoy adapter,platform:Linux,a:b2,b:b1,y:b0,x:b3,start:b8,back:b9,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b4,righttrigger:b5, -030000008916000000fd000024010000,Razer Onza Tournament,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:b13,dpleft:b11,dpdown:b14,dpright:b12,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux, -030000004f04000000b3000010010000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,y:b3,x:b1,start:b10,guide:b8,back:b9,leftstick:b11,rightstick:b12,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7,platform:Linux, -03000000ad1b000001f5000033050000,Hori Pad EX Turbo 2,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux, -060000004c0500006802000000010000,PS3 Controller (Bluetooth),a:b14,b:b13,y:b12,x:b15,start:b3,guide:b16,back:b0,leftstick:b1,rightstick:b2,leftshoulder:b10,rightshoulder:b11,dpup:b4,dpleft:b7,dpdown:b6,dpright:b5,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b8,righttrigger:b9,platform:Linux, -050000004c0500006802000000010000,PS3 Controller (Bluetooth),a:b14,b:b13,y:b12,x:b15,start:b3,guide:b16,back:b0,leftstick:b1,rightstick:b2,leftshoulder:b10,rightshoulder:b11,dpup:b4,dpleft:b7,dpdown:b6,dpright:b5,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b8,righttrigger:b9,platform:Linux, -03000000790000000600000010010000,DragonRise Inc. Generic USB Joystick ,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a3,rightx:a1,righty:a4, -03000000666600000488000000010000,Super Joy Box 5 Pro,platform:Linux,a:b2,b:b1,x:b3,y:b0,back:b9,start:b8,leftshoulder:b6,rightshoulder:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b4,righttrigger:b5,dpup:b12,dpleft:b15,dpdown:b14,dpright:b13, -05000000362800000100000002010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,platform:Linux,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2, -05000000362800000100000003010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,platform:Linux,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2, -030000008916000001fd000024010000,Razer Onza Classic Edition,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:b11,dpdown:b14,dpright:b12,dpup:b13,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4, -030000005e040000d102000001010000,Microsoft X-Box One pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4, -030000005e040000dd02000003020000,Microsoft X-Box One pad v2,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,platform:Linux, -03000000790000001100000010010000,RetroLink Saturn Classic Controller,platform:Linux,x:b3,a:b0,b:b1,y:b4,back:b5,guide:b2,start:b8,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1, -050000007e0500003003000001000000,Nintendo Wii U Pro Controller,platform:Linux,a:b0,b:b1,x:b3,y:b2,back:b8,start:b9,guide:b10,leftshoulder:b4,rightshoulder:b5,leftstick:b11,rightstick:b12,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,dpup:b13,dpleft:b15,dpdown:b14,dpright:b16, -030000005e0400008e02000004010000,Microsoft X-Box 360 pad,platform:Linux,a:b0,b:b1,x:b2,y:b3,back:b6,start:b7,guide:b8,leftshoulder:b4,rightshoulder:b5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2, -030000000d0f00002200000011010000,HORI CO. LTD. REAL ARCADE Pro.V3,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1, -030000000d0f00001000000011010000,HORI CO. LTD. FIGHTING STICK 3,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7 -03000000f0250000c183000010010000,Goodbetterbest Ltd USB Controller,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3, -0000000058626f782047616d65706100,Xbox Gamepad (userspace driver),platform:Linux,a:b0,b:b1,x:b2,y:b3,start:b7,back:b6,guide:b8,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,lefttrigger:a5,righttrigger:a4,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a2,righty:a3, -03000000ff1100003133000010010000,PC Game Controller,a:b2,b:b1,y:b0,x:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Linux, -030000005e0400008e02000020200000,SpeedLink XEOX Pro Analog Gamepad pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4, -030000006f0e00001304000000010000,Generic X-Box pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:a0,rightstick:a3,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4, -03000000a306000018f5000010010000,Saitek PLC Saitek P3200 Rumble Pad,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a3,righty:a4, -03000000830500006020000010010000,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,x:b3,y:b2,back:b6,start:b7,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Linux, -03000000bd12000015d0000010010000,Tomee SNES USB Controller,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Linux, -03000000790000001100000010010000,Retrolink Classic Controller,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,platform:Linux, -03000000c9110000f055000011010000,HJC Game GAMEPAD,leftx:a0,lefty:a1,dpdown:h0.4,rightstick:b11,rightshoulder:b5,rightx:a2,start:b9,righty:a3,dpleft:h0.8,lefttrigger:b6,x:b2,dpup:h0.1,back:b8,leftstick:b10,leftshoulder:b4,y:b3,a:b0,dpright:h0.2,righttrigger:b7,b:b1,platform:Linux, -03000000a30600000c04000011010000,Saitek P2900 Wireless Pad,a:b1,b:b2,y:b3,x:b0,start:b12,guide:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5,platform:Linux, -03000000341a000005f7000010010000,GameCube {HuiJia USB box},a:b1,b:b2,y:b3,x:b0,start:b9,guide:,back:,leftstick:,rightstick:,leftshoulder:,dpleft:b15,dpdown:b14,dpright:b13,leftx:a0,lefty:a1,rightx:a5,righty:a2,lefttrigger:a3,righttrigger:a4,rightshoulder:b7,dpup:b12,platform:Linux, -030000006e0500000320000010010000,JC-U3613M - DirectInput Mode,platform:Linux,x:b0,a:b2,b:b3,y:b1,back:b10,guide:b12,start:b11,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3, -030000006f0e00004601000001010000,Rock Candy Wired Controller for Xbox One,platform:Linux,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,guide:b8,leftstick:b9,rightstick:b10,lefttrigger:a2,righttrigger:a5,leftx:a0,lefty:a1,rightx:a3,righty:a4, -03000000380700001647000010040000,Mad Catz Wired Xbox 360 Controller,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4, -030000006f0e00003901000020060000,Afterglow Wired Controller for Xbox One,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,platform:Linux, -030000004f04000015b3000010010000,Thrustmaster Dual Analog 4,platform:Linux,a:b0,b:b2,x:b1,y:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b5,righttrigger:b7, -05000000102800000900000000010000,8Bitdo SFC30 GamePad,platform:Linux,x:b4,a:b1,b:b0,y:b3,back:b10,start:b11,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1, -03000000d81400000862000011010000,HitBox (PS3/PC) Analog Mode,platform:Linux,a:b1,b:b2,y:b3,x:b0,start:b12,guide:b9,back:b8,leftshoulder:b4,rightshoulder:b5,lefttrigger:b6,righttrigger:b7,leftx:a0,lefty:a1, -030000000d0f00000d00000000010000,hori,platform:Linux,a:b0,b:b6,y:b2,x:b1,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,start:b9,guide:b10,back:b8,leftshoulder:b3,rightshoulder:b7,leftx:b4,lefty:b5, -03000000ad1b000016f0000090040000,Mad Catz Xbox 360 Controller,platform:Linux,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5, -03000000d814000007cd000011010000,Toodles 2008 Chimp PC/PS3,platform:Linux,a:b0,b:b1,y:b2,x:b3,start:b9,back:b8,leftshoulder:b4,rightshoulder:b5,leftx:a0,lefty:a1,lefttrigger:b6,righttrigger:b7, -03000000fd0500000030000000010000,InterAct GoPad I-73000 (Fighting Game Layout),platform:Linux,a:b3,b:b4,y:b1,x:b0,start:b7,back:b6,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5, -05000000010000000100000003000000,Nintendo Wiimote,platform:Linux,a:b0,b:b1,y:b3,x:b2,start:b9,guide:b10,back:b8,leftstick:b11,rightstick:b12,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7, -030000005e0400008e02000062230000,Microsoft X-Box 360 pad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4, -03000000a30600000901000000010000,Saitek P880,a:b2,b:b3,y:b1,x:b0,leftstick:b8,rightstick:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b6,righttrigger:b7,platform:Linux, -030000006f0e00000103000000020000,Logic3 Controller,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.0,dpdown:h0.4,dpright:h0.0,dpright:h0.2,dpup:h0.0,dpup:h0.1,leftshoulder:h0.0,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4, -05000000380700006652000025010000,Mad Catz C.T.R.L.R ,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,guide:b12,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3, -030000005e0400008e02000073050000,Speedlink TORID Wireless Gamepad,platform:Linux,x:b2,a:b0,b:b1,y:b3,back:b6,guide:b8,start:b7,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4, -03000000ad1b00002ef0000090040000,Mad Catz Fightpad SFxT,platform:Linux,a:b0,b:b1,y:b3,x:b2,start:b7,guide:b8,back:b6,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,lefttrigger:a2,righttrigger:a5, -05000000a00500003232000001000000,8Bitdo Zero GamePad,platform:Linux,a:b0,b:b1,x:b3,y:b4,back:b10,start:b11,leftshoulder:b6,rightshoulder:b7,leftx:a0,lefty:a1, -030000001008000001e5000010010000,NEXT Classic USB Game Controller,a:b0,b:b1,back:b8,start:b9,rightx:a2,righty:a3,leftx:a0,lefty:a1,platform:Linux, -03000000100800000300000010010000,USB Gamepad,platform:Linux,a:b2,b:b1,x:b3,y:b0,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5, -05000000ac0500003232000001000000,VR-BOX,platform:Linux,a:b0,b:b1,x:b2,y:b3,start:b9,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a2,lefttrigger:b4,righttrigger:b5, -03000000780000000600000010010000,Microntek USB Joystick,platform:Linux,x:b3,a:b2,b:b1,y:b0,back:b8,start:b9,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,leftx:a0,lefty:a1, +030000004c0500006802000011810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000005f1400003102000010010000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000006f0e00001402000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000008f0e00000300000010010000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +050000004c0500006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +050000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:a12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:a13,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +050000004c0500006802000000800000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c0500006802000000810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +05000000504c415953544154494f4e00,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +060000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +030000004c050000a00b000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000004c050000a00b000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000004c050000c405000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000004c050000c405000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000004c050000cc09000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000004c050000cc09000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +03000000c01100000140000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +050000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +050000004c050000c405000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c050000c405000001800000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +050000004c050000cc09000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c050000cc09000001800000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000004c050000e60c000011010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +030000004c050000e60c000011810000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000004c050000f20d000011010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +050000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +050000004c050000e60c000000810000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c050000f20d000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +03000000300f00001211000011010000,Qanba Arcade Joystick,a:b2,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b9,x:b1,y:b3,platform:Linux, +03000000222c00000225000011010000,Qanba Dragon Arcade Joystick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000222c00000025000011010000,Qanba Dragon Arcade Joystick (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000222c00000020000011010000,Qanba Drone Arcade PS4 Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,rightshoulder:b5,righttrigger:a4,start:b9,x:b0,y:b3,platform:Linux, +03000000300f00001210000010010000,Qanba Joystick Plus,a:b0,b:b1,back:b8,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b6,start:b9,x:b2,y:b3,platform:Linux, +03000000222c00000223000011010000,Qanba Obsidian Arcade Joystick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000222c00000023000011010000,Qanba Obsidian Arcade Joystick (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000009b2800000300000001010000,Raphnet 4nes4snes,a:b0,b:b4,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Linux, +030000009b2800004200000001010000,Raphnet Dual NES Adapter,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Linux, +030000009b2800003200000001010000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux, +030000009b2800006000000001010000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux, +030000008916000001fd000024010000,Razer Onza Classic Edition,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000321500000204000011010000,Razer Panthera PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000321500000104000011010000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000321500000810000011010000,Razer Panthera PS4 Evo Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000321500000010000011010000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000321500000507000000010000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000321500000a10000001000000,Razer Raiju Tournament Edition,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000321500000011000011010000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000008916000000fe000024010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c6240000045d000024010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c6240000045d000025010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000321500000009000011010000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +050000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +0300000032150000030a000001010000,Razer Wildcat,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000790000001100000010010000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Linux, +190000004b4800000111000000010000,RetroGame Joypad,a:b1,b:b0,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +0300000081170000990a000001010000,Retronic Adapter,a:b0,leftx:a0,lefty:a1,platform:Linux, +0300000000f000000300000000010000,RetroPad,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux, +00000000526574726f53746f6e653200,RetroStone 2 Controller,a:b1,b:b0,back:b10,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,righttrigger:b9,start:b11,x:b4,y:b3,platform:Linux, +03000000341200000400000000010000,RetroUSB N64 RetroPort,+rightx:b8,+righty:b10,-rightx:b9,-righty:b11,a:b7,b:b6,dpdown:b2,dpleft:b1,dpright:b0,dpup:b3,leftshoulder:b13,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b12,start:b4,platform:Linux, +030000006b140000010d000011010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000006b140000130d000011010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e00001f01000000010000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00001e01000011010000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e00008701000011010000,Rock Candy Switch Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000c6240000fefa000000010000,Rock Candy Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00004601000001010000,Rock Candy Xbox One Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000a306000023f6000011010000,Saitek Cyborg V1 PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux, +03000000a30600001005000000010000,Saitek P150,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b2,righttrigger:b5,x:b3,y:b4,platform:Linux, +03000000a30600000701000000010000,Saitek P220,a:b2,b:b3,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,x:b0,y:b1,platform:Linux, +03000000a30600000cff000010010000,Saitek P2500 Force Rumble,a:b2,b:b3,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b0,y:b1,platform:Linux, +03000000a30600000c04000011010000,Saitek P2900,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b12,x:b0,y:b3,platform:Linux, +03000000a306000018f5000010010000,Saitek P3200 Rumble,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux, +03000000300f00001201000010010000,Saitek P380,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, +03000000a30600000901000000010000,Saitek P880,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,x:b0,y:b1,platform:Linux, +03000000a30600000b04000000010000,Saitek P990 Dual Analog,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b8,x:b0,y:b3,platform:Linux, +03000000a306000020f6000011010000,Saitek PS2700 Rumble,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux, +05000000e804000000a000001b010000,Samsung EIGP20,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000d81d00000e00000010010000,Savior,a:b0,b:b1,back:b8,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,start:b9,x:b4,y:b5,platform:Linux, +03000000a30c00002500000011010000,Sega Genesis Mini 3B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Linux, +03000000790000001100000011010000,Sega Saturn,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b4,start:b9,x:b0,y:b3,platform:Linux, +03000000790000002201000011010000,Sega Saturn,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux, +03000000b40400000a01000000010000,Sega Saturn,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Linux, +030000001f08000001e4000010010000,SFC Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Linux, +03000000632500002305000010010000,ShanWan Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000f025000021c1000010010000,Shanwan Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000632500007505000010010000,Shanwan PS3 PC,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000bc2000000055000010010000,Shanwan PS3 PC ,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000341a00000908000010010000,SL6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +050000004c050000cc09000001000000,Sony DualShock 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000ff000000cb01000010010000,Sony PlayStation Portable,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux, +03000000250900000500000000010000,Sony PS2 pad with SmartJoy Adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux, +030000005e0400008e02000073050000,Speedlink Torid,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000020200000,SpeedLink Xeox Pro Analog,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d11800000094000011010000,Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +05000000d11800000094000000010000,Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000de2800000112000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000de2800000112000011010000,Steam Controller,a:b2,b:b3,back:b10,dpdown:+a5,dpleft:-a4,dpright:+a4,dpup:-a5,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,paddle1:b15,paddle2:b16,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a3,start:b11,x:b4,y:b5,platform:Linux, +03000000de2800000211000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000de2800000211000011010000,Steam Controller,a:b2,b:b3,back:b10,dpdown:b18,dpleft:b19,dpright:b20,dpup:b17,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b16,paddle2:b15,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b5,platform:Linux, +03000000de2800004211000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000de2800004211000011010000,Steam Controller,a:b2,b:b3,back:b10,dpdown:b18,dpleft:b19,dpright:b20,dpup:b17,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,paddle1:b16,paddle2:b15,rightshoulder:b7,righttrigger:a6,rightx:a2,righty:a3,start:b11,x:b4,y:b5,platform:Linux, +03000000de280000fc11000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +05000000de2800000212000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000de2800000512000010010000,Steam Deck,a:b3,b:b4,back:b11,dpdown:b17,dpleft:b18,dpright:b19,dpup:b16,guide:b13,leftshoulder:b7,leftstick:b14,lefttrigger:a9,leftx:a0,lefty:a1,rightshoulder:b8,rightstick:b15,righttrigger:a8,rightx:a2,righty:a3,start:b12,x:b5,y:b6,platform:Linux, +03000000de280000ff11000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000004e696d6275732b0000000000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b10,guide:b11,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b12,x:b2,y:b3,platform:Linux, +03000000381000003014000075010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000381000003114000075010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +0500000011010000311400001b010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b32,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000110100001914000009010000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000ad1b000038f0000090040000,Street Fighter IV Fightstick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000003b07000004a1000000010000,Suncom SFX Plus,a:b0,b:b2,back:b7,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b9,righttrigger:b5,start:b8,x:b1,y:b3,platform:Linux, +03000000666600000488000000010000,Super Joy Box 5 Pro,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux, +0300000000f00000f100000000010000,Super RetroPort,a:b1,b:b5,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux, +030000008f0e00000d31000010010000,SZMY Power 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000457500000401000011010000,SZMY Power DS4 Wired Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000457500002211000010010000,SZMY Power Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000008f0e00001431000010010000,SZMY Power PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000ba2200000701000001010000,Technology Innovation PS2 Adapter,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b2,platform:Linux, +03000000790000001c18000011010000,TGZ Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000591c00002400000010010000,THEC64 Joystick,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux, +03000000591c00002600000010010000,THEGamepad,a:b2,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Linux, +030000004f04000015b3000001010000,Thrustmaster Dual Analog 3.2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, +030000004f04000015b3000010010000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, +030000004f04000020b3000010010000,Thrustmaster Dual Trigger,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, +030000004f04000023b3000000010000,Thrustmaster Dual Trigger PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000004f0400000ed0000011010000,Thrustmaster eSwap Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000b50700000399000000010000,Thrustmaster Firestorm Digital 2,a:b2,b:b4,back:b11,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,rightstick:b0,righttrigger:b9,start:b1,x:b3,y:b5,platform:Linux, +030000004f04000003b3000010010000,Thrustmaster Firestorm Dual Analog 2,a:b0,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b9,rightx:a2,righty:a3,x:b1,y:b3,platform:Linux, +030000004f04000000b3000010010000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Linux, +030000004f04000004b3000010010000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, +030000004f04000026b3000002040000,Thrustmaster GP XID,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c6240000025b000002020000,Thrustmaster GPX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000004f04000008d0000000010000,Thrustmaster Run N Drive PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000004f04000009d0000000010000,Thrustmaster Run N Drive PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000004f04000007d0000000010000,Thrustmaster T Mini,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000004f04000012b3000010010000,Thrustmaster Vibrating Gamepad,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, +03000000571d00002000000010010000,Tomee SNES Adapter,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux, +03000000bd12000015d0000010010000,Tomee SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Linux, +03000000d814000007cd000011010000,Toodles 2008 Chimp PC PS3,a:b0,b:b1,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b2,platform:Linux, +030000005e0400008e02000070050000,Torid,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c01100000591000011010000,Torid,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000680a00000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux, +03000000780300000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux, +03000000e00d00000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux, +03000000f00600000300000003000000,TRBot Virtual Joypad,a:b11,b:b12,back:b15,dpdown:b6,dpleft:b3,dpright:b4,dpup:b5,leftshoulder:b17,leftstick:b21,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b22,righttrigger:a2,rightx:a3,righty:a4,start:b16,x:b13,y:b14,platform:Linux, +030000005f140000c501000010010000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +06000000f51000000870000003010000,Turtle Beach Recon,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000100800000100000010010000,Twin PS2 Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +03000000151900005678000010010000,Uniplay U6,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000100800000300000010010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +03000000790000000600000007010000,USB gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Linux, +03000000790000001100000000010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:a0,dpleft:a1,dpright:a2,dpup:a4,start:b9,platform:Linux, +030000006f0e00000302000011010000,Victrix Pro Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e00000702000011010000,Victrix Pro Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +05000000ac0500003232000001000000,VR Box Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +05000000434f4d4d414e440000000000,VX Gaming Command Series,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +0000000058626f782033363020576900,Xbox 360 Controller,a:b0,b:b1,back:b14,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b7,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux, +030000005e0400001907000000010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000010010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000014010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400009102000007010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000a102000000010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000a102000007010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000000010000,Xbox 360 EasySMX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000a102000014010000,Xbox 360 Receiver,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400000202000000010000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, +030000006f0e00001304000000010000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000ffff0000ffff000000010000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, +0000000058626f782047616d65706100,Xbox Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400000a0b000005040000,Xbox One Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, +030000005e040000d102000002010000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000ea02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000ea02000001030000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000e002000003090000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000fd02000003090000,Xbox One Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000fd02000030110000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000e302000002090000,Xbox One Elite,a:b0,b:b1,back:b136,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000220b000013050000,Xbox One Elite 2 Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000050b000002090000,Xbox One Elite Series 2,a:b0,b:b1,back:b136,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +060000005e040000ea0200000b050000,Xbox One S Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +060000005e040000ea0200000d050000,Xbox One S Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000120b000001050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000120b000005050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000120b000007050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000120b000009050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000120b00000d050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000120b00000f050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000130b000001050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000130b000007050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000130b000009050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000130b000011050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000130b000013050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000130b000015050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +060000005e040000120b000007050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +060000005e040000120b00000b050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +060000005e040000120b00000f050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000200b000013050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000450c00002043000010010000,XEOX SL6556 BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +05000000172700004431000029010000,XiaoMi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Linux, +03000000c0160000e105000001010000,XinMo Dual Arcade,a:b4,b:b3,back:b6,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b9,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b1,y:b0,platform:Linux, +xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000120c0000100e000011010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000120c0000101e000011010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, + +# Android +38653964633230666463343334313533,8BitDo Adapter,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +36666264316630653965636634386234,8BitDo Adapter 2,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38426974446f20417263616465205374,8BitDo Arcade Stick,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b5,leftshoulder:b9,lefttrigger:a4,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +61393962646434393836356631636132,8BitDo Arcade Stick,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, +64323139346131306233636562663738,8BitDo Arcade Stick,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, +64643565386136613265663236636564,8BitDo Arcade Stick,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, +33313433353539306634656436353432,8BitDo Dogbone,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38426974446f20446f67626f6e65204d,8BitDo Dogbone,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android, +34343439373236623466343934376233,8BitDo FC30 Pro,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b28,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b29,righttrigger:b7,start:b5,x:b30,y:b2,platform:Android, +38426974446f2038426974446f204c69,8BitDo Lite,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +30643332373663313263316637356631,8BitDo Lite 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974446f204c6974652032000000,8BitDo Lite 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +62656331626461363634633735353032,8BitDo Lite 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38393936616436383062666232653338,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974446f204c6974652053450000,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +39356430616562366466646636643435,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000006500000ffff3f00,8BitDo M30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b17,leftshoulder:b9,lefttrigger:a5,rightshoulder:b10,righttrigger:a4,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000051060000ffff3f00,8BitDo M30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b17,leftshoulder:b9,lefttrigger:a4,rightshoulder:b10,righttrigger:a5,start:b6,x:b3,y:b2,platform:Android, +32323161363037623637326438643634,8BitDo M30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +33656266353630643966653238646264,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,start:b10,x:b19,y:b2,platform:Android, +38426974446f204d3330204d6f646b69,8BitDo M30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +39366630663062373237616566353437,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,start:b6,x:b2,y:b3,platform:Android, +64653533313537373934323436343563,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,start:b6,x:b2,y:b3,platform:Android, +66356438346136366337386437653934,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,start:b18,x:b19,y:b2,platform:Android, +66393064393162303732356665666366,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,start:b6,x:b2,y:b3,platform:Android, +33663431326134333366393233616633,8BitDo N30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android, +38426974446f204e3330204d6f646b69,8BitDo N30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android, +05000000c82d000015900000ffff3f00,8BitDo N30 Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000065280000ffff3f00,8BitDo N30 Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b17,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38323035343766666239373834336637,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,platform:Android, +38426974446f204e3634204d6f646b69,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,platform:Android, +050000000220000000900000ffff3f00,8BitDo NES30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +050000002038000009000000ffff3f00,8BitDo NES30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38313433643131656262306631373166,8BitDo P30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38326536643339353865323063616339,8BitDo P30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38426974446f2050333020636c617373,8BitDo P30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +35376664343164386333616535333434,8BitDo Pro 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,start:b10,x:b19,y:b2,platform:Android, +38426974446f2038426974446f205072,8BitDo Pro 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974446f2050726f203200000000,8BitDo Pro 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +62373739366537363166326238653463,8BitDo Pro 2,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b3,y:b2,platform:Android, +38386464613034326435626130396565,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974446f2038426974446f205265,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +66303230343038613365623964393766,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974446f20533330204d6f646b69,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +66316462353561376330346462316137,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +05000000c82d000000600000ffff3f00,8BitDo SF30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000000610000ffff3f00,8BitDo SF30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974646f20534633302050726f00,8BitDo SF30 Pro,a:b1,b:b0,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b17,platform:Android, +61623334636338643233383735326439,8BitDo SFC30,a:b0,b:b1,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b3,rightshoulder:b31,start:b5,x:b30,y:b2,platform:Android, +05000000c82d000012900000ffff3f00,8BitDo SN30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000062280000ffff3f00,8BitDo SN30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, +38316230613931613964356666353839,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974446f20534e3330204d6f646b,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +65323563303231646531383162646335,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +35383531346263653330306238353131,8BitDo SN30 PP,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +05000000c82d000001600000ffff3f00,8BitDo SN30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000002600000ffff0f00,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b17,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +36653638656632326235346264663661,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, +38303232393133383836366330346462,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, +38346630346135363335366265656666,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974446f20534e33302050726f2b,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +536f6e7920436f6d707574657220456e,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +66306331643531333230306437353936,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +050000002028000009000000ffff3f00,8BitDo SNES30,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +050000003512000020ab000000780f00,8BitDo SNES30,a:b21,b:b20,back:b30,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b26,rightshoulder:b27,start:b31,x:b24,y:b23,platform:Android, +33666663316164653937326237613331,8BitDo Zero,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, +38426974646f205a65726f2047616d65,8BitDo Zero,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, +05000000c82d000018900000ffff0f00,8BitDo Zero 2,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000030320000ffff0f00,8BitDo Zero 2,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, +33663434393362303033616630346337,8BitDo Zero 2,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, +34656330626361666438323266633963,8BitDo Zero 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android, +63396666386564393334393236386630,8BitDo Zero 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, +63633435623263373466343461646430,8BitDo Zero 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, +32333634613735616163326165323731,Amazon Luna Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android, +417374726f2063697479206d696e6920,Astro City Mini,a:b23,b:b22,back:b29,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b25,righttrigger:b26,start:b30,x:b24,y:b21,platform:Android, +35643263313264386134376362363435,Atari VCS Classic Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,start:b6,platform:Android, +32353831643566306563643065356239,Atari VCS Modern Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +32303165626138343962363666346165,Brook Mars PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +38383337343564366131323064613561,Brook Mars PS4 Controller,a:b1,b:b19,back:b17,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +34313430343161653665353737323365,Elecom JC-W01U,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android, +4875694a6961204a432d573031550000,Elecom JC-W01U,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android, +30363230653635633863366338623265,Evo VR,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,x:b2,y:b3,platform:Android, +05000000b404000011240000dfff3f00,Flydigi Vader 2,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +05000000bc20000000550000ffff3f00,GameSir G3w,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +34323662653333636330306631326233,Google Nexus,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +35383633353935396534393230616564,Google Stadia Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +05000000d6020000e5890000dfff3f00,GPD XD Plus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android, +05000000d6020000e5890000dfff3f80,GPD XD Plus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a3,rightx:a4,righty:a5,start:b6,x:b2,y:b3,platform:Android, +66633030656131663837396562323935,Hori Battle,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, +35623466343433653739346434636330,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +484f524920434f2e2c4c54442e203130,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b20,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b9,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +484f524920434f2e2c4c544420205041,Hori Gem Pad 3,a:b1,b:b17,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b0,y:b2,platform:Android, +65656436646661313232656661616130,Hori PC Engine Mini Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b18,platform:Android, +31303433326562636431653534636633,Hori Real Arcade Pro 3,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +32656664353964393561366362333636,Hori Switch Split Pad Pro,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, +30306539356238653637313730656134,HORIPAD Switch Pro Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, +48797065726b696e2050616400000000,Hyperkin Admiral N64 Controller,+rightx:b6,+righty:b7,-rightx:b17,-righty:b5,a:b1,b:b0,leftshoulder:b3,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,platform:Android, +62333331353131353034386136626636,Hyperkin Admiral N64 Controller,+rightx:b6,+righty:b7,-rightx:b17,-righty:b5,a:b1,b:b0,leftshoulder:b3,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,platform:Android, +31306635363562663834633739396333,Hyperkin N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android, +5368616e57616e202020202048797065,Hyperkin N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android, +0500000083050000602000000ffe0000,iBuffalo SNES Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b15,rightshoulder:b16,start:b10,x:b2,y:b3,platform:Android, +5553422c322d6178697320382d627574,iBuffalo Super Famicom Controller,a:b1,b:b0,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,rightshoulder:b18,start:b10,x:b3,y:b2,platform:Android, +64306137363261396266353433303531,InterAct GoPad,a:b24,b:b25,leftshoulder:b23,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,x:b21,y:b22,platform:Android, +532e542e442e20496e74657261637420,InterAct HammerHead FX,a:b23,b:b24,back:b30,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,leftstick:b22,lefttrigger:b28,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b25,righttrigger:b29,rightx:a2,righty:a3,start:b31,x:b20,y:b21,platform:Android, +65346535636333663931613264643164,Joy-Con,a:b21,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b23,y:b24,platform:Android, +33346566643039343630376565326335,Joy-Con (L),a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android, +35313531613435623366313835326238,Joy-Con (L),a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android, +4a6f792d436f6e20284c290000000000,Joy-Con (L),a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android, +38383665633039363066383334653465,Joy-Con (R),a:b0,b:b1,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, +39363561613936303237333537383931,Joy-Con (R),a:b0,b:b1,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, +4a6f792d436f6e202852290000000000,Joy-Con (R),a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, +39656136363638323036303865326464,JYS Aapter,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +63316564383539663166353034616434,JYS Adapter,a:b1,b:b3,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b0,y:b2,platform:Android, +64623163333561643339623235373232,Logitech F310,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +35623364393661626231343866613337,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +4c6f6769746563682047616d65706164,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +64396331333230326333313330336533,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +39653365373864633935383236363438,Logitech G Cloud,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +416d617a6f6e2047616d6520436f6e74,Luna Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, +4c756e612047616d6570616400000000,Luna Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +30363066623539323534363639323363,Magic NS,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +31353762393935386662336365626334,Magic NS,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +39623565346366623931666633323530,Magic NS,a:b1,b:b3,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b0,y:b2,platform:Android, +6d6179666c617368206c696d69746564,Mayflash GameCube Adapter,a:b22,b:b21,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a5,righty:a2,start:b30,x:b23,y:b24,platform:Android, +436f6e74726f6c6c6572000000000000,Mayflash N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android, +65666330633838383061313633326461,Mayflash N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android, +37316565396364386635383230353365,Mayflash Saturn Adapter,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android, +4875694a696120205553422047616d65,Mayflash Saturn Adapter,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android, +535a4d792d706f776572204c54442043,Mayflash Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b31,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android, +30653962643666303631376438373532,Mayflash Wii DolphinBar,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b0,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android, +39346131396233376535393665363161,Mayflash Wii U Pro Adapter,a:b22,b:b23,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,leftstick:b31,lefttrigger:b27,rightshoulder:b26,rightstick:b0,righttrigger:b28,rightx:a0,righty:a1,start:b30,x:b21,y:b24,platform:Android, +31323564663862633234646330373138,Mega Drive,a:b23,b:b22,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b25,righttrigger:b26,start:b30,x:b24,y:b21,platform:Android, +37333564393261653735306132613061,Mega Drive,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android, +64363363336633363736393038313464,Mega Drive,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b2,y:b3,platform:Android, +33323763323132376537376266393366,Microsoft Dual Strike,a:b24,b:b23,back:b25,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b29,rightshoulder:b78,rightx:a0,righty:a1~,start:b26,x:b22,y:b21,platform:Android, +30306461613834333439303734316539,Microsoft SideWinder Pro,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b20,lefttrigger:b9,rightshoulder:b19,righttrigger:b10,start:b17,x:b2,y:b3,platform:Android, +32386235353630393033393135613831,Microsoft Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +4d4f435554452d303533582d4d35312d,Mocute 053X,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +33343361376163623438613466616531,Mocute M053,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +39306635663061636563316166303966,Mocute M053,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +7573622067616d657061642020202020,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Android, +050000007e05000009200000ffff0f00,Nintendo Switch Pro Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b17,y:b2,platform:Android, +34323437396534643531326161633738,Nintendo Switch Pro Controller,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,misc1:b5,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +50726f20436f6e74726f6c6c65720000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b2,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b10,rightx:a2,righty:a3,start:b18,y:b3,platform:Android, +36326533353166323965623661303933,NSO N64 Controller,+rightx:b17,+righty:b10,-rightx:b2,-righty:b19,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,righttrigger:b15,start:b18,platform:Android, +4e363420436f6e74726f6c6c65720000,NSO N64 Controller,+rightx:b17,+righty:b10,-rightx:b2,-righty:b19,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,righttrigger:b15,start:b18,platform:Android, +534e455320436f6e74726f6c6c657200,NSO SNES Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, +64623863346133633561626136366634,NSO SNES Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, +050000005509000003720000cf7f3f00,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005509000010720000ffff3f00,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005509000014720000df7f3f00,NVIDIA Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android, +050000005509000014720000df7f3f80,NVIDIA Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a3,rightx:a4,righty:a5,start:b6,x:b2,y:b3,platform:Android, +37336435666338653565313731303834,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +4e564944494120436f72706f72617469,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +61363931656135336130663561616264,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +39383335313438623439373538343266,OUYA Controller,a:b0,b:b2,dpdown:b18,dpleft:b15,dpright:b16,dpup:b17,leftshoulder:b3,leftstick:b9,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,x:b1,y:b19,platform:Android, +4f5559412047616d6520436f6e74726f,OUYA Controller,a:b0,b:b2,dpdown:b18,dpleft:b15,dpright:b6,dpup:b17,leftshoulder:b3,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b19,platform:Android, +506572666f726d616e63652044657369,PDP PS3 Rock Candy Controller,a:b1,b:b17,back:h0.2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b0,y:b2,platform:Android, +62653335326261303663356263626339,PlayStation Classic Controller,a:b19,b:b1,back:b17,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,lefttrigger:b3,rightshoulder:b10,righttrigger:b20,start:b18,x:b2,y:b0,platform:Android, +536f6e7920496e746572616374697665,PlayStation Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,misc1:b8,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +576972656c65737320436f6e74726f6c,PlayStation Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +61653962353232366130326530363061,Pokken,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,rightshoulder:b20,righttrigger:b10,start:b18,x:b0,y:b2,platform:Android, +32666633663735353234363064386132,PS2,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a3,righty:a2,start:b30,x:b24,y:b21,platform:Android, +050000004c05000068020000dfff3f00,PS3 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +536f6e7920504c415953544154494f4e,PS3 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +61363034663839376638653463633865,PS3 Controller,a:b0,b:b1,back:b15,dpdown:a14,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +66366539656564653432353139356536,PS3 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +66383132326164626636313737373037,PS3 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000004c050000c405000000783f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000004c050000c4050000fffe3f00,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, +050000004c050000c4050000fffe3f80,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a3,rightx:a4,righty:a5,start:b16,x:b0,y:b2,platform:Android, +050000004c050000c4050000ffff3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000004c050000cc090000fffe3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000004c050000cc090000ffff3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +30303839663330346632363232623138,PS4 Controller,a:b1,b:b17,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, +31326235383662333266633463653332,PS4 Controller,a:b1,b:b16,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b17,x:b0,y:b2,platform:Android, +31373231336561636235613666323035,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +31663838336334393132303338353963,PS4 Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +34613139376634626133336530386430,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +35643031303033326130316330353564,PS4 Controller,a:b1,b:b17,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, +37626233336235343937333961353732,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +37626464343430636562316661643863,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38393161636261653636653532386639,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +63313733393535663339656564343962,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +63393662363836383439353064663939,PS4 Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +65366465656364636137653363376531,PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +66613532303965383534396638613230,PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, +050000004c050000e60c0000fffe3f00,PS5 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, +050000004c050000e60c0000fffe3f80,PS5 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a3,rightx:a4,righty:a5,start:b16,x:b0,y:b2,platform:Android, +050000004c050000e60c0000ffff3f00,PS5 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +32346465346533616263386539323932,PS5 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +32633532643734376632656664383733,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, +37363764353731323963323639666565,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, +61303162353165316365336436343139,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b8,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, +64336263393933626535303339616332,Qanba 4RAF,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b20,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b9,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, +36626666353861663864336130363137,Razer Junglecat,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +05000000f8270000bf0b0000ffff3f00,Razer Kishi,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +62653861643333663663383332396665,Razer Kishi,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000003215000005070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000003215000007070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000003215000000090000bf7f3f00,Razer Serval,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android, +5a6869587520526574726f2042697420,Retro Bit Saturn Controller,a:b21,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b26,rightshoulder:b27,righttrigger:b28,start:b30,x:b23,y:b24,platform:Android, +32417865732031314b6579732047616d,Retro Bit SNES Controller,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, +36313938306539326233393732613361,Retro Bit SNES Controller,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, +526574726f466c616720576972656420,Retro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,rightshoulder:b18,start:b10,x:b2,y:b3,platform:Android, +61343739353764363165343237303336,Retro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,lefttrigger:b18,leftx:a0,lefty:a1,start:b10,x:b2,y:b3,platform:Android, +38653130373365613538333235303036,Retroid Pocket 2,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +526574726f696420506f636b65742043,Retroid Pocket Flip,a:b1,b:b0,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +582d426f7820436f6e74726f6c6c6572,Retroid Pocket Flip,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +64363363336633363736393038313463,Retrolink,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b6,platform:Android, +37393234373533633333323633646531,RetroUSB N64 RetroPort,+rightx:b17,+righty:b15,-rightx:b18,-righty:b6,a:b10,b:b9,dpdown:b19,dpleft:b1,dpright:b0,dpup:b2,leftshoulder:b7,lefttrigger:b20,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Android, +5365616c6965436f6d707574696e6720,RetroUSB N64 RetroPort,+rightx:b17,+righty:b15,-rightx:b18,-righty:b6,a:b10,b:b9,dpdown:b19,dpleft:b1,dpright:b0,dpup:b2,leftshoulder:b7,lefttrigger:b20,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Android, +526574726f5553422e636f6d20534e45,RetroUSB SNES RetroPort,a:b1,b:b20,back:b19,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b2,x:b0,y:b3,platform:Android, +64643037633038386238303966376137,RetroUSB SNES RetroPort,a:b1,b:b20,back:b19,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b2,x:b0,y:b3,platform:Android, +37656564346533643138636436356230,Rock Candy Switch Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +33373336396634316434323337666361,RumblePad 2,a:b22,b:b23,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b24,platform:Android, +36363537303435333566386638366333,Samsung EIGP20,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +53616d73756e672047616d6520506164,Samsung EIGP20,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +66386565396238363534313863353065,Sanwa PlayOnline Mobile,a:b21,b:b22,back:b23,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b24,platform:Android, +32383165316333383766336338373261,Saturn,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android, +38613865396530353338373763623431,Saturn,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,lefttrigger:b10,rightshoulder:b20,righttrigger:b19,start:b17,x:b2,y:b3,platform:Android, +61316232336262373631343137633631,Saturn,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android, +30353835333338613130373363646337,SG H510,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, +66386262366536653765333235343634,SG H510,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android, +66633132393363353531373465633064,SG H510,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, +62653761636366393366613135366338,SN30 PP,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38376662666661636265313264613039,SNES,a:b0,b:b1,back:b9,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b3,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android, +5346432f555342205061640000000000,SNES Adapter,a:b0,b:b1,back:b9,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b3,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android, +5553422047616d657061642000000000,SNES Controller,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, +63303964303462366136616266653561,Sony PSP,a:b21,b:b22,back:b27,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b28,x:b23,y:b24,platform:Android, +63376637643462343766333462383235,Sony Vita,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a3,righty:a4,start:b18,x:b0,y:b2,platform:Android, +476f6f676c65204c4c43205374616469,Stadia Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +5374616469614e3848532d6532633400,Stadia Controller,a:b0,b:b1,back:b15,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android, +05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android, +0500000011010000201400000f7e0f00,SteelSeries Nimbus,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,x:b19,y:b2,platform:Android, +35306436396437373135383665646464,SteelSeries Nimbus Plus,a:b0,b:b1,leftshoulder:b3,leftstick:b17,lefttrigger:b9,leftx:a0,rightshoulder:b20,rightstick:b18,righttrigger:b10,rightx:a2,x:b19,y:b2,platform:Android, +54475a20436f6e74726f6c6c65720000,TGZ Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +62363434353532386238336663643836,TGZ Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +37323236633763666465316365313236,THEC64 Joystick,a:b21,b:b22,back:b27,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b27,x:b23,y:b24,platform:Android, +38346162326232346533316164363336,THEGamepad,a:b23,b:b22,back:b27,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b28,x:b24,y:b21,platform:Android, +050000004f0400000ed00000fffe3f00,ThrustMaster eSwap Pro Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +5477696e20555342204a6f7973746963,Twin Joystick,a:b22,b:b21,back:b28,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,leftstick:b30,lefttrigger:b24,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b31,righttrigger:b25,rightx:a3,righty:a2,start:b29,x:b23,y:b20,platform:Android, +30623739343039643830333266346439,Valve Steam Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,paddle1:b24,paddle2:b23,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +31643365666432386133346639383937,Valve Steam Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,paddle1:b24,paddle2:b23,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +30386438313564306161393537333663,Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android, +33333034646336346339646538643633,Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android, +050000005e0400008e02000000783f00,Xbox 360 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +30396232393162346330326334636566,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38313038323730383864666463383533,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +58626f782033363020576972656c6573,Xbox 360 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +65353331386662343338643939643636,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +65613532386633373963616462363038,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +47656e6572696320582d426f78207061,Xbox Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +4d6963726f736f667420582d426f7820,Xbox Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +64633436313965656664373634323364,Xbox Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e04000091020000ff073f00,Xbox One Controller,a:b0,b:b1,back:b4,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, +050000005e04000091020000ff073f80,Xbox One Controller,a:b0,b:b1,back:b4,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000e00200000ffe3f00,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b17,y:b2,platform:Android, +050000005e040000e00200000ffe3f80,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a2,righty:a3,start:b10,x:b17,y:b2,platform:Android, +050000005e040000e0020000ffff3f00,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b4,leftshoulder:b3,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b17,y:b2,platform:Android, +050000005e040000e0020000ffff3f80,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b4,leftshoulder:b3,leftstick:b8,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b7,righttrigger:a5,rightx:a2,righty:a3,start:b10,x:b17,y:b2,platform:Android, +050000005e040000fd020000ffff3f00,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +33356661323266333733373865656366,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +34356136633366613530316338376136,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,x:b17,y:b2,platform:Android, +35623965373264386238353433656138,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +36616131643361333337396261666433,Xbox One Controller,a:b0,b:b1,back:b15,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +58626f7820576972656c65737320436f,Xbox One Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000000b000000783f00,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, +050000005e040000000b000000783f80,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000050b0000ffff3f00,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a6,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000e002000000783f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000ea02000000783f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000fd020000ff7f3f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000120b000000783f00,Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, +050000005e040000120b000000783f80,Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000130b0000ffff3f00,Xbox Series Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +65633038363832353634653836396239,Xbox Series Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000001727000044310000ffff3f00,XiaoMi Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a6,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android, + +# iOS +05000000ac0500000100000000006d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS, +05000000ac050000010000004f066d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS, +05000000ac05000001000000cf076d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS, +05000000ac05000001000000df076d01,*,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +05000000ac05000001000000ff076d01,*,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, +05000000ac0500000200000000006d02,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b2,y:b3,platform:iOS, +05000000ac050000020000004f066d02,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b2,y:b3,platform:iOS, +050000008a35000003010000ff070000,Backbone One,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, +050000008a35000004010000ff070000,Backbone One,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, +4d466947616d65706164010000000000,MFi Extended Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:iOS, +4d466947616d65706164020000000000,MFi Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b6,x:b2,y:b3,platform:iOS, +050000007e050000062000000f060000,Nintendo Switch Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b2,leftshoulder:b4,rightshoulder:b5,x:b1,y:b3,platform:iOS, +050000007e050000062000004f060000,Nintendo Switch Joy-Con (L),+leftx:h0.1,+lefty:h0.2,-leftx:h0.4,-lefty:h0.8,dpdown:b2,dpleft:b0,dpright:b3,dpup:b1,leftshoulder:b4,misc1:b6,rightshoulder:b5,platform:iOS, +050000007e05000008200000df070000,Nintendo Switch Joy-Con (L/R),a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +050000007e0500000e200000df070000,Nintendo Switch Joy-Con (L/R),a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:iOS, +050000007e050000072000004f060000,Nintendo Switch Joy-Con (R),+rightx:h0.4,+righty:h0.8,-rightx:h0.1,-righty:h0.2,a:b1,b:b0,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b3,y:b2,platform:iOS, +050000007e05000009200000df870000,Nintendo Switch Pro Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b10,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:iOS, +050000007e05000009200000ff870000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, +050000004c050000cc090000df070000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +050000004c050000cc090000df870001,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +050000004c050000cc090000ff070000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, +050000004c050000cc090000ff870001,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,touchpad:b11,x:b2,y:b3,platform:iOS, +050000004c050000cc090000ff876d01,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, +050000004c050000e60c0000df870000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,touchpad:b10,x:b2,y:b3,platform:iOS, +050000004c050000e60c0000ff870000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,touchpad:b11,x:b2,y:b3,platform:iOS, +05000000ac0500000300000000006d03,Remote,a:b0,b:b2,leftx:a0,lefty:a1,platform:iOS, +05000000ac0500000300000043006d03,Remote,a:b0,b:b2,leftx:a0,lefty:a1,platform:iOS, +05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:iOS, +05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:iOS, +050000005e040000050b0000df070001,Xbox Elite Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b10,paddle2:b12,paddle3:b11,paddle4:b13,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +050000005e040000050b0000ff070001,Xbox Elite Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b13,paddle3:b12,paddle4:b14,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, +050000005e040000e0020000df070000,Xbox One Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +050000005e040000e0020000ff070000,Xbox One Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, +050000005e040000130b0000df870001,Xbox Series X Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b10,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +050000005e040000130b0000ff870001,Xbox Series X Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, \ No newline at end of file diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml new file mode 100644 index 0000000..99dc042 --- /dev/null +++ b/snap/snapcraft.yaml @@ -0,0 +1,15 @@ + +name: qgroundcontrol +version: '3.2+git' +summary: Cross-platform ground control station for drones +description: | + QGroundControl provides full flight control and configuration for ArduPilot or PX4 Pro powered vehicles. The goal for QGroundControl is improved ease of use for new users as well as high end feature support for experienced users. + + +grade: devel # must be 'stable' to release into candidate/stable channels +confinement: devmode # use 'strict' once you have the right plugs and slots + +parts: + my-part: + # See 'snapcraft plugins' + plugin: nil diff --git a/src/ADSB/ADSBVehicle.cc b/src/ADSB/ADSBVehicle.cc index 505c82b..2e2a67d 100644 --- a/src/ADSB/ADSBVehicle.cc +++ b/src/ADSB/ADSBVehicle.cc @@ -14,10 +14,9 @@ #include #include -ADSBVehicle::ADSBVehicle(const ADSBVehicleInfo_t & vehicleInfo, QObject* parent) +ADSBVehicle::ADSBVehicle(const VehicleInfo_t& vehicleInfo, QObject* parent) : QObject (parent) , _icaoAddress (vehicleInfo.icaoAddress) - , _coordinate (QGeoCoordinate(qQNaN(),qQNaN())) , _altitude (qQNaN()) , _heading (qQNaN()) , _alert (false) @@ -25,14 +24,12 @@ ADSBVehicle::ADSBVehicle(const ADSBVehicleInfo_t & vehicleInfo, QObject* parent) update(vehicleInfo); } -void ADSBVehicle::update(const ADSBVehicleInfo_t & vehicleInfo) +void ADSBVehicle::update(const VehicleInfo_t& vehicleInfo) { if (_icaoAddress != vehicleInfo.icaoAddress) { qCWarning(ADSBVehicleManagerLog) << "ICAO address mismatch expected:actual" << _icaoAddress << vehicleInfo.icaoAddress; return; } - qCDebug(ADSBVehicleManagerLog) << "Updating" << QStringLiteral("%1 Flags: %2").arg(vehicleInfo.icaoAddress, 0, 16).arg(vehicleInfo.availableFlags, 0, 2); - if (vehicleInfo.availableFlags & CallsignAvailable) { if (vehicleInfo.callsign != _callsign) { _callsign = vehicleInfo.callsign; diff --git a/src/ADSB/ADSBVehicle.h b/src/ADSB/ADSBVehicle.h index f443545..c84c4fa 100644 --- a/src/ADSB/ADSBVehicle.h +++ b/src/ADSB/ADSBVehicle.h @@ -36,9 +36,9 @@ public: double heading; bool alert; uint32_t availableFlags; - } ADSBVehicleInfo_t; + } VehicleInfo_t; - ADSBVehicle(const ADSBVehicleInfo_t & vehicleInfo, QObject* parent); + ADSBVehicle(const VehicleInfo_t& vehicleInfo, QObject* parent); Q_PROPERTY(int icaoAddress READ icaoAddress CONSTANT) Q_PROPERTY(QString callsign READ callsign NOTIFY callsignChanged) @@ -54,7 +54,7 @@ public: double heading (void) const { return _heading; } bool alert (void) const { return _alert; } - void update(const ADSBVehicleInfo_t & vehicleInfo); + void update(const VehicleInfo_t& vehicleInfo); /// check if the vehicle is expired and should be removed bool expired(); @@ -77,7 +77,8 @@ private: QElapsedTimer _lastUpdateTimer; static constexpr qint64 expirationTimeoutMs = 120000; ///< timeout with no update in ms after which the vehicle is removed. + ///< AirMap sends updates for each vehicle every second. }; -Q_DECLARE_METATYPE(ADSBVehicle::ADSBVehicleInfo_t) +Q_DECLARE_METATYPE(ADSBVehicle::VehicleInfo_t) diff --git a/src/ADSB/ADSBVehicleManager.cc b/src/ADSB/ADSBVehicleManager.cc index ef4ebf7..3d03f8f 100644 --- a/src/ADSB/ADSBVehicleManager.cc +++ b/src/ADSB/ADSBVehicleManager.cc @@ -23,6 +23,7 @@ ADSBVehicleManager::ADSBVehicleManager(QGCApplication* app, QGCToolbox* toolbox) void ADSBVehicleManager::setToolbox(QGCToolbox* toolbox) { QGCTool::setToolbox(toolbox); + connect(&_adsbVehicleCleanupTimer, &QTimer::timeout, this, &ADSBVehicleManager::_cleanupStaleVehicles); _adsbVehicleCleanupTimer.setSingleShot(false); _adsbVehicleCleanupTimer.start(1000); @@ -41,7 +42,7 @@ void ADSBVehicleManager::_cleanupStaleVehicles() for (int i=_adsbVehicles.count()-1; i>=0; i--) { ADSBVehicle* adsbVehicle = _adsbVehicles.value(i); if (adsbVehicle->expired()) { - qCDebug(ADSBVehicleManagerLog) << "Expired " << QStringLiteral("%1").arg(adsbVehicle->icaoAddress(), 0, 16); + qCDebug(ADSBVehicleManagerLog) << "Expired" << QStringLiteral("%1").arg(adsbVehicle->icaoAddress(), 0, 16); _adsbVehicles.removeAt(i); _adsbICAOMap.remove(adsbVehicle->icaoAddress()); adsbVehicle->deleteLater(); @@ -49,7 +50,7 @@ void ADSBVehicleManager::_cleanupStaleVehicles() } } -void ADSBVehicleManager::adsbVehicleUpdate(const ADSBVehicle::ADSBVehicleInfo_t vehicleInfo) +void ADSBVehicleManager::adsbVehicleUpdate(const ADSBVehicle::VehicleInfo_t vehicleInfo) { uint32_t icaoAddress = vehicleInfo.icaoAddress; @@ -60,7 +61,6 @@ void ADSBVehicleManager::adsbVehicleUpdate(const ADSBVehicle::ADSBVehicleInfo_t ADSBVehicle* adsbVehicle = new ADSBVehicle(vehicleInfo, this); _adsbICAOMap[icaoAddress] = adsbVehicle; _adsbVehicles.append(adsbVehicle); - qCDebug(ADSBVehicleManagerLog) << "Added " << QStringLiteral("%1").arg(adsbVehicle->icaoAddress(), 0, 16); } } } @@ -101,7 +101,9 @@ void ADSBTCPLink::run(void) void ADSBTCPLink::_hardwareConnect() { _socket = new QTcpSocket(); + QObject::connect(_socket, &QTcpSocket::readyRead, this, &ADSBTCPLink::_readBytes); + _socket->connectToHost(_hostAddress, static_cast(_port)); // Give the socket a second to connect to the other side otherwise error out @@ -119,110 +121,72 @@ void ADSBTCPLink::_hardwareConnect() void ADSBTCPLink::_readBytes(void) { if (_socket) { - while(_socket->canReadLine()) { - QByteArray bytes = _socket->readLine(); - _parseLine(QString::fromLocal8Bit(bytes)); - } + QByteArray bytes = _socket->readLine(); + _parseLine(QString::fromLocal8Bit(bytes)); } } -void ADSBTCPLink::_parseLine(const QString &line) +void ADSBTCPLink::_parseLine(const QString& line) { if (line.startsWith(QStringLiteral("MSG"))) { - bool icaoOk; - int msgType = line.at(4).digitValue(); - if (msgType == -1) { - qCDebug(ADSBVehicleManagerLog) << "ADSB Invalid message type " << line.at(4); - return; - } - // Skip unsupported mesg types to avoid parsing - if (msgType == 2 || msgType > 6) { - return; - } - qCDebug(ADSBVehicleManagerLog) << " ADSB SBS-1 " << line; - QStringList values = line.split(QChar(',')); - uint32_t icaoAddress = values[4].toUInt(&icaoOk, 16); + qCDebug(ADSBVehicleManagerLog) << "ADSB SBS-1" << line; - if (!icaoOk) { - return; - } + QStringList values = line.split(QStringLiteral(",")); - ADSBVehicle::ADSBVehicleInfo_t adsbInfo; - adsbInfo.icaoAddress = icaoAddress; + if (values[1] == QStringLiteral("3")) { + bool icaoOk, altOk, latOk, lonOk; - switch (msgType) { - case 1: - case 5: - case 6: - _parseAndEmitCallsign(adsbInfo, values); - break; - case 3: - _parseAndEmitLocation(adsbInfo, values); - break; - case 4: - _parseAndEmitHeading(adsbInfo, values); - break; + uint32_t icaoAddress = values[4].toUInt(&icaoOk, 16); + int modeCAltitude = values[11].toInt(&altOk); + double lat = values[14].toDouble(&latOk); + double lon = values[15].toDouble(&lonOk); + QString callsign = values[10]; + + if (!icaoOk || !altOk || !latOk || !lonOk) { + return; + } + if (lat == 0 && lon == 0) { + return; + } + + double altitude = modeCAltitude / 3.048; + QGeoCoordinate location(lat, lon); + + ADSBVehicle::VehicleInfo_t adsbInfo; + adsbInfo.icaoAddress = icaoAddress; + adsbInfo.callsign = callsign; + adsbInfo.location = location; + adsbInfo.altitude = altitude; + adsbInfo.availableFlags = ADSBVehicle::CallsignAvailable | ADSBVehicle::LocationAvailable | ADSBVehicle::AltitudeAvailable; + emit adsbVehicleUpdate(adsbInfo); + } else if (values[1] == QStringLiteral("4")) { + bool icaoOk, headingOk; + + uint32_t icaoAddress = values[4].toUInt(&icaoOk, 16); + double heading = values[13].toDouble(&headingOk); + + if (!icaoOk || !headingOk) { + return; + } + + ADSBVehicle::VehicleInfo_t adsbInfo; + adsbInfo.icaoAddress = icaoAddress; + adsbInfo.heading = heading; + adsbInfo.availableFlags = ADSBVehicle::HeadingAvailable; + emit adsbVehicleUpdate(adsbInfo); + } else if (values[1] == QStringLiteral("1")) { + bool icaoOk; + + uint32_t icaoAddress = values[4].toUInt(&icaoOk, 16); + if (!icaoOk) { + return; + } + + ADSBVehicle::VehicleInfo_t adsbInfo; + adsbInfo.icaoAddress = icaoAddress; + adsbInfo.callsign = values[10]; + adsbInfo.availableFlags = ADSBVehicle::CallsignAvailable; + emit adsbVehicleUpdate(adsbInfo); } } } - -void ADSBTCPLink::_parseAndEmitCallsign(ADSBVehicle::ADSBVehicleInfo_t &adsbInfo, QStringList values) -{ - QString callsign = values[10].trimmed(); - if (callsign.isEmpty()) { - return; - } - - adsbInfo.callsign = callsign; - adsbInfo.availableFlags = ADSBVehicle::CallsignAvailable; - emit adsbVehicleUpdate(adsbInfo); -} - -void ADSBTCPLink::_parseAndEmitLocation(ADSBVehicle::ADSBVehicleInfo_t &adsbInfo, QStringList values) -{ - bool altOk, latOk, lonOk; - int modeCAltitude; - - QString altitudeStr = values[11]; - // Altitude is either Barometric - based on pressure, in ft - // or HAE - as reported by GPS - based on WGS84 Ellipsoid, in ft - // If altitude ends with H, we have HAE - // There's a slight difference between Barometric alt and HAE, but it would require - // knowledge about Geoid shape in particular Lat, Lon. It's not worth complicating the code - if (altitudeStr.endsWith('H')) { - altitudeStr.chop(1); - } - modeCAltitude = altitudeStr.toInt(&altOk); - - double lat = values[14].toDouble(&latOk); - double lon = values[15].toDouble(&lonOk); - int alert = values[19].toInt(); - - if (!altOk || !latOk || !lonOk) { - return; - } - if (lat == 0 && lon == 0) { - return; - } - - double altitude = modeCAltitude * 0.3048; - QGeoCoordinate location(lat, lon); - adsbInfo.location = location; - adsbInfo.altitude = altitude; - adsbInfo.alert = alert == 1; - adsbInfo.availableFlags = ADSBVehicle::LocationAvailable | ADSBVehicle::AltitudeAvailable | ADSBVehicle::AlertAvailable; - emit adsbVehicleUpdate(adsbInfo); -} - -void ADSBTCPLink::_parseAndEmitHeading(ADSBVehicle::ADSBVehicleInfo_t &adsbInfo, QStringList values) -{ - bool headingOk; - double heading = values[13].toDouble(&headingOk); - if (!headingOk) { - return; - } - - adsbInfo.heading = heading; - adsbInfo.availableFlags = ADSBVehicle::HeadingAvailable; - emit adsbVehicleUpdate(adsbInfo); -} \ No newline at end of file diff --git a/src/ADSB/ADSBVehicleManager.h b/src/ADSB/ADSBVehicleManager.h index ad9a922..2b45cc9 100644 --- a/src/ADSB/ADSBVehicleManager.h +++ b/src/ADSB/ADSBVehicleManager.h @@ -29,7 +29,7 @@ public: ~ADSBTCPLink(); signals: - void adsbVehicleUpdate(const ADSBVehicle::ADSBVehicleInfo_t vehicleInfo); + void adsbVehicleUpdate(const ADSBVehicle::VehicleInfo_t vehicleInfo); void error(const QString errorMsg); protected: @@ -45,9 +45,6 @@ private: QString _hostAddress; int _port; QTcpSocket* _socket = nullptr; - void _parseAndEmitCallsign(ADSBVehicle::ADSBVehicleInfo_t &adsbInfo, QStringList values); - void _parseAndEmitLocation(ADSBVehicle::ADSBVehicleInfo_t &adsbInfo, QStringList values); - void _parseAndEmitHeading(ADSBVehicle::ADSBVehicleInfo_t &adsbInfo, QStringList values); }; class ADSBVehicleManager : public QGCTool { @@ -64,7 +61,7 @@ public: void setToolbox(QGCToolbox* toolbox) final; public slots: - void adsbVehicleUpdate (const ADSBVehicle::ADSBVehicleInfo_t vehicleInfo); + void adsbVehicleUpdate (const ADSBVehicle::VehicleInfo_t vehicleInfo); void _tcpError (const QString errorMsg); private slots: diff --git a/src/Airmap/AirMap.SettingsGroup.json b/src/Airmap/AirMap.SettingsGroup.json new file mode 100644 index 0000000..d813ee0 --- /dev/null +++ b/src/Airmap/AirMap.SettingsGroup.json @@ -0,0 +1,55 @@ +{ + "version": 1, + "fileType": "FactMetaData", + "QGC.MetaData.Facts": +[ +{ + "name": "usePersonalApiKey", + "shortDesc": "Use Personal AirMap API Key", + "type": "bool", + "default": false +}, +{ + "name": "apiKey", + "shortDesc": "AirMap API Key", + "type": "string", + "default": "" +}, +{ + "name": "clientID", + "shortDesc": "AirMap Client ID", + "type": "string", + "default": "" +}, +{ + "name": "userName", + "shortDesc": "AirMap User Name", + "type": "string", + "default": "" +}, +{ + "name": "password", + "shortDesc": "AirMap Password", + "type": "string", + "default": "" +}, +{ + "name": "enableAirMap", + "shortDesc": "Enable AirMap", + "type": "bool", + "default": false +}, +{ + "name": "enableAirspace", + "shortDesc": "Show Airspace on Map (Experimental)", + "type": "bool", + "default": false +}, +{ + "name": "enableTelemetry", + "shortDesc": "Enable AirMap Telemetry", + "type": "bool", + "default": false +} +] +} diff --git a/src/Airmap/AirMapAdvisoryManager.cc b/src/Airmap/AirMapAdvisoryManager.cc new file mode 100644 index 0000000..8cf332c --- /dev/null +++ b/src/Airmap/AirMapAdvisoryManager.cc @@ -0,0 +1,145 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#include "AirMapAdvisoryManager.h" +#include "AirspaceRestriction.h" +#include "AirMapRulesetsManager.h" +#include "AirMapManager.h" +#include "QGCApplication.h" + +#include +#include +#include + +#include "airmap/airspaces.h" +#include "airmap/advisory.h" + +#define ADVISORY_UPDATE_DISTANCE 500 //-- 500m threshold for updates + +using namespace airmap; + +//----------------------------------------------------------------------------- +AirMapAdvisory::AirMapAdvisory(QObject* parent) + : AirspaceAdvisory(parent) +{ +} + +//----------------------------------------------------------------------------- +AirMapAdvisoryManager::AirMapAdvisoryManager(AirMapSharedState& shared, QObject *parent) + : AirspaceAdvisoryProvider(parent) + , _valid(false) + , _shared(shared) +{ +} + +//----------------------------------------------------------------------------- +void +AirMapAdvisoryManager::setROI(const QGCGeoBoundingCube& roi, bool reset) +{ + //-- If first time or we've moved more than ADVISORY_UPDATE_DISTANCE, ask for updates. + if(reset || (!_lastROI.isValid() || _lastROI.pointNW.distanceTo(roi.pointNW) > ADVISORY_UPDATE_DISTANCE || _lastROI.pointSE.distanceTo(roi.pointSE) > ADVISORY_UPDATE_DISTANCE)) { + _lastROI = roi; + _requestAdvisories(); + } +} + +//----------------------------------------------------------------------------- +static bool +adv_sort(QObject* a, QObject* b) +{ + AirMapAdvisory* aa = qobject_cast(a); + AirMapAdvisory* bb = qobject_cast(b); + if(!aa || !bb) return false; + return static_cast(aa->color()) > static_cast(bb->color()); +} + +//----------------------------------------------------------------------------- +void +AirMapAdvisoryManager::_requestAdvisories() +{ + qCDebug(AirMapManagerLog) << "Advisories Request (ROI Changed)"; + if (!_shared.client()) { + qCDebug(AirMapManagerLog) << "No AirMap client instance. Not updating Advisories"; + _valid = false; + emit advisoryChanged(); + return; + } + _valid = false; + _advisories.clearAndDeleteContents(); + + Advisory::Search::Parameters params; + params.authorization = _shared.loginToken().toStdString(); + //-- Geometry + Geometry::Polygon polygon; + //-- Get ROI bounding box, clipping to max area of interest + for (const auto& qcoord : _lastROI.polygon2D(qgcApp()->toolbox()->airspaceManager()->maxAreaOfInterest())) { + Geometry::Coordinate coord; + coord.latitude = qcoord.latitude(); + coord.longitude = qcoord.longitude(); + polygon.outer_ring.coordinates.push_back(coord); + } + params.geometry = Geometry(polygon); + //-- Rulesets + auto* pRulesMgr = qobject_cast(qgcApp()->toolbox()->airspaceManager()->ruleSets()); + QString ruleIDs; + if(pRulesMgr) { + for(int rs = 0; rs < pRulesMgr->ruleSets()->count(); rs++) { + AirMapRuleSet* ruleSet = qobject_cast(pRulesMgr->ruleSets()->get(rs)); + //-- If this ruleset is selected + if(ruleSet && ruleSet->selected()) { + ruleIDs = ruleIDs + ruleSet->id(); + //-- Separate rules with commas + if(rs < pRulesMgr->ruleSets()->count() - 1) { + ruleIDs = ruleIDs + ","; + } + } + } + } + if(ruleIDs.isEmpty()) { + qCDebug(AirMapManagerLog) << "No rules defined. Not updating Advisories"; + _valid = false; + emit advisoryChanged(); + return; + } + params.rulesets = ruleIDs.toStdString(); + //-- Time + quint64 start = static_cast(QDateTime::currentDateTimeUtc().toMSecsSinceEpoch()); + quint64 end = start + 60 * 30 * 1000; + params.start = airmap::from_milliseconds_since_epoch(airmap::milliseconds(static_cast(start))); + params.end = airmap::from_milliseconds_since_epoch(airmap::milliseconds(static_cast(end))); + std::weak_ptr isAlive(_instance); + _shared.client()->advisory().search(params, [this, isAlive](const Advisory::Search::Result& result) { + if (!isAlive.lock()) return; + if (result) { + qCDebug(AirMapManagerLog) << "Successful advisory search. Items:" << result.value().size(); + _airspaceColor = AirspaceAdvisoryProvider::Green; + for (const auto& advisory : result.value()) { + AirMapAdvisory* pAdvisory = new AirMapAdvisory(this); + pAdvisory->_id = QString::fromStdString(advisory.advisory.airspace.id()); + pAdvisory->_name = QString::fromStdString(advisory.advisory.airspace.name()); + pAdvisory->_type = static_cast(advisory.advisory.airspace.type()); + pAdvisory->_color = static_cast(advisory.color); + if(pAdvisory->_color > _airspaceColor) { + _airspaceColor = pAdvisory->_color; + } + _advisories.append(pAdvisory); + qCDebug(AirMapManagerLog) << "Adding advisory" << pAdvisory->name(); + } + //-- Sort in order of color (priority) + _advisories.beginReset(); + std::sort(_advisories.objectList()->begin(), _advisories.objectList()->end(), adv_sort); + _advisories.endReset(); + _valid = true; + } else { + QString description = QString::fromStdString(result.error().description() ? result.error().description().get() : ""); + qCDebug(AirMapManagerLog) << "Advisories Request Failed" << QString::fromStdString(result.error().message()) << description; + } + emit advisoryChanged(); + }); +} diff --git a/src/Airmap/AirMapAdvisoryManager.h b/src/Airmap/AirMapAdvisoryManager.h new file mode 100644 index 0000000..a8be68b --- /dev/null +++ b/src/Airmap/AirMapAdvisoryManager.h @@ -0,0 +1,71 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#pragma once + +#include "QmlObjectListModel.h" + +#include "LifetimeChecker.h" + +#include "AirspaceAdvisoryProvider.h" +#include "AirMapSharedState.h" + +#include "QGCGeoBoundingCube.h" + +#include "airmap/status.h" + +/** + * @file AirMapAdvisoryManager.h + * Advisory information provided by AirMap. + */ + +//----------------------------------------------------------------------------- +class AirMapAdvisory : public AirspaceAdvisory +{ + Q_OBJECT + friend class AirMapAdvisoryManager; + friend class AirMapFlightPlanManager; +public: + AirMapAdvisory (QObject* parent = nullptr); + QString id () override { return _id; } + QString name () override { return _name; } + AdvisoryType type () override { return _type; } + QGeoCoordinate coordinates () override { return _coordinates; } + qreal radius () override { return _radius; } + AirspaceAdvisoryProvider::AdvisoryColor color () override { return _color; } +private: + QString _id; + QString _name; + AdvisoryType _type; + QGeoCoordinate _coordinates; + qreal _radius; + AirspaceAdvisoryProvider::AdvisoryColor _color; +}; + +//----------------------------------------------------------------------------- +class AirMapAdvisoryManager : public AirspaceAdvisoryProvider, public LifetimeChecker +{ + Q_OBJECT +public: + AirMapAdvisoryManager (AirMapSharedState &shared, QObject *parent = nullptr); + bool valid () override { return _valid; } + AdvisoryColor airspaceColor () override { return _airspaceColor; } + QmlObjectListModel* advisories () override { return &_advisories; } + void setROI (const QGCGeoBoundingCube& roi, bool reset = false) override; +signals: + void error (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails); +private: + void _requestAdvisories (); +private: + bool _valid; + AirMapSharedState& _shared; + QGCGeoBoundingCube _lastROI; + QmlObjectListModel _advisories; + AdvisoryColor _airspaceColor; +}; diff --git a/src/Airmap/AirMapFlightManager.cc b/src/Airmap/AirMapFlightManager.cc new file mode 100644 index 0000000..7f0482d --- /dev/null +++ b/src/Airmap/AirMapFlightManager.cc @@ -0,0 +1,112 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#include "AirMapFlightManager.h" +#include "AirMapManager.h" +#include "AirMapRulesetsManager.h" +#include "QGCApplication.h" + +#include "QGCMAVLink.h" + +#include "airmap/pilots.h" +#include "airmap/flights.h" +#include "airmap/date_time.h" +#include "airmap/flight_plans.h" +#include "airmap/geometry.h" + +using namespace airmap; + +//----------------------------------------------------------------------------- +AirMapFlightManager::AirMapFlightManager(AirMapSharedState& shared) + : _shared(shared) +{ + +} + +//----------------------------------------------------------------------------- +void +AirMapFlightManager::findFlight(const QGCGeoBoundingCube& bc) +{ + _state = State::FetchFlights; + _searchArea = bc; + std::weak_ptr isAlive(_instance); + _shared.doRequestWithLogin([this, isAlive](const QString& login_token) { + if (!isAlive.lock()) return; + if (_state != State::FetchFlights) return; + QList coords = _searchArea.polygon2D(); + Geometry::LineString lineString; + for (const auto& qcoord : coords) { + Geometry::Coordinate coord; + coord.latitude = qcoord.latitude(); + coord.longitude = qcoord.longitude(); + lineString.coordinates.push_back(coord); + } + _flightID.clear(); + Flights::Search::Parameters params; + params.authorization = login_token.toStdString(); + params.geometry = Geometry(lineString); + _shared.client()->flights().search(params, [this, isAlive](const Flights::Search::Result& result) { + if (!isAlive.lock()) return; + if (_state != State::FetchFlights) return; + if (result && result.value().flights.size() > 0) { + const Flights::Search::Response& response = result.value(); + qCDebug(AirMapManagerLog) << "Find flights response"; + for (const auto& flight : response.flights) { + QString fid = QString::fromStdString(flight.id); + qCDebug(AirMapManagerLog) << "Checking flight:" << fid; + if(flight.geometry.type() == Geometry::Type::line_string) { + const Geometry::LineString& lineString = flight.geometry.details_for_line_string(); + QList rcoords; + for (const auto& vertex : lineString.coordinates) { + rcoords.append(QGeoCoordinate(vertex.latitude, vertex.longitude)); + } + if(_searchArea == rcoords) { + qCDebug(AirMapManagerLog) << "Found match:" << fid; + _flightID = fid; + _state = State::Idle; + emit flightIDChanged(); + return; + } + } + } + } + qCDebug(AirMapManagerLog) << "No flights found"; + emit flightIDChanged(); + }); + _state = State::Idle; + }); +} + +//----------------------------------------------------------------------------- +void +AirMapFlightManager::endFlight(const QString& flightID) +{ + if (_state != State::Idle) { + qCWarning(AirMapManagerLog) << "AirMapFlightManager::endFlight: State not idle"; + return; + } + qCDebug(AirMapManagerLog) << "Ending flight" << flightID; + _state = State::FlightEnd; + Flights::EndFlight::Parameters params; + params.authorization = _shared.loginToken().toStdString(); + params.id = flightID.toStdString(); + std::weak_ptr isAlive(_instance); + _shared.client()->flights().end_flight(params, [this, isAlive](const Flights::EndFlight::Result& result) { + if (!isAlive.lock()) return; + if (_state != State::FlightEnd) return; + _state = State::Idle; + if (!result) { + QString description = QString::fromStdString(result.error().description() ? result.error().description().get() : ""); + emit error("Failed to end Flight", + QString::fromStdString(result.error().message()), description); + } + }); +} + + diff --git a/src/Airmap/AirMapFlightManager.h b/src/Airmap/AirMapFlightManager.h new file mode 100644 index 0000000..b311bee --- /dev/null +++ b/src/Airmap/AirMapFlightManager.h @@ -0,0 +1,51 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#pragma once + +#include "LifetimeChecker.h" +#include "AirMapSharedState.h" +#include "AirspaceFlightPlanProvider.h" + +#include +#include +#include +#include + +//----------------------------------------------------------------------------- +/// class to upload a flight +class AirMapFlightManager : public QObject, public LifetimeChecker +{ + Q_OBJECT +public: + AirMapFlightManager (AirMapSharedState& shared); + + void findFlight (const QGCGeoBoundingCube& bc); + void endFlight (const QString& id); + QString flightID () { return _flightID; } + +signals: + void error (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails); + void flightIDChanged (); + +private: + + enum class State { + Idle, + GetPilotID, + FetchFlights, + FlightEnd, + }; + + State _state = State::Idle; + AirMapSharedState& _shared; + QString _flightID; + QGCGeoBoundingCube _searchArea; +}; + diff --git a/src/Airmap/AirMapFlightPlanManager.cc b/src/Airmap/AirMapFlightPlanManager.cc new file mode 100644 index 0000000..4847050 --- /dev/null +++ b/src/Airmap/AirMapFlightPlanManager.cc @@ -0,0 +1,926 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#include "AirMapFlightPlanManager.h" +#include "AirMapManager.h" +#include "AirMapRulesetsManager.h" +#include "AirMapAdvisoryManager.h" +#include "QGCApplication.h" +#include "SettingsManager.h" + +#include "PlanMasterController.h" +#include "QGCMAVLink.h" + +#include "airmap/date_time.h" +#include "airmap/flight_plans.h" +#include "airmap/flights.h" +#include "airmap/geometry.h" +#include "airmap/pilots.h" + +using namespace airmap; + +//----------------------------------------------------------------------------- +AirMapFlightAuthorization::AirMapFlightAuthorization(const Evaluation::Authorization auth, QObject *parent) + : AirspaceFlightAuthorization(parent) + , _auth(auth) +{ +} + +//----------------------------------------------------------------------------- +AirspaceFlightAuthorization::AuthorizationStatus +AirMapFlightAuthorization::status() +{ + switch(_auth.status) { + case Evaluation::Authorization::Status::accepted: + return AirspaceFlightAuthorization::Accepted; + case Evaluation::Authorization::Status::rejected: + return AirspaceFlightAuthorization::Rejected; + case Evaluation::Authorization::Status::pending: + return AirspaceFlightAuthorization::Pending; + case Evaluation::Authorization::Status::accepted_upon_submission: + return AirspaceFlightAuthorization::AcceptedOnSubmission; + case Evaluation::Authorization::Status::rejected_upon_submission: + return AirspaceFlightAuthorization::RejectedOnSubmission; + } + return AirspaceFlightAuthorization::Unknown; +} + +//----------------------------------------------------------------------------- +AirMapFlightInfo::AirMapFlightInfo(const airmap::Flight& flight, QObject *parent) + : AirspaceFlightInfo(parent) + , _flight(flight) +{ + //-- Load bounding box geometry + const Geometry& geometry = flight.geometry; + if(geometry.type() == Geometry::Type::polygon) { + const Geometry::Polygon& polygon = geometry.details_for_polygon(); + for (const auto& vertex : polygon.outer_ring.coordinates) { + QGeoCoordinate coord; + if (vertex.altitude) { + coord = QGeoCoordinate(vertex.latitude, vertex.longitude, vertex.altitude.get()); + } else { + coord = QGeoCoordinate(vertex.latitude, vertex.longitude); + } + _boundingBox.append(QVariant::fromValue(coord)); + } + } +} + +//----------------------------------------------------------------------------- +QString +AirMapFlightInfo::createdTime() +{ + return QDateTime::fromMSecsSinceEpoch(static_cast(airmap::milliseconds_since_epoch(_flight.created_at))).toString("yyyy MM dd - hh:mm:ss"); +} + +//----------------------------------------------------------------------------- +QString +AirMapFlightInfo::startTime() +{ + return QDateTime::fromMSecsSinceEpoch(static_cast(airmap::milliseconds_since_epoch(_flight.start_time))).toString("yyyy MM dd - hh:mm:ss"); +} + +//----------------------------------------------------------------------------- +QDateTime +AirMapFlightInfo::qStartTime() +{ + return QDateTime::fromMSecsSinceEpoch(static_cast(airmap::milliseconds_since_epoch(_flight.start_time))); +} + +//----------------------------------------------------------------------------- +bool +AirMapFlightInfo::active() +{ + QDateTime end = QDateTime::fromMSecsSinceEpoch(static_cast(airmap::milliseconds_since_epoch(_flight.end_time))); + QDateTime now = QDateTime::currentDateTime(); + return end > now; +} + +//----------------------------------------------------------------------------- +void +AirMapFlightInfo::setEndFlight(DateTime end) +{ + _flight.end_time = end; + emit activeChanged(); +} + +//----------------------------------------------------------------------------- +QString +AirMapFlightInfo::endTime() +{ + return QDateTime::fromMSecsSinceEpoch(static_cast(airmap::milliseconds_since_epoch(_flight.end_time))).toString("yyyy MM dd - hh:mm:ss"); +} + +//----------------------------------------------------------------------------- +AirMapFlightPlanManager::AirMapFlightPlanManager(AirMapSharedState& shared, QObject *parent) + : AirspaceFlightPlanProvider(parent) + , _shared(shared) +{ + connect(&_pollTimer, &QTimer::timeout, this, &AirMapFlightPlanManager::_pollBriefing); + _flightStartTime = QDateTime::currentDateTime().addSecs(60); +} + +//----------------------------------------------------------------------------- +AirMapFlightPlanManager::~AirMapFlightPlanManager() +{ + _advisories.deleteListAndContents(); + _rulesets.deleteListAndContents(); +} + +//----------------------------------------------------------------------------- +void +AirMapFlightPlanManager::setFlightStartTime(QDateTime start) +{ + if(start < QDateTime::currentDateTime()) { + start = QDateTime::currentDateTime().addSecs(1); + setDirty(true); + } + if(_flightStartTime != start) { + _flightStartTime = start; + setDirty(true); + emit flightStartTimeChanged(); + } + qCDebug(AirMapManagerLog) << "Set time start time" << _flightStartTime; +} + +//----------------------------------------------------------------------------- +void +AirMapFlightPlanManager::setFlightStartsNow(bool now) +{ + _flightStartsNow = now; + setDirty(true); + emit flightStartsNowChanged(); +} + +//----------------------------------------------------------------------------- +void +AirMapFlightPlanManager::setFlightDuration(int seconds) +{ + if(_flightDuration != seconds || _flightDuration < 30) { + _flightDuration = seconds; + if(_flightDuration < 30) { + _flightDuration = 30; + } + setDirty(true); + emit flightDurationChanged(); + qCDebug(AirMapManagerLog) << "Set time duration" << _flightDuration; + } +} + +//----------------------------------------------------------------------------- +QDateTime +AirMapFlightPlanManager::flightStartTime() const +{ + return _flightStartTime; +} + +//----------------------------------------------------------------------------- +int +AirMapFlightPlanManager::flightDuration() const +{ + return _flightDuration; +} + +//----------------------------------------------------------------------------- +void +AirMapFlightPlanManager::startFlightPlanning(PlanMasterController *planController) +{ + if (!_shared.client()) { + qCDebug(AirMapManagerLog) << "No AirMap client instance. Will not create a flight"; + return; + } + + if (_state != State::Idle) { + qCWarning(AirMapManagerLog) << "AirMapFlightPlanManager::startFlightPlanning: State not idle"; + return; + } + + //-- TODO: Check if there is an ongoing flight plan and do something about it (Delete it?) + + /* + * if(!flightPlanID().isEmpty()) { + * do something; + * } + */ + + if(!_planController) { + _planController = planController; + //-- Get notified of mission changes + connect(planController->missionController(), &MissionController::missionBoundingCubeChanged, this, &AirMapFlightPlanManager::_missionChanged); + } + //-- Set initial flight start time + setFlightStartTime(QDateTime::currentDateTime().addSecs(5 * 60)); +} + +//----------------------------------------------------------------------------- +void +AirMapFlightPlanManager::submitFlightPlan() +{ + if(flightPlanID().isEmpty()) { + qCWarning(AirMapManagerLog) << "Submit flight with no flight plan."; + return; + } + _flightId.clear(); + emit flightIDChanged(_flightId); + _state = State::FlightSubmit; + FlightPlans::Submit::Parameters params; + params.authorization = _shared.loginToken().toStdString(); + params.id = flightPlanID().toStdString(); + std::weak_ptr isAlive(_instance); + _shared.client()->flight_plans().submit(params, [this, isAlive](const FlightPlans::Submit::Result& result) { + if (!isAlive.lock()) return; + if (_state != State::FlightSubmit) return; + if (result) { + _flightPlan = result.value(); + _flightId = QString::fromStdString(_flightPlan.flight_id.get()); + _state = State::Idle; + _pollBriefing(); + emit flightIDChanged(_flightId); + } else { + QString description = QString::fromStdString(result.error().description() ? result.error().description().get() : ""); + emit error("Failed to submit Flight Plan", + QString::fromStdString(result.error().message()), description); + _state = State::Idle; + _flightPermitStatus = AirspaceFlightPlanProvider::PermitRejected; + emit flightPermitStatusChanged(); + } + }); +} + +//----------------------------------------------------------------------------- +void +AirMapFlightPlanManager::updateFlightPlan() +{ + //-- Are we enabled? + if(!qgcApp()->toolbox()->settingsManager()->airMapSettings()->enableAirMap()->rawValue().toBool()) { + return; + } + //-- Do we have a license? + if(!_shared.hasAPIKey()) { + return; + } + _flightPermitStatus = AirspaceFlightPlanProvider::PermitPending; + emit flightPermitStatusChanged(); + setDirty(false); + _updateFlightPlan(true); +} + +//----------------------------------------------------------------------------- +void +AirMapFlightPlanManager::endFlight(QString flightID) +{ + qCDebug(AirMapManagerLog) << "End flight"; + _flightToEnd = flightID; + if (_shared.pilotID().isEmpty()) { + //-- Need to get the pilot id + qCDebug(AirMapManagerLog) << "Getting pilot ID"; + _state = State::GetPilotID; + std::weak_ptr isAlive(_instance); + _shared.doRequestWithLogin([this, isAlive](const QString& login_token) { + if (!isAlive.lock()) return; + Pilots::Authenticated::Parameters params; + params.authorization = login_token.toStdString(); + _shared.client()->pilots().authenticated(params, [this, isAlive](const Pilots::Authenticated::Result& result) { + if (!isAlive.lock()) return; + if (_state != State::GetPilotID) return; + if (result) { + QString pilotID = QString::fromStdString(result.value().id); + _shared.setPilotID(pilotID); + qCDebug(AirMapManagerLog) << "Got Pilot ID:" << pilotID; + _state = State::Idle; + _endFlight(); + } else { + _state = State::Idle; + QString description = QString::fromStdString(result.error().description() ? result.error().description().get() : ""); + emit error("Failed to get pilot ID", QString::fromStdString(result.error().message()), description); + return; + } + }); + }); + } else { + _endFlight(); + } +} + +//----------------------------------------------------------------------------- +void +AirMapFlightPlanManager::_endFlight() +{ + if(_flightToEnd.isEmpty()) { + qCDebug(AirMapManagerLog) << "End non existing flight"; + return; + } + qCDebug(AirMapManagerLog) << "End Flight. State:" << static_cast(_state); + if(_state != State::Idle) { + QTimer::singleShot(100, this, &AirMapFlightPlanManager::_endFlight); + return; + } + qCDebug(AirMapManagerLog) << "Ending flight:" << _flightToEnd; + _state = State::FlightEnd; + std::weak_ptr isAlive(_instance); + Flights::EndFlight::Parameters params; + params.authorization = _shared.loginToken().toStdString(); + params.id = _flightToEnd.toStdString(); + //-- End flight + _shared.client()->flights().end_flight(params, [this, isAlive](const Flights::EndFlight::Result& result) { + if (!isAlive.lock()) return; + if (_state != State::FlightEnd) return; + if (result) { + qCDebug(AirMapManagerLog) << "Flight Ended"; + int idx = _flightList.findFlightID(_flightToEnd); + if(idx >= 0) { + AirMapFlightInfo* pInfo = qobject_cast(_flightList.get(idx)); + if(pInfo) { + pInfo->setEndFlight(result.value().end_time); + } + } + } else { + QString description = QString::fromStdString(result.error().description() ? result.error().description().get() : ""); + emit error("End flight failed", QString::fromStdString(result.error().message()), description); + } + _flightToEnd.clear(); + _state = State::Idle; + }); +} + +//----------------------------------------------------------------------------- +bool +AirMapFlightPlanManager::_collectFlightData() +{ + if(!_planController || !_planController->missionController()) { + return false; + } + //-- Get flight bounding cube and prepare (box) polygon + QGCGeoBoundingCube bc = *_planController->missionController()->travelBoundingCube(); + if(!bc.isValid() || (fabs(bc.area()) < 0.0001)) { + //-- TODO: If single point, we need to set a point and a radius instead + qCDebug(AirMapManagerLog) << "Not enough points for a flight plan."; + return false; + } + // altitude reference for AirMap is takeoff altitude & all altitudes provided in the bounding cube are relative to takeoff already + _flight.takeoffCoord = _planController->missionController()->takeoffCoordinate(); + _flight.maxAltitudeAboveTakeoff = static_cast(fmax(bc.pointNW.altitude(), bc.pointSE.altitude())); + _flight.coords = bc.polygon2D(); + _flight.bc = bc; + emit missionAreaChanged(); + return true; +} + +//----------------------------------------------------------------------------- +void +AirMapFlightPlanManager::_createFlightPlan() +{ + _flight.reset(); + + //-- Get flight data + if(!_collectFlightData()) { + return; + } + + qCDebug(AirMapManagerLog) << "About to create flight plan"; + qCDebug(AirMapManagerLog) << "Takeoff: " << _flight.takeoffCoord; + qCDebug(AirMapManagerLog) << "Bounding box:" << _flight.bc.pointNW << _flight.bc.pointSE; + qCDebug(AirMapManagerLog) << "Flight Start:" << flightStartTime().toString(); + qCDebug(AirMapManagerLog) << "Flight Duration: " << flightDuration(); + + if (_shared.pilotID().isEmpty() && !_shared.settings().userName.isEmpty() && !_shared.settings().password.isEmpty()) { + //-- Need to get the pilot id before uploading the flight plan + qCDebug(AirMapManagerLog) << "Getting pilot ID"; + _state = State::GetPilotID; + std::weak_ptr isAlive(_instance); + _shared.doRequestWithLogin([this, isAlive](const QString& login_token) { + if (!isAlive.lock()) return; + Pilots::Authenticated::Parameters params; + params.authorization = login_token.toStdString(); + _shared.client()->pilots().authenticated(params, [this, isAlive](const Pilots::Authenticated::Result& result) { + if (!isAlive.lock()) return; + if (_state != State::GetPilotID) return; + if (result) { + QString pilotID = QString::fromStdString(result.value().id); + _shared.setPilotID(pilotID); + qCDebug(AirMapManagerLog) << "Got Pilot ID:" << pilotID; + _state = State::Idle; + _uploadFlightPlan(); + } else { + _flightPermitStatus = AirspaceFlightPlanProvider::PermitNone; + emit flightPermitStatusChanged(); + _state = State::Idle; + QString description = QString::fromStdString(result.error().description() ? result.error().description().get() : ""); + emit error("Failed to create Flight Plan", QString::fromStdString(result.error().message()), description); + return; + } + }); + }); + } else { + _uploadFlightPlan(); + } + + _flightPermitStatus = AirspaceFlightPlanProvider::PermitPending; + emit flightPermitStatusChanged(); +} + +//----------------------------------------------------------------------------- +void +AirMapFlightPlanManager::_updateRulesAndFeatures(std::vector& rulesets, std::unordered_map& features, bool updateFeatures) +{ + auto* pRulesMgr = qobject_cast(qgcApp()->toolbox()->airspaceManager()->ruleSets()); + if(pRulesMgr) { + for(int rs = 0; rs < pRulesMgr->ruleSets()->count(); rs++) { + AirMapRuleSet* ruleSet = qobject_cast(pRulesMgr->ruleSets()->get(rs)); + //-- If this ruleset is selected + if(ruleSet && ruleSet->selected()) { + rulesets.push_back(ruleSet->id().toStdString()); + //-- Features within each rule (only when updating) + if(updateFeatures) { + for(int r = 0; r < ruleSet->rules()->count(); r++) { + AirMapRule* rule = qobject_cast(ruleSet->rules()->get(r)); + if(rule) { + for(int f = 0; f < rule->features()->count(); f++) { + AirMapRuleFeature* feature = qobject_cast(rule->features()->get(f)); + if(features.find(feature->name().toStdString()) != features.end()) { + qCDebug(AirMapManagerLog) << "Removing duplicate:" << feature->name(); + continue; + } + if(feature && feature->value().isValid()) { + switch(feature->type()) { + case AirspaceRuleFeature::Boolean: + if(feature->value().toInt() == 0 || feature->value().toInt() == 1) { + features[feature->name().toStdString()] = RuleSet::Feature::Value(feature->value().toBool()); + } else { + //-- If not set, default to false + features[feature->name().toStdString()] = RuleSet::Feature::Value(false); + } + break; + case AirspaceRuleFeature::Float: + //-- Sanity check for floats + if(std::isfinite(feature->value().toFloat())) { + features[feature->name().toStdString()] = RuleSet::Feature::Value(feature->value().toDouble()); + } + break; + case AirspaceRuleFeature::String: + //-- Skip empty responses + if(!feature->value().toString().isEmpty()) { + features[feature->name().toStdString()] = RuleSet::Feature::Value(feature->value().toString().toStdString()); + } + break; + default: + qCWarning(AirMapManagerLog) << "Unknown type for feature" << feature->name(); + } + } + } + } + } + } + } + } + } +} + +//----------------------------------------------------------------------------- +void +AirMapFlightPlanManager::_updateFlightStartEndTime(DateTime& start_time, DateTime& end_time) +{ + if(_flightStartsNow || _flightStartTime < QDateTime::currentDateTime()) { + setFlightStartTime(QDateTime::currentDateTime().addSecs(1)); + } + quint64 startt = static_cast(_flightStartTime.toUTC().toMSecsSinceEpoch()); + start_time = airmap::from_milliseconds_since_epoch(airmap::milliseconds(static_cast(startt))); + quint64 endt = startt + (static_cast(_flightDuration) * 1000); + end_time = airmap::from_milliseconds_since_epoch(airmap::milliseconds(static_cast(endt))); +} + +//----------------------------------------------------------------------------- +void +AirMapFlightPlanManager::_uploadFlightPlan() +{ + qCDebug(AirMapManagerLog) << "Uploading flight plan. State:" << static_cast(_state); + if(_state != State::Idle) { + QTimer::singleShot(100, this, &AirMapFlightPlanManager::_uploadFlightPlan); + return; + } + //-- Reset "relevant" features + _importantFeatures.clear(); + _state = State::FlightUpload; + std::weak_ptr isAlive(_instance); + _shared.doRequestWithLogin([this, isAlive](const QString& login_token) { + if (!isAlive.lock()) return; + if (_state != State::FlightUpload) return; + FlightPlans::Create::Parameters params; + params.max_altitude = _flight.maxAltitudeAboveTakeoff; + params.min_altitude = 0.0; + params.buffer = 10.f; + params.latitude = static_cast(_flight.takeoffCoord.latitude()); + params.longitude = static_cast(_flight.takeoffCoord.longitude()); + params.pilot.id = _shared.pilotID().toStdString(); + //-- Handle flight start/end + _updateFlightStartEndTime(params.start_time, params.end_time); + //-- Rules & Features + _updateRulesAndFeatures(params.rulesets, params.features); + //-- Geometry: polygon + Geometry::Polygon polygon; + for (const auto& qcoord : _flight.coords) { + Geometry::Coordinate coord; + coord.latitude = qcoord.latitude(); + coord.longitude = qcoord.longitude(); + polygon.outer_ring.coordinates.push_back(coord); + } + params.geometry = Geometry(polygon); + params.authorization = login_token.toStdString(); + //-- Create flight plan + _shared.client()->flight_plans().create_by_polygon(params, [this, isAlive](const FlightPlans::Create::Result& result) { + if (!isAlive.lock()) return; + if (_state != State::FlightUpload) return; + _state = State::Idle; + if (result) { + _flightPlan = result.value(); + qCDebug(AirMapManagerLog) << "Flight plan created:" << flightPlanID(); + _pollBriefing(); + } else { + QString description = QString::fromStdString(result.error().description() ? result.error().description().get() : ""); + emit error("Flight Plan creation failed", QString::fromStdString(result.error().message()), description); + } + }); + }); +} + +//----------------------------------------------------------------------------- +void +AirMapFlightPlanManager::_updateFlightPlanOnTimer() +{ + _updateFlightPlan(false); +} + +//----------------------------------------------------------------------------- +void +AirMapFlightPlanManager::_updateFlightPlan(bool interactive) +{ + qCDebug(AirMapManagerLog) << "Updating flight plan. State:" << static_cast(_state); + + if(_state != State::Idle) { + QTimer::singleShot(250, this, &AirMapFlightPlanManager::_updateFlightPlanOnTimer); + return; + } + //-- Get flight data + if(!_collectFlightData()) { + return; + } + + //-- Update local instance of the flight plan + _flightPlan.altitude_agl.max = _flight.maxAltitudeAboveTakeoff; + _flightPlan.altitude_agl.min = 0.0f; + _flightPlan.buffer = 2.f; + _flightPlan.takeoff.latitude = static_cast(_flight.takeoffCoord.latitude()); + _flightPlan.takeoff.longitude = static_cast(_flight.takeoffCoord.longitude()); + //-- Rules & Features + _flightPlan.rulesets.clear(); + _flightPlan.features.clear(); + //-- If interactive, we collect features otherwise we don't + _updateRulesAndFeatures(_flightPlan.rulesets, _flightPlan.features, interactive); + //-- Handle flight start/end + _updateFlightStartEndTime(_flightPlan.start_time, _flightPlan.end_time); + //-- Geometry: polygon + Geometry::Polygon polygon; + for (const auto& qcoord : _flight.coords) { + Geometry::Coordinate coord; + coord.latitude = qcoord.latitude(); + coord.longitude = qcoord.longitude(); + polygon.outer_ring.coordinates.push_back(coord); + } + _flightPlan.geometry = Geometry(polygon); + + qCDebug(AirMapManagerLog) << "Takeoff: " << _flight.takeoffCoord; + qCDebug(AirMapManagerLog) << "Bounding box: " << _flight.bc.pointNW << _flight.bc.pointSE; + qCDebug(AirMapManagerLog) << "Flight Start: " << flightStartTime().toString(); + qCDebug(AirMapManagerLog) << "Flight Duration:" << flightDuration(); + + _state = State::FlightUpdate; + std::weak_ptr isAlive(_instance); + _shared.doRequestWithLogin([this, isAlive](const QString& login_token) { + if (!isAlive.lock()) return; + if (_state != State::FlightUpdate) return; + FlightPlans::Update::Parameters params = {}; + params.authorization = login_token.toStdString(); + params.flight_plan = _flightPlan; + //-- Update flight plan + _shared.client()->flight_plans().update(params, [this, isAlive](const FlightPlans::Update::Result& result) { + if (!isAlive.lock()) return; + if (_state != State::FlightUpdate) return; + _state = State::Idle; + if (result) { + qCDebug(AirMapManagerLog) << "Flight plan updated:" << flightPlanID(); + _pollBriefing(); + } else { + QString description = QString::fromStdString(result.error().description() ? result.error().description().get() : ""); + emit error("Flight Plan update failed", QString::fromStdString(result.error().message()), description); + } + }); + }); +} + +//----------------------------------------------------------------------------- +static bool +adv_sort(QObject* a, QObject* b) +{ + AirMapAdvisory* aa = qobject_cast(a); + AirMapAdvisory* bb = qobject_cast(b); + if(!aa || !bb) return false; + return static_cast(aa->color()) > static_cast(bb->color()); +} + +//----------------------------------------------------------------------------- +static bool +rules_sort(QObject* a, QObject* b) +{ + AirMapRule* aa = qobject_cast(a); + AirMapRule* bb = qobject_cast(b); + if(!aa || !bb) return false; + return static_cast(aa->status()) > static_cast(bb->status()); +} + +//----------------------------------------------------------------------------- +bool +AirMapFlightPlanManager::_findBriefFeature(const QString& name) +{ + for(int i = 0; i < _briefFeatures.count(); i++ ) { + AirMapRuleFeature* feature = qobject_cast(_briefFeatures.get(i)); + if (feature && feature->name() == name) { + return true; + } + } + return false; +} + +//----------------------------------------------------------------------------- +void +AirMapFlightPlanManager::_pollBriefing() +{ + qCDebug(AirMapManagerLog) << "Poll Briefing. State:" << static_cast(_state); + if(_state != State::Idle) { + QTimer::singleShot(100, this, &AirMapFlightPlanManager::_pollBriefing); + return; + } + _state = State::FlightPolling; + FlightPlans::RenderBriefing::Parameters params; + params.authorization = _shared.loginToken().toStdString(); + params.id = flightPlanID().toStdString(); + std::weak_ptr isAlive(_instance); + _shared.client()->flight_plans().render_briefing(params, [this, isAlive](const FlightPlans::RenderBriefing::Result& result) { + if (!isAlive.lock()) return; + if (_state != State::FlightPolling) return; + if (result) { + const FlightPlan::Briefing& briefing = result.value(); + qCDebug(AirMapManagerLog) << "Flight polling/briefing response"; + //-- Collect advisories + _valid = false; + _advisories.clearAndDeleteContents(); + const std::vector advisories = briefing.airspace.advisories; + _airspaceColor = static_cast(briefing.airspace.color); + for (const auto& advisory : advisories) { + AirMapAdvisory* pAdvisory = new AirMapAdvisory(this); + pAdvisory->_id = QString::fromStdString(advisory.airspace.id()); + pAdvisory->_name = QString::fromStdString(advisory.airspace.name()); + pAdvisory->_type = static_cast(advisory.airspace.type()); + pAdvisory->_color = static_cast(advisory.color); + _advisories.append(pAdvisory); + qCDebug(AirMapManagerLog) << "Adding briefing advisory" << pAdvisory->name(); + } + //-- Sort in order of color (priority) + _advisories.beginReset(); + std::sort(_advisories.objectList()->begin(), _advisories.objectList()->end(), adv_sort); + _advisories.endReset(); + _valid = true; + //-- Collect Rulesets + _authorizations.clearAndDeleteContents(); + _rulesViolation.clearAndDeleteContents(); + _rulesInfo.clearAndDeleteContents(); + _rulesReview.clearAndDeleteContents(); + _rulesFollowing.clearAndDeleteContents(); + _briefFeatures.clear(); + for(const auto& ruleset : briefing.evaluation.rulesets) { + AirMapRuleSet* pRuleSet = new AirMapRuleSet(this); + pRuleSet->_id = QString::fromStdString(ruleset.id); + //-- Iterate Rules + for (const auto& rule : ruleset.rules) { + AirMapRule* pRule = new AirMapRule(rule, this); + //-- Iterate Rule Features + for (const auto& feature : rule.features) { + AirMapRuleFeature* pFeature = new AirMapRuleFeature(feature, this); + pRule->_features.append(pFeature); + if(rule.status == RuleSet::Rule::Status::missing_info) { + if(!_findBriefFeature(pFeature->name())) { + _briefFeatures.append(pFeature); + _importantFeatures.append(pFeature); + qCDebug(AirMapManagerLog) << "Adding briefing feature" << pFeature->name() << pFeature->description() << pFeature->type(); + } else { + qCDebug(AirMapManagerLog) << "Skipping briefing feature duplicate" << pFeature->name() << pFeature->description() << pFeature->type(); + } + } + } + //-- When a flight is first created, we send no features. That means that all "missing_info" are "relevant" features. + // We keep a list of them so they will be always shown to the user even when they are no longer "missing_info" + for(const auto& feature : _importantFeatures) { + if(!_findBriefFeature(feature->name())) { + _briefFeatures.append(feature); + } + } + pRuleSet->_rules.append(pRule); + //-- Rules separated by status for presentation + switch(rule.status) { + case RuleSet::Rule::Status::conflicting: + _rulesViolation.append(new AirMapRule(rule, this)); + break; + case RuleSet::Rule::Status::not_conflicting: + _rulesFollowing.append(new AirMapRule(rule, this)); + break; + case RuleSet::Rule::Status::missing_info: + _rulesInfo.append(new AirMapRule(rule, this)); + break; + case RuleSet::Rule::Status::informational: + _rulesReview.append(new AirMapRule(rule, this)); + break; + default: + break; + } + } + //-- Sort rules by relevance order + pRuleSet->_rules.beginReset(); + std::sort(pRuleSet->_rules.objectList()->begin(), pRuleSet->_rules.objectList()->end(), rules_sort); + pRuleSet->_rules.endReset(); + _rulesets.append(pRuleSet); + qCDebug(AirMapManagerLog) << "Adding briefing ruleset" << pRuleSet->id(); + } + //-- Evaluate briefing status + if (briefing.evaluation.authorizations.size() == 0) { + _flightPermitStatus = AirspaceFlightPlanProvider::PermitNotRequired; + emit flightPermitStatusChanged(); + } else { + bool rejected = false; + bool accepted = false; + bool pending = false; + for (const auto& authorization : briefing.evaluation.authorizations) { + AirMapFlightAuthorization* pAuth = new AirMapFlightAuthorization(authorization, this); + _authorizations.append(pAuth); + qCDebug(AirMapManagerLog) << "Autorization:" << pAuth->name() << " (" << pAuth->message() << ")" << static_cast(pAuth->status()); + switch (authorization.status) { + case Evaluation::Authorization::Status::accepted: + case Evaluation::Authorization::Status::accepted_upon_submission: + accepted = true; + break; + case Evaluation::Authorization::Status::rejected: + case Evaluation::Authorization::Status::rejected_upon_submission: + rejected = true; + break; + case Evaluation::Authorization::Status::pending: + pending = true; + break; + } + } + qCDebug(AirMapManagerLog) << "Flight approval: accepted=" << accepted << "rejected" << rejected << "pending" << pending; + if ((rejected || accepted) && !pending) { + if (rejected) { // rejected has priority + _flightPermitStatus = AirspaceFlightPlanProvider::PermitRejected; + } else { + _flightPermitStatus = AirspaceFlightPlanProvider::PermitAccepted; + } + emit flightPermitStatusChanged(); + } else { + //-- Pending. Try again. + _pollTimer.setSingleShot(true); + _pollTimer.start(1000); + } + } + emit advisoryChanged(); + emit rulesChanged(); + _state = State::Idle; + } else { + _state = State::Idle; + QString description = QString::fromStdString(result.error().description() ? result.error().description().get() : ""); + emit error("Brief Request failed", + QString::fromStdString(result.error().message()), description); + } + }); +} + +//----------------------------------------------------------------------------- +void +AirMapFlightPlanManager::_missionChanged() +{ + //-- Are we enabled? + if(!qgcApp()->toolbox()->settingsManager()->airMapSettings()->enableAirMap()->rawValue().toBool()) { + return; + } + //-- Do we have a license? + if(!_shared.hasAPIKey()) { + return; + } + //-- Creating a new flight plan? + if(_state == State::Idle) { + if(flightPlanID().isEmpty()) { + _createFlightPlan(); + } else { + //-- Plan is being modified + _updateFlightPlan(); + } + } +} + +//----------------------------------------------------------------------------- +void +AirMapFlightPlanManager::loadFlightList(QDateTime startTime, QDateTime endTime) +{ + //-- TODO: This is not checking if the state is Idle. Again, these need to + // queued up and handled by a worker thread. + qCDebug(AirMapManagerLog) << "Preparing load flight list"; + _loadingFlightList = true; + emit loadingFlightListChanged(); + _rangeStart = startTime; + _rangeEnd = endTime; + qCDebug(AirMapManagerLog) << "List flights from:" << _rangeStart.toString("yyyy MM dd - hh:mm:ss") << "to" << _rangeEnd.toString("yyyy MM dd - hh:mm:ss"); + if (_shared.pilotID().isEmpty()) { + //-- Need to get the pilot id + qCDebug(AirMapManagerLog) << "Getting pilot ID"; + _state = State::GetPilotID; + std::weak_ptr isAlive(_instance); + _shared.doRequestWithLogin([this, isAlive](const QString& login_token) { + if (!isAlive.lock()) return; + Pilots::Authenticated::Parameters params; + params.authorization = login_token.toStdString(); + _shared.client()->pilots().authenticated(params, [this, isAlive](const Pilots::Authenticated::Result& result) { + if (!isAlive.lock()) return; + if (_state != State::GetPilotID) return; + if (result) { + QString pilotID = QString::fromStdString(result.value().id); + _shared.setPilotID(pilotID); + qCDebug(AirMapManagerLog) << "Got Pilot ID:" << pilotID; + _state = State::Idle; + _loadFlightList(); + } else { + _state = State::Idle; + QString description = QString::fromStdString(result.error().description() ? result.error().description().get() : ""); + emit error("Failed to get pilot ID", QString::fromStdString(result.error().message()), description); + _loadingFlightList = false; + emit loadingFlightListChanged(); + return; + } + }); + }); + } else { + _loadFlightList(); + } +} + +//----------------------------------------------------------------------------- +void +AirMapFlightPlanManager::_loadFlightList() +{ + qCDebug(AirMapManagerLog) << "Load flight list. State:" << static_cast(_state); + if(_state != State::Idle) { + QTimer::singleShot(100, this, &AirMapFlightPlanManager::_loadFlightList); + return; + } + _flightList.clear(); + emit flightListChanged(); + _state = State::LoadFlightList; + std::weak_ptr isAlive(_instance); + _shared.doRequestWithLogin([this, isAlive](const QString& login_token) { + if (!isAlive.lock()) return; + if (_state != State::LoadFlightList) return; + Flights::Search::Parameters params; + params.authorization = login_token.toStdString(); + quint64 start = static_cast(_rangeStart.toUTC().toMSecsSinceEpoch()); + quint64 end = static_cast(_rangeEnd.toUTC().toMSecsSinceEpoch()); + params.start_after = airmap::from_milliseconds_since_epoch(airmap::milliseconds(static_cast(start))); + params.start_before = airmap::from_milliseconds_since_epoch(airmap::milliseconds(static_cast(end))); + params.limit = 250; + params.pilot_id = _shared.pilotID().toStdString(); + _shared.client()->flights().search(params, [this, isAlive](const Flights::Search::Result& result) { + if (!isAlive.lock()) return; + if (_state != State::LoadFlightList) return; + if (result && result.value().flights.size() > 0) { + const Flights::Search::Response& response = result.value(); + for (const auto& flight : response.flights) { + AirMapFlightInfo* pFlight = new AirMapFlightInfo(flight, this); + _flightList.append(pFlight); + qCDebug(AirMapManagerLog) << "Found:" << pFlight->flightID() << pFlight->flightPlanID() << pFlight->endTime(); + } + _flightList.sortStartFlight(); + emit flightListChanged(); + } else { + if(!result) { + QString description = QString::fromStdString(result.error().description() ? result.error().description().get() : ""); + emit error("Flight search failed", QString::fromStdString(result.error().message()), description); + } + } + _state = State::Idle; + _loadingFlightList = false; + emit loadingFlightListChanged(); + }); + }); +} + diff --git a/src/Airmap/AirMapFlightPlanManager.h b/src/Airmap/AirMapFlightPlanManager.h new file mode 100644 index 0000000..339a772 --- /dev/null +++ b/src/Airmap/AirMapFlightPlanManager.h @@ -0,0 +1,181 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#pragma once + +#include "LifetimeChecker.h" +#include "AirMapSharedState.h" +#include "AirspaceFlightPlanProvider.h" + +#include +#include +#include +#include + +#include "airmap/flight.h" +#include "airmap/flight_plan.h" +#include "airmap/ruleset.h" + +class AirMapRuleFeature; +class PlanMasterController; + +//----------------------------------------------------------------------------- +class AirMapFlightAuthorization : public AirspaceFlightAuthorization +{ + Q_OBJECT +public: + AirMapFlightAuthorization (const airmap::Evaluation::Authorization auth, QObject *parent = nullptr); + + AirspaceFlightAuthorization::AuthorizationStatus + status () override; + QString name () override { return QString::fromStdString(_auth.authority.name); } + QString id () override { return QString::fromStdString(_auth.authority.id); } + QString message () override { return QString::fromStdString(_auth.message); } +private: + airmap::Evaluation::Authorization _auth; +}; + +//----------------------------------------------------------------------------- +class AirMapFlightInfo : public AirspaceFlightInfo +{ + Q_OBJECT +public: + AirMapFlightInfo (const airmap::Flight& flight, QObject *parent = nullptr); + QString flightID () override { return QString::fromStdString(_flight.id); } + QString flightPlanID () override { return _flight.flight_plan_id ? QString::fromStdString(_flight.flight_plan_id.get()) : QString(); } + QString createdTime () override; + QString startTime () override; + QString endTime () override; + QDateTime qStartTime () override; + QGeoCoordinate takeOff () override { return QGeoCoordinate(static_cast(_flight.latitude), static_cast(_flight.longitude));} + QVariantList boundingBox () override { return _boundingBox; } + bool active () override; + void setEndFlight (airmap::DateTime end); +private: + airmap::Flight _flight; + QVariantList _boundingBox; +}; + +//----------------------------------------------------------------------------- +/// class to upload a flight +class AirMapFlightPlanManager : public AirspaceFlightPlanProvider, public LifetimeChecker +{ + Q_OBJECT +public: + AirMapFlightPlanManager (AirMapSharedState& shared, QObject *parent = nullptr); + ~AirMapFlightPlanManager () override; + + PermitStatus flightPermitStatus () const override { return _flightPermitStatus; } + QDateTime flightStartTime () const override; + int flightDuration () const override; + bool flightStartsNow () const override { return _flightStartsNow; } + bool valid () override { return _valid; } + QmlObjectListModel* advisories () override { return &_advisories; } + QmlObjectListModel* ruleSets () override { return &_rulesets; } + QGCGeoBoundingCube* missionArea () override { return &_flight.bc; } + + AirspaceAdvisoryProvider::AdvisoryColor + airspaceColor () override { return _airspaceColor; } + + QmlObjectListModel* rulesViolation () override { return &_rulesViolation; } + QmlObjectListModel* rulesInfo () override { return &_rulesInfo; } + QmlObjectListModel* rulesReview () override { return &_rulesReview; } + QmlObjectListModel* rulesFollowing () override { return &_rulesFollowing; } + QmlObjectListModel* briefFeatures () override { return &_briefFeatures; } + QmlObjectListModel* authorizations () override { return &_authorizations; } + AirspaceFlightModel*flightList () override { return &_flightList; } + bool loadingFlightList () override { return _loadingFlightList; } + QString flightPlanID () {return QString::fromStdString(_flightPlan.id); } + QString flightID () {return _flightId; } + + void updateFlightPlan () override; + void submitFlightPlan () override; + void startFlightPlanning (PlanMasterController* planController) override; + void setFlightStartTime (QDateTime start) override; + void setFlightDuration (int seconds) override; + void loadFlightList (QDateTime startTime, QDateTime endTime) override; + void setFlightStartsNow (bool now) override; + void endFlight (QString flightID) override; + +signals: + void error (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails); + void flightIDChanged (QString flightID); + +private slots: + void _pollBriefing (); + void _missionChanged (); + void _endFlight (); + void _uploadFlightPlan (); + void _updateFlightPlanOnTimer (); + void _loadFlightList (); + +private: + void _createFlightPlan (); + bool _collectFlightData (); + void _updateFlightPlan (bool interactive = false); + bool _findBriefFeature (const QString& name); + void _updateFlightStartEndTime (airmap::DateTime& start_time, airmap::DateTime& end_time); + void _updateRulesAndFeatures (std::vector& rulesets, std::unordered_map& features, bool updateFeatures = false); + +private: + enum class State { + Idle, + GetPilotID, + FlightUpload, + FlightUpdate, + FlightEnd, + FlightSubmit, + FlightPolling, + LoadFlightList, + }; + + struct Flight { + QGCGeoBoundingCube bc; + QList coords; + QGeoCoordinate takeoffCoord; + float maxAltitudeAboveTakeoff = 0; + void reset() { + bc.reset(); + coords.clear(); + maxAltitudeAboveTakeoff = 0; + } + }; + + Flight _flight; ///< flight pending to be uploaded + State _state = State::Idle; + AirMapSharedState& _shared; + QTimer _pollTimer; ///< timer to poll for approval check + QString _flightId; ///< Current flight ID, not necessarily accepted yet + QString _flightToEnd; + PlanMasterController* _planController = nullptr; + bool _valid = false; + bool _loadingFlightList = false; + bool _flightStartsNow = false; + QmlObjectListModel _advisories; + QmlObjectListModel _rulesets; + QmlObjectListModel _rulesViolation; + QmlObjectListModel _rulesInfo; + QmlObjectListModel _rulesReview; + QmlObjectListModel _rulesFollowing; + QmlObjectListModel _briefFeatures; + QmlObjectListModel _authorizations; + AirspaceFlightModel _flightList; + QDateTime _rangeStart; + QDateTime _rangeEnd; + airmap::FlightPlan _flightPlan; + QDateTime _flightStartTime; + int _flightDuration = 15 * 60; + + QList _importantFeatures; + + AirspaceAdvisoryProvider::AdvisoryColor _airspaceColor; + AirspaceFlightPlanProvider::PermitStatus _flightPermitStatus = AirspaceFlightPlanProvider::PermitNone; + +}; + diff --git a/src/Airmap/AirMapManager.cc b/src/Airmap/AirMapManager.cc new file mode 100644 index 0000000..8fc5580 --- /dev/null +++ b/src/Airmap/AirMapManager.cc @@ -0,0 +1,257 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#include "AirMapAdvisoryManager.h" +#include "AirMapFlightPlanManager.h" +#include "AirMapManager.h" +#include "AirMapRestrictionManager.h" +#include "AirMapRulesetsManager.h" +#include "AirMapSettings.h" +#include "AirMapTelemetry.h" +#include "AirMapTrafficMonitor.h" +#include "AirMapVehicleManager.h" +#include "AirMapWeatherInfoManager.h" + +#include "QmlObjectListModel.h" +#include "JsonHelper.h" +#include "SettingsManager.h" +#include "AppSettings.h" +#include "QGCQGeoCoordinate.h" +#include "QGCApplication.h" + +#include + +//-- Hardwired API key +#if defined(QGC_AIRMAP_KEY_AVAILABLE) +#include "Airmap_api_key.h" +#endif + +using namespace airmap; + +QGC_LOGGING_CATEGORY(AirMapManagerLog, "AirMapManagerLog") + +//----------------------------------------------------------------------------- +AirMapManager::AirMapManager(QGCApplication* app, QGCToolbox* toolbox) + : AirspaceManager(app, toolbox) + , _authStatus(Unknown) +{ + _logger = std::make_shared(); + services::register_types(); // TODO: still needed? + _logger->logging_category().setEnabled(QtDebugMsg, false); + _logger->logging_category().setEnabled(QtInfoMsg, false); + _logger->logging_category().setEnabled(QtWarningMsg, false); + _dispatchingLogger = std::make_shared(_logger); + connect(&_shared, &AirMapSharedState::error, this, &AirMapManager::_error); + connect(&_shared, &AirMapSharedState::authStatus, this, &AirMapManager::_authStatusChanged); +} + +//----------------------------------------------------------------------------- +AirMapManager::~AirMapManager() +{ + if (_shared.client()) { + delete _shared.client(); + } +} + +//----------------------------------------------------------------------------- +void +AirMapManager::setToolbox(QGCToolbox* toolbox) +{ + _settingsTimer.setSingleShot(true); + AirspaceManager::setToolbox(toolbox); + AirMapSettings* ap = toolbox->settingsManager()->airMapSettings(); + connect(ap->enableAirMap(), &Fact::rawValueChanged, this, &AirMapManager::_settingsChanged); + connect(ap->usePersonalApiKey(),&Fact::rawValueChanged, this, &AirMapManager::_settingsChanged); + connect(ap->apiKey(), &Fact::rawValueChanged, this, &AirMapManager::_settingsChanged); + connect(ap->clientID(), &Fact::rawValueChanged, this, &AirMapManager::_settingsChanged); + connect(ap->userName(), &Fact::rawValueChanged, this, &AirMapManager::_settingsChanged); + connect(ap->password(), &Fact::rawValueChanged, this, &AirMapManager::_settingsChanged); + connect(ap->enableAirspace(), &Fact::rawValueChanged, this, &AirMapManager::_airspaceEnabled); + connect(&_settingsTimer, &QTimer::timeout, this, &AirMapManager::_settingsTimeout); + _settingsTimeout(); +} + +//----------------------------------------------------------------------------- +bool +AirMapManager::connected() const +{ + return _shared.client() != nullptr; +} + +//----------------------------------------------------------------------------- +void +AirMapManager::_error(const QString& what, const QString& airmapdMessage, const QString& airmapdDetails) +{ + qCDebug(AirMapManagerLog) << "Error: "<showAppMessage(QString("Error: %1. %2").arg(what).arg(airmapdMessage)); +} + +//----------------------------------------------------------------------------- +void +AirMapManager::_authStatusChanged(AirspaceManager::AuthStatus status) +{ + _authStatus = status; + emit authStatusChanged(); +} + +//----------------------------------------------------------------------------- +void +AirMapManager::_settingsChanged() +{ + _settingsTimer.start(1000); +} + +//----------------------------------------------------------------------------- +void +AirMapManager::_airspaceEnabled() +{ + if(qgcApp()->toolbox()->settingsManager()->airMapSettings()->enableAirspace()->rawValue().toBool()) { + if(_airspaces) { + _airspaces->setROI(_roi, true); + } + } +} + +//----------------------------------------------------------------------------- +void +AirMapManager::_settingsTimeout() +{ + qCDebug(AirMapManagerLog) << "AirMap settings changed"; + _connectStatus.clear(); + emit connectStatusChanged(); + AirMapSettings* ap = _toolbox->settingsManager()->airMapSettings(); + //-- If we are disabled, there is nothing else to do. + if (!ap->enableAirMap()->rawValue().toBool()) { + _shared.logout(); + if(_shared.client()) { + delete _shared.client(); + _shared.setClient(nullptr); + emit connectedChanged(); + } + return; + } + AirMapSharedState::Settings settings; + if(ap->usePersonalApiKey()->rawValue().toBool()) { + settings.apiKey = ap->apiKey()->rawValueString(); + settings.clientID = ap->clientID()->rawValueString(); + } + //-- If we have a hardwired key (and no custom key is present), set it. +#if defined(QGC_AIRMAP_KEY_AVAILABLE) + if(!ap->usePersonalApiKey()->rawValue().toBool()) { + settings.apiKey = AirmapAPIKey(); + settings.clientID = AirmapClientID(); + } + bool authChanged = settings.apiKey != _shared.settings().apiKey || settings.apiKey.isEmpty(); +#else + bool authChanged = settings.apiKey != _shared.settings().apiKey; +#endif + settings.userName = ap->userName()->rawValueString(); + settings.password = ap->password()->rawValueString(); + if(settings.userName != _shared.settings().userName || settings.password != _shared.settings().password) { + authChanged = true; + } + _shared.setSettings(settings); + //-- Need to re-create the client if the API key or user name/password changed + if ((_shared.client() && authChanged) || !ap->enableAirMap()->rawValue().toBool()) { + delete _shared.client(); + _shared.setClient(nullptr); + emit connectedChanged(); + } + if (!_shared.client() && settings.apiKey != "") { + qCDebug(AirMapManagerLog) << "Creating AirMap client"; + auto credentials = Credentials{}; + credentials.api_key = _shared.settings().apiKey.toStdString(); + auto configuration = Client::default_production_configuration(credentials); + configuration.telemetry.host = _telemetryHost; + configuration.telemetry.port = _telemetryPort; + services::Client::create(configuration, _dispatchingLogger, this, [this](const services::Client::CreateResult& result) { + if (result) { + qCDebug(AirMapManagerLog) << "Successfully created airmap::services::Client instance"; + _shared.setClient(result.value()); + emit connectedChanged(); + _connectStatus = tr("AirMap Enabled"); + emit connectStatusChanged(); + //-- Now test authentication + _shared.login(); + } else { + qWarning("Failed to create airmap::services::Client instance"); + QString description = QString::fromStdString(result.error().description() ? result.error().description().get() : ""); + QString error = QString::fromStdString(result.error().message()); + _error(tr("Failed to create airmap::services::Client instance"), + error, description); + _connectStatus = error; + if(!description.isEmpty()) { + _connectStatus += "\n"; + _connectStatus += description; + } + emit connectStatusChanged(); + } + }); + } else { + if(settings.apiKey == "") { + _connectStatus = tr("No API key for AirMap"); + emit connectStatusChanged(); + qCDebug(AirMapManagerLog) << _connectStatus; + } + } +} + +//----------------------------------------------------------------------------- +AirspaceVehicleManager* +AirMapManager::instantiateVehicle(const Vehicle& vehicle) +{ + AirMapVehicleManager* manager = new AirMapVehicleManager(_shared, vehicle); + connect(manager, &AirMapVehicleManager::error, this, &AirMapManager::_error); + return manager; +} + +//----------------------------------------------------------------------------- +AirspaceRulesetsProvider* +AirMapManager::_instantiateRulesetsProvider() +{ + AirMapRulesetsManager* rulesetsManager = new AirMapRulesetsManager(_shared); + connect(rulesetsManager, &AirMapRulesetsManager::error, this, &AirMapManager::_error); + return rulesetsManager; +} + +//----------------------------------------------------------------------------- +AirspaceWeatherInfoProvider* +AirMapManager::_instatiateAirspaceWeatherInfoProvider() +{ + AirMapWeatherInfoManager* weatherInfo = new AirMapWeatherInfoManager(_shared); + connect(weatherInfo, &AirMapWeatherInfoManager::error, this, &AirMapManager::_error); + return weatherInfo; +} + +//----------------------------------------------------------------------------- +AirspaceAdvisoryProvider* +AirMapManager::_instatiateAirspaceAdvisoryProvider() +{ + AirMapAdvisoryManager* advisories = new AirMapAdvisoryManager(_shared); + connect(advisories, &AirMapAdvisoryManager::error, this, &AirMapManager::_error); + return advisories; +} + +//----------------------------------------------------------------------------- +AirspaceRestrictionProvider* +AirMapManager::_instantiateAirspaceRestrictionProvider() +{ + AirMapRestrictionManager* airspaces = new AirMapRestrictionManager(_shared); + connect(airspaces, &AirMapRestrictionManager::error, this, &AirMapManager::_error); + return airspaces; +} + +//----------------------------------------------------------------------------- +AirspaceFlightPlanProvider* +AirMapManager::_instantiateAirspaceFlightPlanProvider() +{ + AirMapFlightPlanManager* flightPlan = new AirMapFlightPlanManager(_shared); + connect(flightPlan, &AirMapFlightPlanManager::error, this, &AirMapManager::_error); + return flightPlan; +} diff --git a/src/Airmap/AirMapManager.h b/src/Airmap/AirMapManager.h new file mode 100644 index 0000000..80bd72c --- /dev/null +++ b/src/Airmap/AirMapManager.h @@ -0,0 +1,73 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#pragma once + +#include "AirMapSharedState.h" +#include "AirspaceManager.h" +#include "QGCLoggingCategory.h" + +#include +#include + +#include + +#include + +class QGCToolbox; + +Q_DECLARE_LOGGING_CATEGORY(AirMapManagerLog) + +//----------------------------------------------------------------------------- +/** + * @class AirMapManager + * AirMap implementation of AirspaceManager + */ + +class AirMapManager : public AirspaceManager +{ + Q_OBJECT +public: + AirMapManager(QGCApplication* app, QGCToolbox* toolbox); + virtual ~AirMapManager() override; + + void setToolbox (QGCToolbox* toolbox) override; + + QString providerName () const override { return QString("AirMap"); } + AirspaceVehicleManager* instantiateVehicle (const Vehicle& vehicle) override; + bool connected () const override; + QString connectStatus () const override { return _connectStatus; } + AirspaceManager::AuthStatus authStatus () const override { return _authStatus; } + +protected: + AirspaceRulesetsProvider* _instantiateRulesetsProvider () override; + AirspaceWeatherInfoProvider* _instatiateAirspaceWeatherInfoProvider () override; + AirspaceAdvisoryProvider* _instatiateAirspaceAdvisoryProvider () override; + AirspaceRestrictionProvider* _instantiateAirspaceRestrictionProvider () override; + AirspaceFlightPlanProvider* _instantiateAirspaceFlightPlanProvider () override; + +private slots: + void _error (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails); + void _settingsChanged (); + void _settingsTimeout (); + void _airspaceEnabled (); + void _authStatusChanged (AirspaceManager::AuthStatus status); + +private: + QString _connectStatus; + QTimer _settingsTimer; + AirMapSharedState _shared; + std::shared_ptr _logger; + std::shared_ptr _dispatchingLogger; + AirspaceManager::AuthStatus _authStatus; + const std::string _telemetryHost = "telemetry.airmap.com"; + const uint16_t _telemetryPort = 16060; +}; + + diff --git a/src/Airmap/AirMapRestrictionManager.cc b/src/Airmap/AirMapRestrictionManager.cc new file mode 100644 index 0000000..4d62914 --- /dev/null +++ b/src/Airmap/AirMapRestrictionManager.cc @@ -0,0 +1,234 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#include "AirMapRestrictionManager.h" +#include "AirMapManager.h" +#include "AirspaceRestriction.h" + +#include "QGCApplication.h" +#include "SettingsManager.h" + +#define RESTRICTION_UPDATE_DISTANCE 500 //-- 500m threshold for updates + +using namespace airmap; + +//----------------------------------------------------------------------------- +AirMapRestrictionManager::AirMapRestrictionManager(AirMapSharedState& shared) + : _shared(shared) +{ +} + +//----------------------------------------------------------------------------- +void +AirMapRestrictionManager::setROI(const QGCGeoBoundingCube& roi, bool reset) +{ + if(qgcApp()->toolbox()->settingsManager()->airMapSettings()->enableAirspace()->rawValue().toBool()) { + //-- If first time or we've moved more than RESTRICTION_UPDATE_DISTANCE, ask for updates. + if(reset || + (!_lastROI.isValid() || _lastROI.pointNW.distanceTo(roi.pointNW) > RESTRICTION_UPDATE_DISTANCE || _lastROI.pointSE.distanceTo(roi.pointSE) > RESTRICTION_UPDATE_DISTANCE) || + (_polygons.count() == 0 && _circles.count() == 0)) { + //-- Limit area of interest + qCDebug(AirMapManagerLog) << "ROI Area:" << roi.area() << "km^2"; + if(roi.area() < qgcApp()->toolbox()->airspaceManager()->maxAreaOfInterest()) { + _lastROI = roi; + _requestRestrictions(roi); + } else { + _polygons.clear(); + _circles.clear(); + } + } + } +} + + +//----------------------------------------------------------------------------- +void +AirMapRestrictionManager::_getColor(const Airspace& airspace, QColor& color, QColor& lineColor, float& lineWidth) +{ + if(airspace.type() == Airspace::Type::airport) { + color = QColor(246,165,23,50); + lineColor = QColor(246,165,23,255); + lineWidth = 2.0f; + } else if(airspace.type() == Airspace::Type::controlled_airspace) { + QString classification = QString::fromStdString(airspace.details_for_controlled_airspace().airspace_classification).toUpper(); + if(classification == "B") { + color = QColor(31,160,211,25); + lineColor = QColor(31,160,211,255); + lineWidth = 1.5f; + } else if(classification == "C") { + color = QColor(155,108,157,25); + lineColor = QColor(155,108,157,255); + lineWidth = 1.5f; + } else if(classification == "D") { + color = QColor(26,116,179,25); + lineColor = QColor(26,116,179,255); + lineWidth = 1.0f; + } else if(classification == "E") { + color = QColor(155,108,157,25); + lineColor = QColor(155,108,157,255); + lineWidth = 1.0f; + } else { + //-- Don't know it + qCWarning(AirMapManagerLog) << "Unknown airspace classification:" << QString::fromStdString(airspace.details_for_controlled_airspace().airspace_classification); + color = QColor(255,230,0,25); + lineColor = QColor(255,230,0,255); + lineWidth = 0.5f; + } + } else if(airspace.type() == Airspace::Type::special_use_airspace) { + color = QColor(27,90,207,38); + lineColor = QColor(27,90,207,255); + lineWidth = 1.0f; + } else if(airspace.type() == Airspace::Type::tfr) { + color = QColor(244,67,54,38); + lineColor = QColor(244,67,54,255); + lineWidth = 2.0f; + } else if(airspace.type() == Airspace::Type::wildfire) { + color = QColor(244,67,54,50); + lineColor = QColor(244,67,54,255); + lineWidth = 1.0f; + } else if(airspace.type() == Airspace::Type::park) { + color = QColor(224,18,18,25); + lineColor = QColor(224,18,18,255); + lineWidth = 1.0f; + } else if(airspace.type() == Airspace::Type::power_plant) { + color = QColor(246,165,23,25); + lineColor = QColor(246,165,23,255); + lineWidth = 1.0f; + } else if(airspace.type() == Airspace::Type::heliport) { + color = QColor(246,165,23,20); + lineColor = QColor(246,165,23,100); + lineWidth = 1.0f; + } else if(airspace.type() == Airspace::Type::prison) { + color = QColor(246,165,23,38); + lineColor = QColor(246,165,23,255); + lineWidth = 1.0f; + } else if(airspace.type() == Airspace::Type::school) { + color = QColor(246,165,23,38); + lineColor = QColor(246,165,23,255); + lineWidth = 1.0f; + } else if(airspace.type() == Airspace::Type::hospital) { + color = QColor(246,165,23,38); + lineColor = QColor(246,165,23,255); + lineWidth = 1.0f; + } else if(airspace.type() == Airspace::Type::fire) { + color = QColor(244,67,54,50); + lineColor = QColor(244,67,54,255); + lineWidth = 1.0f; + } else if(airspace.type() == Airspace::Type::emergency) { + color = QColor(246,113,23,77); + lineColor = QColor(246,113,23,255); + lineWidth = 1.0f; + } else { + //-- Don't know it + qCWarning(AirMapManagerLog) << "Unknown airspace type:" << static_cast(airspace.type()); + color = QColor(255,0,230,25); + lineColor = QColor(255,0,230,255); + lineWidth = 0.5f; + } +} + +//----------------------------------------------------------------------------- +void +AirMapRestrictionManager::_requestRestrictions(const QGCGeoBoundingCube& roi) +{ + if (!_shared.client()) { + qCDebug(AirMapManagerLog) << "No AirMap client instance. Not updating Airspace"; + return; + } + if (_state != State::Idle) { + qCWarning(AirMapManagerLog) << "AirMapRestrictionManager::updateROI: state not idle"; + return; + } + qCDebug(AirMapManagerLog) << "Restrictions Request (ROI Changed)"; + _polygons.clear(); + _circles.clear(); + _state = State::RetrieveItems; + Airspaces::Search::Parameters params; + params.full = false; + params.date_time = Clock::universal_time(); + //-- Geometry: Polygon + Geometry::Polygon polygon; + for (const auto& qcoord : roi.polygon2D()) { + Geometry::Coordinate coord; + coord.latitude = qcoord.latitude(); + coord.longitude = qcoord.longitude(); + polygon.outer_ring.coordinates.push_back(coord); + } + params.geometry = Geometry(polygon); + std::weak_ptr isAlive(_instance); + _shared.client()->airspaces().search(params, + [this, isAlive](const Airspaces::Search::Result& result) { + if (!isAlive.lock()) return; + if (_state != State::RetrieveItems) return; + if (result) { + const std::vector& airspaces = result.value(); + qCDebug(AirMapManagerLog)<<"Successful search. Items:" << airspaces.size(); + for (const auto& airspace : airspaces) { + QColor color; + QColor lineColor; + float lineWidth; + _getColor(airspace, color, lineColor, lineWidth); + const Geometry& geometry = airspace.geometry(); + switch(geometry.type()) { + case Geometry::Type::polygon: { + const Geometry::Polygon& polygon = geometry.details_for_polygon(); + _addPolygonToList(polygon, QString::fromStdString(airspace.id()), color, lineColor, lineWidth); + } + break; + case Geometry::Type::multi_polygon: { + const Geometry::MultiPolygon& multiPolygon = geometry.details_for_multi_polygon(); + for (const auto& polygon : multiPolygon) { + _addPolygonToList(polygon, QString::fromStdString(airspace.id()), color, lineColor, lineWidth); + } + } + break; + case Geometry::Type::point: { + const Geometry::Point& point = geometry.details_for_point(); + _circles.append(new AirspaceCircularRestriction(QGeoCoordinate(point.latitude, point.longitude), 0., QString::fromStdString(airspace.id()), color, lineColor, lineWidth)); + // TODO: radius??? + } + break; + case Geometry::Type::invalid: { + qWarning() << "Invalid geometry type"; + } + break; + default: + qWarning() << "Unsupported geometry type: " << static_cast(geometry.type()); + break; + } + } + } else { + QString description = QString::fromStdString(result.error().description() ? result.error().description().get() : ""); + emit error("Failed to retrieve Geofences", + QString::fromStdString(result.error().message()), description); + } + _state = State::Idle; + }); +} + +//----------------------------------------------------------------------------- +void +AirMapRestrictionManager::_addPolygonToList(const airmap::Geometry::Polygon& polygon, const QString advisoryID, const QColor color, const QColor lineColor, float lineWidth) +{ + QVariantList polygonArray; + for (const auto& vertex : polygon.outer_ring.coordinates) { + QGeoCoordinate coord; + if (vertex.altitude) { + coord = QGeoCoordinate(vertex.latitude, vertex.longitude, vertex.altitude.get()); + } else { + coord = QGeoCoordinate(vertex.latitude, vertex.longitude); + } + polygonArray.append(QVariant::fromValue(coord)); + } + _polygons.append(new AirspacePolygonRestriction(polygonArray, advisoryID, color, lineColor, lineWidth)); + if (polygon.inner_rings.size() > 0) { + // no need to support those (they are rare, and in most cases, there's a more restrictive polygon filling the hole) + qCDebug(AirMapManagerLog) << "Polygon with holes. Size: "< + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#pragma once + +#include "LifetimeChecker.h" +#include "AirspaceRestrictionProvider.h" +#include "AirMapSharedState.h" +#include "QGCGeoBoundingCube.h" + +#include +#include + +#include "airmap/geometry.h" +#include "airmap/airspaces.h" + +/** + * @file AirMapRestrictionManager.h + * Class to download polygons from AirMap + */ + +class AirMapRestrictionManager : public AirspaceRestrictionProvider, public LifetimeChecker +{ + Q_OBJECT +public: + AirMapRestrictionManager (AirMapSharedState& shared); + QmlObjectListModel* polygons () override { return &_polygons; } + QmlObjectListModel* circles () override { return &_circles; } + void setROI (const QGCGeoBoundingCube &roi, bool reset = false) override; + +signals: + void error (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails); + +private: + void _requestRestrictions(const QGCGeoBoundingCube& roi); + void _addPolygonToList (const airmap::Geometry::Polygon& polygon, const QString advisoryID, const QColor color, const QColor lineColor, float lineWidth); + void _getColor (const airmap::Airspace& airspace, QColor &color, QColor &lineColor, float &lineWidth); + + enum class State { + Idle, + RetrieveItems, + }; + + AirMapSharedState& _shared; + QGCGeoBoundingCube _lastROI; + State _state = State::Idle; + QmlObjectListModel _polygons; + QmlObjectListModel _circles; +}; + diff --git a/src/Airmap/AirMapRulesetsManager.cc b/src/Airmap/AirMapRulesetsManager.cc new file mode 100644 index 0000000..3361337 --- /dev/null +++ b/src/Airmap/AirMapRulesetsManager.cc @@ -0,0 +1,388 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#include "AirspaceFlightPlanProvider.h" +#include "AirMapRulesetsManager.h" +#include "AirMapManager.h" +#include "QGCApplication.h" +#include + +using namespace airmap; + +static const char* kAirMapFeatureGroup = "AirMapFeatureGroup"; + +//----------------------------------------------------------------------------- +AirMapRuleFeature::AirMapRuleFeature(QObject* parent) + : AirspaceRuleFeature(parent) +{ +} + +//----------------------------------------------------------------------------- +AirMapRuleFeature::AirMapRuleFeature(airmap::RuleSet::Feature feature, QObject* parent) + : AirspaceRuleFeature(parent) + , _feature(feature) +{ + //-- Restore persisted value (if it exists) + QSettings settings; + settings.beginGroup(kAirMapFeatureGroup); + switch(_feature.type) { + case RuleSet::Feature::Type::boolean: + //-- For boolean, we have 3 states: 0 - false, 1 - true and 2 - not set + _value = settings.value(name(), 2); + break;; + case RuleSet::Feature::Type::floating_point: + _value = settings.value(name(), NAN); + break;; + case RuleSet::Feature::Type::string: + _value = settings.value(name(), QString()); + break;; + default: + break; + } + settings.endGroup(); +} + +//----------------------------------------------------------------------------- +QVariant +AirMapRuleFeature::value() +{ + //qCDebug(AirMapManagerLog) << "Value of" << name() << "==>" << _value << type(); + return _value; +} + +//----------------------------------------------------------------------------- +AirspaceRuleFeature::Type +AirMapRuleFeature::type() +{ + switch(_feature.type) { + case RuleSet::Feature::Type::boolean: + return AirspaceRuleFeature::Boolean; + case RuleSet::Feature::Type::floating_point: + return AirspaceRuleFeature::Float; + case RuleSet::Feature::Type::string: + return AirspaceRuleFeature::String; + default: + break; + } + return AirspaceRuleFeature::Unknown; +} + +//----------------------------------------------------------------------------- +AirspaceRuleFeature::Unit +AirMapRuleFeature::unit() +{ + switch(_feature.unit) { + case RuleSet::Feature::Unit::kilograms: + return AirspaceRuleFeature::Kilogram; + case RuleSet::Feature::Unit::meters: + return AirspaceRuleFeature::Meters; + case RuleSet::Feature::Unit::meters_per_sec: + return AirspaceRuleFeature::MetersPerSecond; + default: + break; + } + return AirspaceRuleFeature::UnknownUnit; +} + +//----------------------------------------------------------------------------- +AirspaceRuleFeature::Measurement +AirMapRuleFeature::measurement() +{ + switch(_feature.measurement) { + case RuleSet::Feature::Measurement::speed: + return AirspaceRuleFeature::Speed; + case RuleSet::Feature::Measurement::weight: + return AirspaceRuleFeature::Weight; + case RuleSet::Feature::Measurement::distance: + return AirspaceRuleFeature::Distance; + default: + break; + } + return AirspaceRuleFeature::UnknownMeasurement; +} + +//----------------------------------------------------------------------------- +void +AirMapRuleFeature::setValue(const QVariant val) +{ + switch(_feature.type) { + case RuleSet::Feature::Type::boolean: + if(val.toInt() != 0 && val.toInt() != 1) { + return; + } + break; + case RuleSet::Feature::Type::floating_point: + if(!std::isfinite(val.toDouble())) { + return; + } + break;; + case RuleSet::Feature::Type::string: + if(val.toString().isEmpty()) { + return; + } + break;; + default: + return; + } + _value = val; + //-- Make value persistent + QSettings settings; + settings.beginGroup(kAirMapFeatureGroup); + settings.setValue(name(), _value); + settings.endGroup(); + emit valueChanged(); + qgcApp()->toolbox()->airspaceManager()->flightPlan()->setDirty(true); +} + +//----------------------------------------------------------------------------- +AirMapRule::AirMapRule(QObject* parent) + : AirspaceRule(parent) +{ +} + +//----------------------------------------------------------------------------- +AirMapRule::AirMapRule(const airmap::RuleSet::Rule& rule, QObject* parent) + : AirspaceRule(parent) + , _rule(rule) +{ +} + +//----------------------------------------------------------------------------- +AirMapRule::~AirMapRule() +{ + _features.deleteListAndContents(); +} + +//----------------------------------------------------------------------------- +AirspaceRule::Status +AirMapRule::status() +{ + switch(_rule.status) { + case RuleSet::Rule::Status::conflicting: + return AirspaceRule::Conflicting; + case RuleSet::Rule::Status::not_conflicting: + return AirspaceRule::NotConflicting; + case RuleSet::Rule::Status::missing_info: + return AirspaceRule::MissingInfo; + case RuleSet::Rule::Status::unknown: + default: + return AirspaceRule::Unknown; + } +} + +//----------------------------------------------------------------------------- +AirMapRuleSet::AirMapRuleSet(QObject* parent) + : AirspaceRuleSet(parent) + , _isDefault(false) + , _selected(false) + , _selectionType(AirspaceRuleSet::Optional) +{ +} + +//----------------------------------------------------------------------------- +AirMapRuleSet::~AirMapRuleSet() +{ + _rules.deleteListAndContents(); +} + +//----------------------------------------------------------------------------- +void +AirMapRuleSet::setSelected(bool sel) +{ + if(_selectionType != AirspaceRuleSet::Required) { + if(_selected != sel) { + _selected = sel; + emit selectedChanged(); + } + } else { + if(!_selected) { + _selected = true; + emit selectedChanged(); + } + } +} + +//----------------------------------------------------------------------------- +AirMapRulesetsManager::AirMapRulesetsManager(AirMapSharedState& shared) + : _shared(shared) +{ +} + +//----------------------------------------------------------------------------- +static bool +rules_sort(QObject* a, QObject* b) +{ + AirMapRule* aa = qobject_cast(a); + AirMapRule* bb = qobject_cast(b); + if(!aa || !bb) return false; + return static_cast(aa->order()) > static_cast(bb->order()); +} + +//----------------------------------------------------------------------------- +void AirMapRulesetsManager::setROI(const QGCGeoBoundingCube& roi, bool reset) +{ + Q_UNUSED(reset); + if (!_shared.client()) { + qCDebug(AirMapManagerLog) << "No AirMap client instance. Not updating Airspace"; + return; + } + if (_state != State::Idle) { + qCWarning(AirMapManagerLog) << "AirMapRulesetsManager::updateROI: state not idle"; + return; + } + qCDebug(AirMapManagerLog) << "Rulesets Request (ROI Changed)"; + _valid = false; + //-- Save current selection state + QMap selectionSet; + for(int rs = 0; rs < ruleSets()->count(); rs++) { + AirMapRuleSet* ruleSet = qobject_cast(ruleSets()->get(rs)); + selectionSet[ruleSet->id()] = ruleSet->selected(); + } + _ruleSets.clearAndDeleteContents(); + _state = State::RetrieveItems; + RuleSets::Search::Parameters params; + params.authorization = _shared.loginToken().toStdString(); + //-- Geometry: Polygon + Geometry::Polygon polygon; + //-- Get ROI bounding box, clipping to max area of interest + for (const auto& qcoord : roi.polygon2D(qgcApp()->toolbox()->airspaceManager()->maxAreaOfInterest())) { + Geometry::Coordinate coord; + coord.latitude = qcoord.latitude(); + coord.longitude = qcoord.longitude(); + polygon.outer_ring.coordinates.push_back(coord); + } + params.geometry = Geometry(polygon); + std::weak_ptr isAlive(_instance); + _shared.client()->rulesets().search(params, + [this, isAlive, selectionSet](const RuleSets::Search::Result& result) { + if (!isAlive.lock()) return; + if (_state != State::RetrieveItems) return; + if (result) { + const std::vector rulesets = result.value(); + qCDebug(AirMapManagerLog) << "Successful rulesets search. Items:" << rulesets.size(); + for (const auto& ruleset : rulesets) { + AirMapRuleSet* pRuleSet = new AirMapRuleSet(this); + connect(pRuleSet, &AirspaceRuleSet::selectedChanged, this, &AirMapRulesetsManager::_selectedChanged); + pRuleSet->_id = QString::fromStdString(ruleset.id); + pRuleSet->_name = QString::fromStdString(ruleset.name); + pRuleSet->_shortName = QString::fromStdString(ruleset.short_name); + pRuleSet->_description = QString::fromStdString(ruleset.description); + pRuleSet->_isDefault = ruleset.is_default; + //-- Restore selection set (if any) + if(selectionSet.contains(pRuleSet->id())) { + pRuleSet->_selected = selectionSet[pRuleSet->id()]; + } else { + if(pRuleSet->_isDefault) { + pRuleSet->_selected = true; + } + } + switch(ruleset.selection_type) { + case RuleSet::SelectionType::pickone: + pRuleSet->_selectionType = AirspaceRuleSet::Pickone; + break; + case RuleSet::SelectionType::required: + pRuleSet->_selectionType = AirspaceRuleSet::Required; + pRuleSet->_selected = true; + break; + case RuleSet::SelectionType::optional: + pRuleSet->_selectionType = AirspaceRuleSet::Optional; + break; + } + //-- Iterate Rules + for (const auto& rule : ruleset.rules) { + AirMapRule* pRule = new AirMapRule(rule, this); + //-- Iterate Rule Features + for (const auto& feature : rule.features) { + AirMapRuleFeature* pFeature = new AirMapRuleFeature(feature, this); + pRule->_features.append(pFeature); + } + pRuleSet->_rules.append(pRule); + } + //-- Sort rules by display order + std::sort(pRuleSet->_rules.objectList()->begin(), pRuleSet->_rules.objectList()->end(), rules_sort); + _ruleSets.append(pRuleSet); + qCDebug(AirMapManagerLog) << "Adding ruleset" << pRuleSet->name(); + /* + qDebug() << "------------------------------------------"; + qDebug() << "Jurisdiction:" << ruleset.jurisdiction.name.data() << (int)ruleset.jurisdiction.region; + qDebug() << "Name: " << ruleset.name.data(); + qDebug() << "Short Name: " << ruleset.short_name.data(); + qDebug() << "Description: " << ruleset.description.data(); + qDebug() << "Is default: " << ruleset.is_default; + qDebug() << "Applicable to these airspace types:"; + for (const auto& airspaceType : ruleset.airspace_types) { + qDebug() << " " << airspaceType.data(); + } + qDebug() << "Rules:"; + for (const auto& rule : ruleset.rules) { + qDebug() << " --------------------------------------"; + qDebug() << " short_text: " << rule.short_text.data(); + qDebug() << " description: " << rule.description.data(); + qDebug() << " display_order:" << rule.display_order; + qDebug() << " status: " << (int)rule.status; + qDebug() << " ------------------------------"; + qDebug() << " Features:"; + for (const auto& feature : rule.features) { + qDebug() << " name: " << feature.name.data(); + qDebug() << " description:" << feature.description.data(); + qDebug() << " status: " << (int)feature.status; + qDebug() << " type: " << (int)feature.type; + qDebug() << " measurement:" << (int)feature.measurement; + qDebug() << " unit: " << (int)feature.unit; + } + } + */ + } + _valid = true; + } else { + QString description = QString::fromStdString(result.error().description() ? result.error().description().get() : ""); + emit error("Failed to retrieve RuleSets", QString::fromStdString(result.error().message()), description); + } + _state = State::Idle; + emit ruleSetsChanged(); + emit selectedRuleSetsChanged(); + }); +} + +//----------------------------------------------------------------------------- +QString +AirMapRulesetsManager::selectedRuleSets() +{ + QString selection; + for(int i = 0; i < _ruleSets.count(); i++) { + AirMapRuleSet* rule = qobject_cast(_ruleSets.get(i)); + if(rule && rule->selected()) { + selection += rule->shortName() + ", "; + } + } + int idx = selection.lastIndexOf(", "); + if(idx >= 0) { + selection = selection.left(idx); + } + return selection; +} + +//----------------------------------------------------------------------------- +void +AirMapRulesetsManager::_selectedChanged() +{ + emit selectedRuleSetsChanged(); + //-- TODO: Do whatever it is you do to select a rule +} + +//----------------------------------------------------------------------------- +void +AirMapRulesetsManager::clearAllFeatures() +{ + QSettings settings; + settings.beginGroup(kAirMapFeatureGroup); + settings.remove(""); + settings.endGroup(); +} + diff --git a/src/Airmap/AirMapRulesetsManager.h b/src/Airmap/AirMapRulesetsManager.h new file mode 100644 index 0000000..eb1375e --- /dev/null +++ b/src/Airmap/AirMapRulesetsManager.h @@ -0,0 +1,132 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#pragma once + +#include "LifetimeChecker.h" +#include "AirspaceRulesetsProvider.h" +#include "AirMapSharedState.h" +#include "QGCGeoBoundingCube.h" + +#include +#include + +#include + +/** + * @file AirMapRulesetsManager.h + * Class to download rulesets from AirMap + */ + +//----------------------------------------------------------------------------- +class AirMapRuleFeature : public AirspaceRuleFeature +{ + Q_OBJECT +public: + + AirMapRuleFeature(QObject* parent = nullptr); + AirMapRuleFeature(airmap::RuleSet::Feature feature, QObject* parent = nullptr); + + quint32 id () override { return static_cast(_feature.id); } + Type type () override; + Unit unit () override; + Measurement measurement () override; + QString name () override { return QString::fromStdString(_feature.name); } + QString description () override { return QString::fromStdString(_feature.description); } + QVariant value () override; + void setValue (const QVariant val) override; +private: + airmap::RuleSet::Feature _feature; + QVariant _value; +}; + +//----------------------------------------------------------------------------- +class AirMapRule : public AirspaceRule +{ + Q_OBJECT + friend class AirMapRulesetsManager; + friend class AirMapFlightPlanManager; +public: + + AirMapRule (QObject* parent = nullptr); + AirMapRule (const airmap::RuleSet::Rule& rule, QObject* parent = nullptr); + ~AirMapRule () override; + + int order () { return static_cast(_rule.display_order); } + Status status () override; + QString shortText () override { return QString::fromStdString(_rule.short_text); } + QString description () override { return QString::fromStdString(_rule.description); } + QmlObjectListModel* features () override { return &_features; } + +private: + airmap::RuleSet::Rule _rule; + QmlObjectListModel _features; +}; + +//----------------------------------------------------------------------------- +class AirMapRuleSet : public AirspaceRuleSet +{ + Q_OBJECT + friend class AirMapRulesetsManager; + friend class AirMapFlightPlanManager; +public: + AirMapRuleSet (QObject* parent = nullptr); + ~AirMapRuleSet () override; + QString id () override { return _id; } + QString description () override { return _description; } + bool isDefault () override { return _isDefault; } + QString name () override { return _name; } + QString shortName () override { return _shortName; } + SelectionType selectionType () override { return _selectionType; } + bool selected () override { return _selected; } + void setSelected (bool sel) override; + QmlObjectListModel* rules () override { return &_rules; } +private: + QString _id; + QString _description; + bool _isDefault; + bool _selected; + QString _name; + QString _shortName; + SelectionType _selectionType; + QmlObjectListModel _rules; +}; + +//----------------------------------------------------------------------------- +class AirMapRulesetsManager : public AirspaceRulesetsProvider, public LifetimeChecker +{ + Q_OBJECT +public: + AirMapRulesetsManager (AirMapSharedState& shared); + + bool valid () override { return _valid; } + QmlObjectListModel* ruleSets () override { return &_ruleSets; } + QString selectedRuleSets() override; + + void setROI (const QGCGeoBoundingCube& roi, bool reset = false) override; + void clearAllFeatures() override; + +signals: + void error (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails); + +private slots: + void _selectedChanged (); + +private: + enum class State { + Idle, + RetrieveItems, + }; + bool _valid; + State _state = State::Idle; + AirMapSharedState& _shared; + QmlObjectListModel _ruleSets; //-- List of AirMapRuleSet elements +}; + + diff --git a/src/Airmap/AirMapSettings.cc b/src/Airmap/AirMapSettings.cc new file mode 100644 index 0000000..61f17b6 --- /dev/null +++ b/src/Airmap/AirMapSettings.cc @@ -0,0 +1,28 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#include "AirMapSettings.h" +#include "QGCApplication.h" + +#include +#include + +DECLARE_SETTINGGROUP(AirMap, "AirMap") +{ + qmlRegisterUncreatableType("QGroundControl.SettingsManager", 1, 0, "AirMapSettings", "Reference only"); +} + +DECLARE_SETTINGSFACT(AirMapSettings, usePersonalApiKey) +DECLARE_SETTINGSFACT(AirMapSettings, apiKey) +DECLARE_SETTINGSFACT(AirMapSettings, clientID) +DECLARE_SETTINGSFACT(AirMapSettings, userName) +DECLARE_SETTINGSFACT(AirMapSettings, password) +DECLARE_SETTINGSFACT(AirMapSettings, enableAirMap) +DECLARE_SETTINGSFACT(AirMapSettings, enableAirspace) +DECLARE_SETTINGSFACT(AirMapSettings, enableTelemetry) diff --git a/src/Airmap/AirMapSettings.h b/src/Airmap/AirMapSettings.h new file mode 100644 index 0000000..2e5e3b8 --- /dev/null +++ b/src/Airmap/AirMapSettings.h @@ -0,0 +1,31 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#pragma once + +#include "SettingsGroup.h" + +class AirMapSettings : public SettingsGroup +{ + Q_OBJECT +public: + AirMapSettings(QObject* parent = nullptr); + + DEFINE_SETTING_NAME_GROUP() + + DEFINE_SETTINGFACT(usePersonalApiKey) + DEFINE_SETTINGFACT(apiKey) + DEFINE_SETTINGFACT(clientID) + DEFINE_SETTINGFACT(userName) + DEFINE_SETTINGFACT(password) + DEFINE_SETTINGFACT(enableAirMap) + DEFINE_SETTINGFACT(enableAirspace) + DEFINE_SETTINGFACT(enableTelemetry) + +}; diff --git a/src/Airmap/AirMapSharedState.cc b/src/Airmap/AirMapSharedState.cc new file mode 100644 index 0000000..87033c2 --- /dev/null +++ b/src/Airmap/AirMapSharedState.cc @@ -0,0 +1,124 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#include "AirMapSharedState.h" +#include "AirMapManager.h" + +#include "airmap/authenticator.h" +#include "qjsonwebtoken.h" + +using namespace airmap; + +void +AirMapSharedState::setSettings(const Settings& settings) +{ + logout(); + _settings = settings; +} + +void +AirMapSharedState::doRequestWithLogin(const Callback& callback) +{ + if (isLoggedIn()) { + callback(_loginToken); + } else { + login(); + _pendingRequests.enqueue(callback); + } +} + +//-- TODO: +// For now, only anonymous login collects the (anonymous) pilot ID within login() +// For autheticated logins, we need to collect it here as opposed to spread all over +// the place as it is the case now. + +void +AirMapSharedState::login() +{ + if (isLoggedIn() || _isLoginInProgress) { + return; + } + _isLoginInProgress = true; + if (_settings.userName == "") { //use anonymous login + qCDebug(AirMapManagerLog) << "Anonymous authentication"; + Authenticator::AuthenticateAnonymously::Params params; + params.id = "Anonymous"; + _client->authenticator().authenticate_anonymously(params, + [this](const Authenticator::AuthenticateAnonymously::Result& result) { + if (!_isLoginInProgress) { // was logout() called in the meanwhile? + return; + } + if (result) { + qCDebug(AirMapManagerLog) << "Successfully authenticated with AirMap: id="<< result.value().id.c_str(); + emit authStatus(AirspaceManager::AuthStatus::Anonymous); + _loginToken = QString::fromStdString(result.value().id); + QJsonWebToken token = QJsonWebToken::fromTokenAndSecret(_loginToken, QString()); + QJsonDocument doc = token.getPayloadJDoc(); + QJsonObject json = doc.object(); + _pilotID = json.value("sub").toString(); + qCDebug(AirMapManagerLog) << "Anonymous pilot id:" << _pilotID; + _processPendingRequests(); + } else { + _pendingRequests.clear(); + emit authStatus(AirspaceManager::AuthStatus::Error); + QString description = QString::fromStdString(result.error().description() ? result.error().description().get() : ""); + emit error("Failed to authenticate with AirMap", + QString::fromStdString(result.error().message()), description); + } + }); + } else { + Authenticator::AuthenticateWithPassword::Params params; + params.oauth.username = _settings.userName.toStdString(); + params.oauth.password = _settings.password.toStdString(); + params.oauth.client_id = _settings.clientID.toStdString(); + params.oauth.device_id = "QGroundControl"; + qCDebug(AirMapManagerLog) << "User authentication" << _settings.userName; + _client->authenticator().authenticate_with_password(params, + [this](const Authenticator::AuthenticateWithPassword::Result& result) { + if (!_isLoginInProgress) { // was logout() called in the meanwhile? + return; + } + if (result) { + qCDebug(AirMapManagerLog) << "Successfully authenticated with AirMap: id="<< result.value().id.c_str()<<", access=" + < + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#pragma once + +#include +#include + +#include "AirspaceManager.h" + +#include + +/** + * @class AirMapSharedState + * Contains state & settings that need to be shared (such as login) + */ + +class AirMapSharedState : public QObject +{ + Q_OBJECT +public: + struct Settings { + QString apiKey; + // login credentials + QString clientID; + QString userName; ///< use anonymous login if empty + QString password; + }; + + void setSettings (const Settings& settings); + const Settings& settings () const { return _settings; } + void setClient (airmap::services::Client* client) { _client = client; } + + QString pilotID () { return _pilotID; } + void setPilotID (const QString& pilotID) { _pilotID = pilotID; } + + /** + * Get the current client instance. It can be NULL. If not NULL, it implies + * there's an API key set. + */ + airmap::services::Client* client () const { return _client; } + bool hasAPIKey () const { return _settings.apiKey != ""; } + bool isLoggedIn () const { return _loginToken != ""; } + + using Callback = std::function; + + /** + * Do a request that requires user login: if not yet logged in, the request is queued and + * processed after successful login, otherwise it's executed directly. + */ + void doRequestWithLogin (const Callback& callback); + void login (); + void logout (); + const QString& loginToken () const { return _loginToken; } + +signals: + void error (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails); + void authStatus (AirspaceManager::AuthStatus status); + +private: + void _processPendingRequests (); + +private: + bool _isLoginInProgress = false; + QString _loginToken; ///< login token: empty when not logged in + QString _pilotID; + airmap::services::Client* _client = nullptr; + Settings _settings; + QQueue _pendingRequests; ///< pending requests that are processed after a successful login +}; + diff --git a/src/Airmap/AirMapTelemetry.cc b/src/Airmap/AirMapTelemetry.cc new file mode 100644 index 0000000..8e66781 --- /dev/null +++ b/src/Airmap/AirMapTelemetry.cc @@ -0,0 +1,156 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#include "AirMapTelemetry.h" +#include "AirMapManager.h" + +#include "QGCMAVLink.h" + +#include "airmap/telemetry.h" +#include "airmap/flights.h" + +using namespace airmap; + +//----------------------------------------------------------------------------- +AirMapTelemetry::AirMapTelemetry(AirMapSharedState& shared) + : _shared(shared) +{ +} + +//----------------------------------------------------------------------------- +void +AirMapTelemetry::vehicleMessageReceived(const mavlink_message_t& message) +{ + switch (message.msgid) { + case MAVLINK_MSG_ID_GLOBAL_POSITION_INT: + _handleGlobalPositionInt(message); + break; + case MAVLINK_MSG_ID_GPS_RAW_INT: + _handleGPSRawInt(message); + break; + } +} + +//----------------------------------------------------------------------------- +bool +AirMapTelemetry::isTelemetryStreaming() +{ + return _state == State::Streaming; +} + +//----------------------------------------------------------------------------- +void +AirMapTelemetry::_handleGPSRawInt(const mavlink_message_t& message) +{ + if (!isTelemetryStreaming()) { + return; + } + mavlink_gps_raw_int_t gps_raw; + mavlink_msg_gps_raw_int_decode(&message, &gps_raw); + if (gps_raw.eph == UINT16_MAX) { + _lastHdop = 1.f; + } else { + _lastHdop = gps_raw.eph / 100.f; + } +} + +//----------------------------------------------------------------------------- +void +AirMapTelemetry::_handleGlobalPositionInt(const mavlink_message_t& message) +{ + if (!isTelemetryStreaming()) { + return; + } + // rate-limit updates to 5 Hz + if (!_timerLastSent.hasExpired(200)) { + return; + } + _timerLastSent.restart(); + + mavlink_global_position_int_t globalPosition; + mavlink_msg_global_position_int_decode(&message, &globalPosition); + Telemetry::Position position{ + milliseconds_since_epoch(Clock::universal_time()), + static_cast(globalPosition.lat / 1e7), + static_cast(globalPosition.lon / 1e7), + static_cast(globalPosition.alt) / 1000.0, + static_cast(globalPosition.relative_alt) / 1000.0, + static_cast(_lastHdop) + }; + Telemetry::Speed speed{ + milliseconds_since_epoch(Clock::universal_time()), + globalPosition.vx / 100.f, + globalPosition.vy / 100.f, + globalPosition.vz / 100.f + }; + + //qCDebug(AirMapManagerLog) << "Telemetry:" << globalPosition.lat / 1e7 << globalPosition.lon / 1e7; + Flight flight; + flight.id = _flightID.toStdString(); + _shared.client()->telemetry().submit_updates(flight, _key, + {Telemetry::Update{position}, Telemetry::Update{speed}}); +} + +//----------------------------------------------------------------------------- +void +AirMapTelemetry::startTelemetryStream(const QString& flightID) +{ + if (_state != State::Idle) { + qCWarning(AirMapManagerLog) << "Not starting telemetry: not in idle state:" << static_cast(_state); + return; + } + if(flightID.isEmpty()) { + qCWarning(AirMapManagerLog) << "Not starting telemetry: No flight ID."; + return; + } + qCInfo(AirMapManagerLog) << "Starting Telemetry stream with flightID" << flightID; + _state = State::StartCommunication; + _flightID = flightID; + Flights::StartFlightCommunications::Parameters params; + params.authorization = _shared.loginToken().toStdString(); + params.id = _flightID.toStdString(); + std::weak_ptr isAlive(_instance); + _shared.client()->flights().start_flight_communications(params, [this, isAlive](const Flights::StartFlightCommunications::Result& result) { + if (!isAlive.lock()) return; + if (_state != State::StartCommunication) return; + if (result) { + _key = result.value().key; + _state = State::Streaming; + } else { + _state = State::Idle; + QString description = QString::fromStdString(result.error().description() ? result.error().description().get() : ""); + emit error("Failed to start telemetry streaming", + QString::fromStdString(result.error().message()), description); + } + }); + _timerLastSent.start(); +} + +//----------------------------------------------------------------------------- +void +AirMapTelemetry::stopTelemetryStream() +{ + if (_state == State::Idle) { + return; + } + qCInfo(AirMapManagerLog) << "Stopping Telemetry stream with flightID" << _flightID; + _state = State::EndCommunication; + Flights::EndFlightCommunications::Parameters params; + params.authorization = _shared.loginToken().toStdString(); + params.id = _flightID.toStdString(); + std::weak_ptr isAlive(_instance); + _shared.client()->flights().end_flight_communications(params, [this, isAlive](const Flights::EndFlightCommunications::Result& result) { + Q_UNUSED(result); + if (!isAlive.lock()) return; + if (_state != State::EndCommunication) return; + _key = ""; + _state = State::Idle; + }); +} + diff --git a/src/Airmap/AirMapTelemetry.h b/src/Airmap/AirMapTelemetry.h new file mode 100644 index 0000000..2a1663f --- /dev/null +++ b/src/Airmap/AirMapTelemetry.h @@ -0,0 +1,57 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#pragma once + +#include "LifetimeChecker.h" +#include "AirMapSharedState.h" + +#include + +#include +#include + +/// Class to send telemetry data to AirMap +class AirMapTelemetry : public QObject, public LifetimeChecker +{ + Q_OBJECT +public: + AirMapTelemetry (AirMapSharedState& shared); + virtual ~AirMapTelemetry () = default; + + void startTelemetryStream (const QString& flightID); + void stopTelemetryStream (); + bool isTelemetryStreaming (); + +signals: + void error (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails); + +public slots: + void vehicleMessageReceived (const mavlink_message_t& message); + +private: + + void _handleGlobalPositionInt (const mavlink_message_t& message); + void _handleGPSRawInt (const mavlink_message_t& message); + + enum class State { + Idle, + StartCommunication, + EndCommunication, + Streaming, + }; + + State _state = State::Idle; + AirMapSharedState& _shared; + std::string _key; ///< key for AES encryption (16 bytes) + QString _flightID; + float _lastHdop = 1.f; + QElapsedTimer _timerLastSent; +}; + diff --git a/src/Airmap/AirMapTrafficMonitor.cc b/src/Airmap/AirMapTrafficMonitor.cc new file mode 100644 index 0000000..6c7ddfa --- /dev/null +++ b/src/Airmap/AirMapTrafficMonitor.cc @@ -0,0 +1,79 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#include "AirMapTrafficMonitor.h" +#include "AirMapManager.h" + +using namespace airmap; + +//----------------------------------------------------------------------------- +AirMapTrafficMonitor::AirMapTrafficMonitor(AirMapSharedState& shared) + : _shared(shared) +{ +} + +//----------------------------------------------------------------------------- +AirMapTrafficMonitor::~AirMapTrafficMonitor() +{ + stop(); +} + +//----------------------------------------------------------------------------- +void +AirMapTrafficMonitor::startConnection(const QString& flightID) +{ + if(flightID.isEmpty() || _flightID == flightID) { + return; + } + _flightID = flightID; + qCDebug(AirMapManagerLog) << "Traffic update started for" << flightID; + std::weak_ptr isAlive(_instance); + auto handler = [this, isAlive](const Traffic::Monitor::Result& result) { + if (!isAlive.lock()) return; + if (result) { + _monitor = result.value(); + _subscriber = std::make_shared( + std::bind(&AirMapTrafficMonitor::_update, this, std::placeholders::_1, std::placeholders::_2)); + _monitor->subscribe(_subscriber); + } else { + QString description = QString::fromStdString(result.error().description() ? result.error().description().get() : ""); + emit error("Failed to start Traffic Monitoring", + QString::fromStdString(result.error().message()), description); + } + }; + Traffic::Monitor::Params params{flightID.toStdString(), _shared.loginToken().toStdString()}; + _shared.client()->traffic().monitor(params, handler); +} + +//----------------------------------------------------------------------------- +void +AirMapTrafficMonitor::_update(Traffic::Update::Type type, const std::vector& update) +{ + qCDebug(AirMapManagerLog) << "Traffic update with" << update.size() << "elements"; + if (type != Traffic::Update::Type::situational_awareness) + return; // currently we're only interested in situational awareness + for (const auto& traffic : update) { + QString traffic_id = QString::fromStdString(traffic.id); + QString vehicle_id = QString::fromStdString(traffic.aircraft_id); + emit trafficUpdate(type == Traffic::Update::Type::alert, traffic_id, vehicle_id, + QGeoCoordinate(traffic.latitude, traffic.longitude, traffic.altitude), static_cast(traffic.heading)); + } +} + +//----------------------------------------------------------------------------- +void +AirMapTrafficMonitor::stop() +{ + if (_monitor) { + _monitor->unsubscribe(_subscriber); + _subscriber.reset(); + _monitor.reset(); + } +} + diff --git a/src/Airmap/AirMapTrafficMonitor.h b/src/Airmap/AirMapTrafficMonitor.h new file mode 100644 index 0000000..1f78d64 --- /dev/null +++ b/src/Airmap/AirMapTrafficMonitor.h @@ -0,0 +1,52 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#pragma once + +#include "LifetimeChecker.h" +#include "AirMapSharedState.h" + +#include +#include + +#include "airmap/traffic.h" + +#include + +/** + * @class AirMapTrafficMonitor + * + */ + +class AirMapTrafficMonitor : public QObject, public LifetimeChecker +{ + Q_OBJECT +public: + AirMapTrafficMonitor (AirMapSharedState& shared); + virtual ~AirMapTrafficMonitor (); + + void startConnection (const QString& flightID); + + void stop(); + +signals: + void error (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails); + void trafficUpdate (bool alert, QString traffic_id, QString vehicle_id, QGeoCoordinate location, float heading); + +private: + void _update (airmap::Traffic::Update::Type type, const std::vector& update); + +private: + QString _flightID; + AirMapSharedState& _shared; + std::shared_ptr _monitor; + std::shared_ptr _subscriber; +}; + + diff --git a/src/Airmap/AirMapVehicleManager.cc b/src/Airmap/AirMapVehicleManager.cc new file mode 100644 index 0000000..b6d71a0 --- /dev/null +++ b/src/Airmap/AirMapVehicleManager.cc @@ -0,0 +1,100 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#include "AirspaceFlightPlanProvider.h" +#include "AirMapFlightPlanManager.h" +#include "AirMapVehicleManager.h" +#include "AirMapManager.h" + +#include "QGCApplication.h" +#include "Vehicle.h" +#include "QGCApplication.h" +#include "SettingsManager.h" + +//----------------------------------------------------------------------------- +AirMapVehicleManager::AirMapVehicleManager(AirMapSharedState& shared, const Vehicle& vehicle) + : AirspaceVehicleManager(vehicle) + , _shared(shared) + , _flightManager(shared) + , _telemetry(shared) + , _trafficMonitor(shared) +{ + connect(&_flightManager, &AirMapFlightManager::error, this, &AirMapVehicleManager::error); + connect(&_telemetry, &AirMapTelemetry::error, this, &AirMapVehicleManager::error); + connect(&_trafficMonitor, &AirMapTrafficMonitor::error, this, &AirMapVehicleManager::error); + connect(&_trafficMonitor, &AirMapTrafficMonitor::trafficUpdate, this, &AirspaceVehicleManager::trafficUpdate); + AirMapFlightPlanManager* planMgr = qobject_cast(qgcApp()->toolbox()->airspaceManager()->flightPlan()); + if(planMgr) { + connect(planMgr, &AirMapFlightPlanManager::flightIDChanged, this, &AirMapVehicleManager::_flightIDChanged); + } +} + +//----------------------------------------------------------------------------- +void +AirMapVehicleManager::startTelemetryStream() +{ + AirMapFlightPlanManager* planMgr = qobject_cast(qgcApp()->toolbox()->airspaceManager()->flightPlan()); + if (!planMgr->flightID().isEmpty()) { + //-- Is telemetry enabled? + if(qgcApp()->toolbox()->settingsManager()->airMapSettings()->enableTelemetry()->rawValue().toBool()) { + //-- TODO: This will start telemetry using the current flight ID in memory (current flight in AirMapFlightPlanManager) + qCDebug(AirMapManagerLog) << "AirMap telemetry stream enabled"; + _telemetry.startTelemetryStream(planMgr->flightID()); + } + } else { + qCDebug(AirMapManagerLog) << "AirMap telemetry stream not possible (No Flight ID)"; + } +} + +//----------------------------------------------------------------------------- +void +AirMapVehicleManager::stopTelemetryStream() +{ + _telemetry.stopTelemetryStream(); +} + +//----------------------------------------------------------------------------- +bool +AirMapVehicleManager::isTelemetryStreaming() +{ + return _telemetry.isTelemetryStreaming(); +} + +//----------------------------------------------------------------------------- +void +AirMapVehicleManager::endFlight() +{ + AirMapFlightPlanManager* planMgr = qobject_cast(qgcApp()->toolbox()->airspaceManager()->flightPlan()); + if (!planMgr->flightID().isEmpty()) { + _flightManager.endFlight(planMgr->flightID()); + } + _trafficMonitor.stop(); +} + +//----------------------------------------------------------------------------- +void +AirMapVehicleManager::vehicleMavlinkMessageReceived(const mavlink_message_t& message) +{ + if (isTelemetryStreaming()) { + _telemetry.vehicleMessageReceived(message); + } +} + +//----------------------------------------------------------------------------- +void +AirMapVehicleManager::_flightIDChanged(QString flightID) +{ + qCDebug(AirMapManagerLog) << "Flight ID Changed:" << flightID; + //-- Handle traffic monitor + if(flightID.isEmpty()) { + _trafficMonitor.stop(); + } else { + _trafficMonitor.startConnection(flightID); + } +} diff --git a/src/Airmap/AirMapVehicleManager.h b/src/Airmap/AirMapVehicleManager.h new file mode 100644 index 0000000..a77b037 --- /dev/null +++ b/src/Airmap/AirMapVehicleManager.h @@ -0,0 +1,49 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#pragma once + +#include "AirspaceManager.h" +#include "AirspaceVehicleManager.h" +#include "AirMapSharedState.h" +#include "AirMapFlightManager.h" +#include "AirMapTelemetry.h" +#include "AirMapTrafficMonitor.h" + +/// AirMap per vehicle management class. + +class AirMapVehicleManager : public AirspaceVehicleManager +{ + Q_OBJECT +public: + AirMapVehicleManager (AirMapSharedState& shared, const Vehicle& vehicle); + ~AirMapVehicleManager () override = default; + + void startTelemetryStream () override; + void stopTelemetryStream () override; + bool isTelemetryStreaming () override; + +signals: + void error (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails); + +public slots: + void endFlight () override; + +protected slots: + void vehicleMavlinkMessageReceived(const mavlink_message_t& message) override; + +private slots: + void _flightIDChanged (QString flightID); + +private: + AirMapSharedState& _shared; + AirMapFlightManager _flightManager; + AirMapTelemetry _telemetry; + AirMapTrafficMonitor _trafficMonitor; +}; diff --git a/src/Airmap/AirMapWeatherInfoManager.cc b/src/Airmap/AirMapWeatherInfoManager.cc new file mode 100644 index 0000000..194d5a2 --- /dev/null +++ b/src/Airmap/AirMapWeatherInfoManager.cc @@ -0,0 +1,72 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#include "AirMapWeatherInfoManager.h" +#include "AirMapManager.h" + +#define WEATHER_UPDATE_DISTANCE 50000 //-- 50km threshold for weather updates +#define WEATHER_UPDATE_TIME_MSECS 30 * 60 * 1000 //-- 30 minutes threshold for weather updates + +using namespace airmap; + +AirMapWeatherInfoManager::AirMapWeatherInfoManager(AirMapSharedState& shared, QObject *parent) + : AirspaceWeatherInfoProvider(parent) + , _valid(false) + , _shared(shared) +{ +} + +void +AirMapWeatherInfoManager::setROI(const QGCGeoBoundingCube& roi, bool reset) +{ + //-- If first time or we've moved more than WEATHER_UPDATE_DISTANCE, ask for weather updates. + if(reset || (!_lastRoiCenter.isValid() || _lastRoiCenter.distanceTo(roi.center()) > WEATHER_UPDATE_DISTANCE)) { + _lastRoiCenter = roi.center(); + _requestWeatherUpdate(_lastRoiCenter); + _weatherTimeElapsed.start(); + } else { + //-- Check weather once every WEATHER_UPDATE_TIME + if(_weatherTimeElapsed.elapsed() > WEATHER_UPDATE_TIME_MSECS) { + _requestWeatherUpdate(roi.center()); + _weatherTimeElapsed.start(); + } + } +} + +void +AirMapWeatherInfoManager::_requestWeatherUpdate(const QGeoCoordinate& coordinate) +{ + qCDebug(AirMapManagerLog) << "Weather Request (ROI Changed)"; + if (!_shared.client()) { + qCDebug(AirMapManagerLog) << "No AirMap client instance. Not updating Weather information"; + _valid = false; + emit weatherChanged(); + return; + } + Advisory::ReportWeather::Parameters params; + params.longitude= static_cast(coordinate.longitude()); + params.latitude = static_cast(coordinate.latitude()); + _shared.client()->advisory().report_weather(params, [this, coordinate](const Advisory::ReportWeather::Result& result) { + if (result) { + _weather = result.value(); + _valid = true; + if(_weather.icon.empty()) { + _icon = QStringLiteral("qrc:/airmapweather/unknown.svg"); + } else { + _icon = QStringLiteral("qrc:/airmapweather/") + QString::fromStdString(_weather.icon).replace("-", "_") + QStringLiteral(".svg"); + } + qCDebug(AirMapManagerLog) << "Weather Info: " << _valid << "Icon:" << QString::fromStdString(_weather.icon) << "Condition:" << QString::fromStdString(_weather.condition) << "Temp:" << _weather.temperature; + } else { + _valid = false; + QString description = QString::fromStdString(result.error().description() ? result.error().description().get() : ""); + qCDebug(AirMapManagerLog) << "Request Weather Failed" << QString::fromStdString(result.error().message()) << description; + } + emit weatherChanged(); + }); +} diff --git a/src/Airmap/AirMapWeatherInfoManager.h b/src/Airmap/AirMapWeatherInfoManager.h new file mode 100644 index 0000000..337bff1 --- /dev/null +++ b/src/Airmap/AirMapWeatherInfoManager.h @@ -0,0 +1,61 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#pragma once + +#include "LifetimeChecker.h" + +#include "AirspaceWeatherInfoProvider.h" +#include "AirMapSharedState.h" +#include "QGCGeoBoundingCube.h" + +#include +#include + +#include "airmap/advisory.h" + +/** + * @file AirMapWeatherInfoManager.h + * Weather information provided by AirMap. + */ + +class AirMapWeatherInfoManager : public AirspaceWeatherInfoProvider, public LifetimeChecker +{ + Q_OBJECT +public: + AirMapWeatherInfoManager(AirMapSharedState &shared, QObject *parent = nullptr); + + bool valid () override { return _valid; } + QString condition () override { return QString::fromStdString(_weather.condition); } + QString icon () override { return _icon; } + quint32 windHeading () override { return _weather.wind.heading; } + float windSpeed () override { return _weather.wind.speed; } + quint32 windGusting () override { return _weather.wind.gusting; } + float temperature () override { return _weather.temperature; } + float humidity () override { return _weather.humidity; } + float visibility () override { return _weather.visibility; } + float precipitation () override { return _weather.precipitation; } + + void setROI (const QGCGeoBoundingCube& roi, bool reset = false) override; + +signals: + void error (const QString& what, const QString& airmapdMessage, const QString& airmapdDetails); + +private: + void _requestWeatherUpdate (const QGeoCoordinate& coordinate); + +private: + bool _valid; + QString _icon; + airmap::Advisory::Weather _weather; + //-- Don't check the weather every time the user moves the map + AirMapSharedState& _shared; + QGeoCoordinate _lastRoiCenter; + QElapsedTimer _weatherTimeElapsed; +}; diff --git a/src/Airmap/AirmapSettings.qml b/src/Airmap/AirmapSettings.qml new file mode 100644 index 0000000..8815f21 --- /dev/null +++ b/src/Airmap/AirmapSettings.qml @@ -0,0 +1,732 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + + +import QtGraphicalEffects 1.0 +import QtMultimedia 5.5 +import QtQuick 2.3 +import QtQuick.Controls 1.2 +import QtQuick.Controls.Styles 1.4 +import QtQuick.Dialogs 1.2 +import QtQuick.Layouts 1.2 +import QtLocation 5.3 +import QtPositioning 5.3 + +import QGroundControl 1.0 +import QGroundControl.Airspace 1.0 +import QGroundControl.Controllers 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.FactControls 1.0 +import QGroundControl.FactSystem 1.0 +import QGroundControl.FlightMap 1.0 +import QGroundControl.MultiVehicleManager 1.0 +import QGroundControl.Palette 1.0 +import QGroundControl.ScreenTools 1.0 +import QGroundControl.SettingsManager 1.0 + +Item { + id: _root + anchors.fill: parent + anchors.margins: ScreenTools.defaultFontPixelWidth + + property real _labelWidth: ScreenTools.defaultFontPixelWidth * 20 + property real _editFieldWidth: ScreenTools.defaultFontPixelWidth * 20 + property real _buttonWidth: ScreenTools.defaultFontPixelWidth * 18 + property real _panelWidth: _root.width * _internalWidthRatio + property Fact _enableAirMapFact: QGroundControl.settingsManager.airMapSettings.enableAirMap + property bool _airMapEnabled: _enableAirMapFact.rawValue + property var _authStatus: QGroundControl.airspaceManager.authStatus + + readonly property real _internalWidthRatio: 0.8 + + QGCFlickable { + clip: true + anchors.fill: parent + contentHeight: settingsColumn.height + contentWidth: settingsColumn.width + Column { + id: settingsColumn + width: _root.width + spacing: ScreenTools.defaultFontPixelHeight * 0.5 + anchors.margins: ScreenTools.defaultFontPixelWidth + //----------------------------------------------------------------- + //-- General + Item { + width: _panelWidth + height: generalLabel.height + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.horizontalCenter: parent.horizontalCenter + QGCLabel { + id: generalLabel + text: qsTr("General") + font.family: ScreenTools.demiboldFontFamily + } + } + Rectangle { + height: generalRow.height + (ScreenTools.defaultFontPixelHeight * 2) + width: _panelWidth + color: qgcPal.windowShade + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.horizontalCenter: parent.horizontalCenter + Row { + id: generalRow + spacing: ScreenTools.defaultFontPixelWidth * 4 + anchors.centerIn: parent + Column { + spacing: ScreenTools.defaultFontPixelWidth + FactCheckBox { + text: qsTr("Enable AirMap Services") + fact: _enableAirMapFact + visible: _enableAirMapFact.visible + } + FactCheckBox { + text: qsTr("Enable Telemetry") + fact: _enableTelemetryFact + visible: _enableTelemetryFact.visible + enabled: _airMapEnabled + property Fact _enableTelemetryFact: QGroundControl.settingsManager.airMapSettings.enableTelemetry + } + FactCheckBox { + text: qsTr("Show Airspace on Map (Experimental)") + fact: _enableAirspaceFact + visible: _enableAirspaceFact.visible + enabled: _airMapEnabled + property Fact _enableAirspaceFact: QGroundControl.settingsManager.airMapSettings.enableAirspace + } + } + QGCButton { + text: qsTr("Clear Saved Answers") + enabled: _enableAirMapFact.rawValue + onClicked: clearDialog.open() + anchors.verticalCenter: parent.verticalCenter + MessageDialog { + id: clearDialog + visible: false + icon: StandardIcon.Warning + standardButtons: StandardButton.Yes | StandardButton.No + title: qsTr("Clear Saved Answers") + text: qsTr("All saved ruleset answers will be cleared. Is this really what you want?") + onYes: { + QGroundControl.airspaceManager.ruleSets.clearAllFeatures() + clearDialog.close() + } + onNo: { + clearDialog.close() + } + } + } + } + } + //----------------------------------------------------------------- + //-- Connection Status + Item { + width: _panelWidth + height: statusLabel.height + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.horizontalCenter: parent.horizontalCenter + visible: QGroundControl.settingsManager.appSettings.visible && _airMapEnabled + QGCLabel { + id: statusLabel + text: qsTr("Connection Status") + font.family: ScreenTools.demiboldFontFamily + } + } + Rectangle { + height: statusCol.height + (ScreenTools.defaultFontPixelHeight * 2) + width: _panelWidth + color: qgcPal.windowShade + visible: QGroundControl.settingsManager.appSettings.visible && _airMapEnabled + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.horizontalCenter: parent.horizontalCenter + Column { + id: statusCol + spacing: ScreenTools.defaultFontPixelHeight * 0.5 + width: parent.width + anchors.centerIn: parent + QGCLabel { + text: QGroundControl.airspaceManager.connected ? qsTr("Connected") : qsTr("Not Connected") + color: QGroundControl.airspaceManager.connected ? qgcPal.colorGreen : qgcPal.colorRed + anchors.horizontalCenter: parent.horizontalCenter + } + QGCLabel { + text: QGroundControl.airspaceManager.connectStatus + visible: QGroundControl.airspaceManager.connectStatus != "" + wrapMode: Text.WordWrap + horizontalAlignment: Text.AlignHCenter + width: parent.width * 0.8 + anchors.horizontalCenter: parent.horizontalCenter + } + } + } + //----------------------------------------------------------------- + //-- Login / Registration + Item { + width: _panelWidth + height: loginLabel.height + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.horizontalCenter: parent.horizontalCenter + QGCLabel { + id: loginLabel + text: qsTr("Login / Registration") + font.family: ScreenTools.demiboldFontFamily + } + } + Rectangle { + height: loginGrid.height + (ScreenTools.defaultFontPixelHeight * 2) + width: _panelWidth + color: qgcPal.windowShade + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.horizontalCenter: parent.horizontalCenter + GridLayout { + id: loginGrid + columns: 3 + columnSpacing: ScreenTools.defaultFontPixelWidth + rowSpacing: ScreenTools.defaultFontPixelHeight * 0.25 + anchors.centerIn: parent + QGCLabel { text: qsTr("User Name:") } + FactTextField { + fact: _usernameFact + width: _editFieldWidth + enabled: _airMapEnabled + visible: _usernameFact.visible + Layout.fillWidth: true + Layout.minimumWidth: _editFieldWidth + property Fact _usernameFact: QGroundControl.settingsManager.airMapSettings.userName + } + QGCLabel { + text: { + if(!QGroundControl.airspaceManager.connected) + return qsTr("Not Connected") + switch(_authStatus) { + case AirspaceManager.Unknown: + return "" + case AirspaceManager.Anonymous: + return qsTr("Anonymous") + case AirspaceManager.Authenticated: + return qsTr("Authenticated") + default: + return qsTr("Authentication Error") + } + } + Layout.rowSpan: 2 + Layout.alignment: Qt.AlignVCenter + } + QGCLabel { text: qsTr("Password:") } + FactTextField { + fact: _passwordFact + width: _editFieldWidth + enabled: _airMapEnabled + visible: _passwordFact.visible + echoMode: TextInput.Password + Layout.fillWidth: true + Layout.minimumWidth: _editFieldWidth + property Fact _passwordFact: QGroundControl.settingsManager.airMapSettings.password + } + Item { + width: 1 + height: 1 + } + Item { + width: 1 + height: 1 + Layout.columnSpan: 3 + } + QGCLabel { + text: qsTr("Forgot Your AirMap Password?") + Layout.alignment: Qt.AlignHCenter + Layout.columnSpan: 3 + } + Item { + width: 1 + height: 1 + Layout.columnSpan: 3 + } + QGCButton { + text: qsTr("Register for an AirMap Account") + Layout.alignment: Qt.AlignHCenter + Layout.columnSpan: 3 + enabled: _airMapEnabled + onClicked: { + Qt.openUrlExternally("https://www.airmap.com"); + } + } + } + } + //----------------------------------------------------------------- + //-- Pilot Profile + Item { + //-- Disabled for now + width: _panelWidth + height: profileLabel.height + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.horizontalCenter: parent.horizontalCenter + visible: false // QGroundControl.settingsManager.appSettings.visible + QGCLabel { + id: profileLabel + text: qsTr("Pilot Profile (WIP)") + font.family: ScreenTools.demiboldFontFamily + } + } + Rectangle { + //-- Disabled for now + height: profileGrid.height + (ScreenTools.defaultFontPixelHeight * 2) + width: _panelWidth + color: qgcPal.windowShade + visible: false // QGroundControl.settingsManager.appSettings.visible + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.horizontalCenter: parent.horizontalCenter + GridLayout { + id: profileGrid + columns: 2 + columnSpacing: ScreenTools.defaultFontPixelHeight * 2 + rowSpacing: ScreenTools.defaultFontPixelWidth * 0.25 + anchors.centerIn: parent + QGCLabel { text: qsTr("Name:") } + QGCLabel { text: qsTr("John Doe") } + QGCLabel { text: qsTr("User Name:") } + QGCLabel { text: qsTr("joe36") } + QGCLabel { text: qsTr("Email:") } + QGCLabel { text: qsTr("jonh@doe.com") } + QGCLabel { text: qsTr("Phone:") } + QGCLabel { text: qsTr("+1 212 555 1212") } + } + } + //----------------------------------------------------------------- + //-- License (Will this stay here?) + Item { + width: _panelWidth + height: licenseLabel.height + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.horizontalCenter: parent.horizontalCenter + visible: QGroundControl.settingsManager.airMapSettings.usePersonalApiKey.visible + QGCLabel { + id: licenseLabel + text: qsTr("License") + font.family: ScreenTools.demiboldFontFamily + } + } + Rectangle { + height: licenseGrid.height + (ScreenTools.defaultFontPixelHeight * 2) + width: _panelWidth + color: qgcPal.windowShade + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.horizontalCenter: parent.horizontalCenter + visible: QGroundControl.settingsManager.airMapSettings.usePersonalApiKey.visible + GridLayout { + id: licenseGrid + columns: 2 + columnSpacing: ScreenTools.defaultFontPixelHeight * 2 + rowSpacing: ScreenTools.defaultFontPixelWidth * 0.25 + anchors.centerIn: parent + FactCheckBox { + id: hasPrivateKey + text: qsTr("Personal API Key") + fact: QGroundControl.settingsManager.airMapSettings.usePersonalApiKey + Layout.columnSpan: 2 + } + Item { + width: 1 + height: 1 + visible: hasPrivateKey.checked + Layout.columnSpan: 2 + } + QGCLabel { text: qsTr("API Key:"); visible: hasPrivateKey.checked; } + FactTextField { fact: QGroundControl.settingsManager.airMapSettings.apiKey; width: _editFieldWidth * 2; visible: hasPrivateKey.checked; Layout.fillWidth: true; Layout.minimumWidth: _editFieldWidth * 2; } + QGCLabel { text: qsTr("Client ID:"); visible: hasPrivateKey.checked; } + FactTextField { fact: QGroundControl.settingsManager.airMapSettings.clientID; width: _editFieldWidth * 2; visible: hasPrivateKey.checked; Layout.fillWidth: true; Layout.minimumWidth: _editFieldWidth * 2; } + } + } + //----------------------------------------------------------------- + //-- Flight List + Item { + width: _panelWidth + height: flightListLabel.height + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.horizontalCenter: parent.horizontalCenter + visible: QGroundControl.settingsManager.appSettings.visible + QGCLabel { + id: flightListLabel + text: qsTr("Flight List Management") + font.family: ScreenTools.demiboldFontFamily + } + } + Rectangle { + height: flightListButton.height + (ScreenTools.defaultFontPixelHeight * 2) + width: _panelWidth + color: qgcPal.windowShade + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.horizontalCenter: parent.horizontalCenter + QGCButton { + id: flightListButton + text: qsTr("Show Flight List") + backRadius: 4 + heightFactor: 0.3333 + showBorder: true + width: ScreenTools.defaultFontPixelWidth * 16 + anchors.centerIn: parent + onClicked: { + panelLoader.sourceComponent = flightList + } + } + } + } + } + Loader { + id: panelLoader + anchors.centerIn: parent + } + //--------------------------------------------------------------- + //-- Flight List + Component { + id: flightList + Rectangle { + id: flightListRoot + width: _root.width + height: _root.height + color: qgcPal.window + property var _flightList: QGroundControl.airspaceManager.flightPlan.flightList + property real _mapWidth: ScreenTools.defaultFontPixelWidth * 40 + MouseArea { + anchors.fill: parent + hoverEnabled: true + onWheel: { wheel.accepted = true; } + onPressed: { mouse.accepted = true; } + onReleased: { mouse.accepted = true; } + } + //--------------------------------------------------------- + //-- Flight List + RowLayout { + anchors.fill: parent + TableView { + id: tableView + model: _flightList + selectionMode: SelectionMode.SingleSelection + Layout.alignment: Qt.AlignVCenter + Layout.fillWidth: true + Layout.fillHeight: true + onCurrentRowChanged: { + var o = _flightList.get(tableView.currentRow) + if(o) { + flightArea.path = o.boundingBox + map.fitViewportToMapItems() + } + } + TableViewColumn { + title: qsTr("No") + width: ScreenTools.defaultFontPixelWidth * 3 + horizontalAlignment: Text.AlignHCenter + delegate : Text { + horizontalAlignment: Text.AlignHCenter + text: (styleData.row + 1) + color: tableView.currentRow === styleData.row ? qgcPal.colorBlue : "black" + font.family: ScreenTools.fixedFontFamily + font.pixelSize: ScreenTools.smallFontPointSize + } + } + TableViewColumn { + title: qsTr("Created") + width: ScreenTools.defaultFontPixelWidth * 18 + horizontalAlignment: Text.AlignHCenter + delegate : Text { + horizontalAlignment: Text.AlignHCenter + text: { + var o = _flightList.get(styleData.row) + return o ? o.createdTime : "" + } + color: tableView.currentRow === styleData.row ? qgcPal.colorBlue : "black" + font.family: ScreenTools.fixedFontFamily + font.pixelSize: ScreenTools.smallFontPointSize + } + } + TableViewColumn { + title: qsTr("Flight Start") + width: ScreenTools.defaultFontPixelWidth * 18 + horizontalAlignment: Text.AlignHCenter + delegate : Text { + horizontalAlignment: Text.AlignHCenter + text: { + var o = _flightList.get(styleData.row) + return o ? o.startTime : "" + } + color: tableView.currentRow === styleData.row ? qgcPal.colorBlue : "black" + font.family: ScreenTools.fixedFontFamily + font.pixelSize: ScreenTools.smallFontPointSize + } + } + TableViewColumn { + title: qsTr("Flight End") + width: ScreenTools.defaultFontPixelWidth * 18 + horizontalAlignment: Text.AlignHCenter + delegate : Text { + horizontalAlignment: Text.AlignHCenter + text: { + var o = _flightList.get(styleData.row) + return o ? o.endTime : "" + } + color: tableView.currentRow === styleData.row ? qgcPal.colorBlue : "black" + font.family: ScreenTools.fixedFontFamily + font.pixelSize: ScreenTools.smallFontPointSize + } + } + TableViewColumn { + title: qsTr("State") + width: ScreenTools.defaultFontPixelWidth * 8 + horizontalAlignment: Text.AlignHCenter + delegate : Text { + horizontalAlignment: Text.AlignHCenter + text: { + var o = _flightList.get(styleData.row) + return o ? (o.active ? qsTr("Active") : qsTr("Completed")) : qsTr("Unknown") + } + color: tableView.currentRow === styleData.row ? qgcPal.colorBlue : "black" + font.family: ScreenTools.fixedFontFamily + font.pixelSize: ScreenTools.smallFontPointSize + } + } + } + Item { + width: flightListRoot._mapWidth + height: parent.height + Layout.alignment: Qt.AlignTop | Qt.AlignLeft + QGCLabel { + id: loadingLabel + text: qsTr("Loading Flight List") + visible: QGroundControl.airspaceManager.flightPlan.loadingFlightList + anchors.centerIn: parent + } + QGCColoredImage { + id: busyIndicator + height: ScreenTools.defaultFontPixelHeight * 2.5 + width: height + source: "/qmlimages/MapSync.svg" + sourceSize.height: height + fillMode: Image.PreserveAspectFit + mipmap: true + smooth: true + color: qgcPal.colorGreen + visible: loadingLabel.visible + anchors.top: loadingLabel.bottom + anchors.topMargin: ScreenTools.defaultFontPixelHeight + anchors.horizontalCenter: parent.horizontalCenter + RotationAnimation on rotation { + loops: Animation.Infinite + from: 360 + to: 0 + duration: 740 + running: busyIndicator.visible + } + } + Column { + spacing: ScreenTools.defaultFontPixelHeight * 0.75 + visible: !QGroundControl.airspaceManager.flightPlan.loadingFlightList + anchors.top: parent.top + anchors.horizontalCenter: parent.horizontalCenter + QGCLabel { + text: qsTr("Flight List") + anchors.horizontalCenter: parent.horizontalCenter + } + Rectangle { + color: qgcPal.window + border.color: qgcPal.globalTheme === QGCPalette.Dark ? Qt.rgba(1,1,1,0.25) : Qt.rgba(0,0,0,0.25) + border.width: 1 + radius: 4 + width: _mapWidth - (ScreenTools.defaultFontPixelWidth * 2) + height: rangeCol.height + (ScreenTools.defaultFontPixelHeight * 2) + Column { + id: rangeCol + anchors.centerIn: parent + spacing: ScreenTools.defaultFontPixelHeight * 0.5 + QGCLabel { + text: qsTr("Range") + anchors.horizontalCenter: parent.horizontalCenter + } + Row { + spacing: ScreenTools.defaultFontPixelWidth * 2 + anchors.horizontalCenter: parent.horizontalCenter + Column { + spacing: ScreenTools.defaultFontPixelHeight * 0.5 + QGCButton { + text: qsTr("From") + backRadius: 4 + heightFactor: 0.3333 + showBorder: true + width: _buttonWidth * 0.5 + onClicked: fromPicker.visible = true + anchors.horizontalCenter: parent.horizontalCenter + } + QGCLabel { + anchors.horizontalCenter: parent.horizontalCenter + text: fromPicker.selectedDate.toLocaleDateString(Qt.locale()) + } + } + Rectangle { + width: 1 + height: parent.height + color: qgcPal.globalTheme === QGCPalette.Dark ? Qt.rgba(1,1,1,0.25) : Qt.rgba(0,0,0,0.25) + } + Column { + spacing: ScreenTools.defaultFontPixelHeight * 0.5 + QGCButton { + text: qsTr("To") + backRadius: 4 + heightFactor: 0.3333 + showBorder: true + width: _buttonWidth * 0.5 + onClicked: toPicker.visible = true + anchors.horizontalCenter: parent.horizontalCenter + } + QGCLabel { + anchors.horizontalCenter: parent.horizontalCenter + text: toPicker.selectedDate.toLocaleDateString(Qt.locale()) + } + } + } + } + } + QGCButton { + text: qsTr("Refresh") + backRadius: 4 + heightFactor: 0.3333 + showBorder: true + width: _buttonWidth + enabled: true + anchors.horizontalCenter: parent.horizontalCenter + onClicked: { + var start = fromPicker.selectedDate + var end = toPicker.selectedDate + start.setHours(0,0,0,0) + end.setHours(23,59,59,0) + QGroundControl.airspaceManager.flightPlan.loadFlightList(start, end) + } + } + QGCButton { + text: qsTr("End Selected") + backRadius: 4 + heightFactor: 0.3333 + showBorder: true + width: _buttonWidth + enabled: { + var o = _flightList.get(tableView.currentRow) + return o && o.active + } + anchors.horizontalCenter: parent.horizontalCenter + onClicked: { + endFlightDialog.visible = true + } + MessageDialog { + id: endFlightDialog + visible: false + icon: StandardIcon.Warning + standardButtons: StandardButton.Yes | StandardButton.No + title: qsTr("End Flight") + text: qsTr("Confirm ending active flight?") + onYes: { + var o = _flightList.get(tableView.currentRow) + if(o) { + QGroundControl.airspaceManager.flightPlan.endFlight(o.flightID) + } + endFlightDialog.visible = false + } + onNo: { + endFlightDialog.visible = false + } + } + } + QGCButton { + text: qsTr("Close") + backRadius: 4 + heightFactor: 0.3333 + showBorder: true + width: _buttonWidth + anchors.horizontalCenter: parent.horizontalCenter + onClicked: { + panelLoader.sourceComponent = null + } + } + QGCLabel { + text: _flightList.count > 0 ? _flightList.count + qsTr(" Flights Loaded") : qsTr("No Flights Loaded") + anchors.horizontalCenter: parent.horizontalCenter + } + QGCLabel { + text: qsTr("A maximum of 250 flights were loaded") + color: qgcPal.colorOrange + font.pixelSize: ScreenTools.smallFontPointSize + visible: _flightList.count >= 250 + anchors.horizontalCenter: parent.horizontalCenter + } + } + QGCLabel { + text: qsTr("Flight Area ") + (tableView.currentRow + 1) + visible: !QGroundControl.airspaceManager.flightPlan.loadingFlightList && _flightList.count > 0 && tableView.currentRow >= 0 + anchors.bottom: map.top + anchors.bottomMargin: ScreenTools.defaultFontPixelHeight * 0.25 + anchors.horizontalCenter: parent.horizontalCenter + } + Map { + id: map + width: ScreenTools.defaultFontPixelWidth * 40 + height: width * 0.6666 + anchors.bottom: parent.bottom + anchors.horizontalCenter: parent.horizontalCenter + zoomLevel: QGroundControl.flightMapZoom + center: QGroundControl.flightMapPosition + gesture.acceptedGestures: MapGestureArea.PinchGesture + plugin: Plugin { name: "QGroundControl" } + visible: !QGroundControl.airspaceManager.flightPlan.loadingFlightList && _flightList.count > 0 && tableView.currentRow >= 0 + function updateActiveMapType() { + var settings = QGroundControl.settingsManager.flightMapSettings + var fullMapName = settings.mapProvider.value + " " + settings.mapType.value + for (var i = 0; i < map.supportedMapTypes.length; i++) { + if (fullMapName === map.supportedMapTypes[i].name) { + map.activeMapType = map.supportedMapTypes[i] + return + } + } + } + MapPolygon { + id: flightArea + color: Qt.rgba(1,0,0,0.2) + border.color: Qt.rgba(1,1,1,0.65) + } + Component.onCompleted: { + updateActiveMapType() + } + Connections { + target: QGroundControl.settingsManager.flightMapSettings.mapType + onRawValueChanged: updateActiveMapType() + } + + Connections { + target: QGroundControl.settingsManager.flightMapSettings.mapProvider + onRawValueChanged: updateActiveMapType() + } + + } + Calendar { + id: fromPicker + anchors.centerIn: parent + visible: false; + onClicked: { + visible = false; + } + } + Calendar { + id: toPicker + anchors.centerIn: parent + visible: false; + minimumDate: fromPicker.selectedDate + onClicked: { + visible = false; + } + } + } + } + } + } +} diff --git a/src/Airmap/AirspaceControl.qml b/src/Airmap/AirspaceControl.qml new file mode 100644 index 0000000..b43ce85 --- /dev/null +++ b/src/Airmap/AirspaceControl.qml @@ -0,0 +1,603 @@ +import QtQuick 2.11 +import QtQuick.Controls 2.4 +import QtQuick.Layouts 1.11 +import QtQuick.Dialogs 1.3 +import QtQuick.Controls.Styles 1.4 +import QtQml 2.2 +import QtGraphicalEffects 1.0 + +import QGroundControl 1.0 +import QGroundControl.Airmap 1.0 +import QGroundControl.Airspace 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.FactControls 1.0 +import QGroundControl.Palette 1.0 +import QGroundControl.ScreenTools 1.0 +import QGroundControl.Vehicle 1.0 + +Item { + id: _root + width: parent.width + height: _colapsed ? colapsedRect.height : expandedRect.height + + property bool showColapse: true + property bool planView: false + + property color _airspaceColor: _validAdvisories ? getAispaceColor(QGroundControl.airspaceManager.advisories.airspaceColor) : _colorGray + property bool _validRules: QGroundControl.airspaceManager.connected && QGroundControl.airspaceManager.ruleSets.valid + property bool _validAdvisories: QGroundControl.airspaceManager.connected && QGroundControl.airspaceManager.advisories.valid + property color _textColor: qgcPal.text + property bool _colapsed: !QGroundControl.airspaceManager.airspaceVisible || !QGroundControl.airspaceManager.connected + property int _flightPermit: QGroundControl.airspaceManager.flightPlan.flightPermitStatus + + readonly property real _radius: ScreenTools.defaultFontPixelWidth * 0.5 + readonly property color _colorOrange: "#d75e0d" + readonly property color _colorBrown: "#3c2b24" + readonly property color _colorLightBrown: "#5a4e49" + readonly property color _colorGray: "#615c61" + readonly property color _colorLightGray: "#a0a0a0" + readonly property color _colorMidBrown: "#3a322f" + readonly property color _colorYellow: "#d7c61d" + readonly property color _colorWhite: "#ffffff" + readonly property color _colorRed: "#aa1200" + readonly property color _colorGreen: "#125f00" + readonly property real _baseHeight: ScreenTools.defaultFontPixelHeight * 22 + readonly property real _baseWidth: ScreenTools.defaultFontPixelWidth * 40 + + QGCPalette { + id: qgcPal + colorGroupEnabled: enabled + } + + function getAispaceColor(color) { + if(color === AirspaceAdvisoryProvider.Green) return _colorGreen; + if(color === AirspaceAdvisoryProvider.Yellow) return _colorYellow; + if(color === AirspaceAdvisoryProvider.Orange) return _colorOrange; + if(color === AirspaceAdvisoryProvider.Red) return _colorRed; + return _colorGray; + } + + function hasBriefRules() { + if(QGroundControl.airspaceManager.flightPlan.rulesViolation.count > 0) + return true; + if(QGroundControl.airspaceManager.flightPlan.rulesInfo.count > 0) + return true; + if(QGroundControl.airspaceManager.flightPlan.rulesReview.count > 0) + return true; + if(QGroundControl.airspaceManager.flightPlan.rulesFollowing.count > 0) + return true; + return false; + } + + on_AirspaceColorChanged: { + if(_validAdvisories) { + if(QGroundControl.airspaceManager.advisories.airspaceColor === AirspaceAdvisoryProvider.Yellow) { + _textColor = "#000000" + return + } + } + _textColor = _colorWhite + } + + //--------------------------------------------------------------- + //-- Colapsed State + Rectangle { + id: colapsedRect + width: parent.width + height: _colapsed ? colapsedRow.height + ScreenTools.defaultFontPixelHeight : 0 + color: QGroundControl.airspaceManager.connected ? (_validAdvisories ? getAispaceColor(QGroundControl.airspaceManager.advisories.airspaceColor) : _colorGray) : _colorGray + radius: _radius + visible: _colapsed + Row { + id: colapsedRow + spacing: ScreenTools.defaultFontPixelWidth + anchors.left: parent.left + anchors.leftMargin: ScreenTools.defaultFontPixelWidth + anchors.verticalCenter: parent.verticalCenter + QGCColoredImage { + width: height + height: ScreenTools.defaultFontPixelWidth * 2.5 + sourceSize.height: height + source: "qrc:/airmap/advisory-icon.svg" + color: _textColor + anchors.verticalCenter: parent.verticalCenter + } + Column { + spacing: 0 + anchors.verticalCenter: parent.verticalCenter + QGCLabel { + text: qsTr("Airspace") + color: _textColor + } + QGCLabel { + text: _validAdvisories ? QGroundControl.airspaceManager.advisories.advisories.count + qsTr(" Advisories") : "" + color: _textColor + visible: _validAdvisories + font.pointSize: ScreenTools.smallFontPointSize + } + } + Item { + width: ScreenTools.defaultFontPixelWidth + height: 1 + } + AirspaceWeather { + iconHeight: ScreenTools.defaultFontPixelHeight * 2 + visible: QGroundControl.airspaceManager.weatherInfo.valid && QGroundControl.airspaceManager.connected + contentColor: _textColor + anchors.verticalCenter: parent.verticalCenter + } + QGCLabel { + text: qsTr("Not Connected") + color: qgcPal.text + visible: !QGroundControl.airspaceManager.connected + anchors.verticalCenter: parent.verticalCenter + } + } + QGCColoredImage { + width: height + height: ScreenTools.defaultFontPixelWidth * 2.5 + sourceSize.height: height + source: "qrc:/airmap/expand.svg" + color: _textColor + fillMode: Image.PreserveAspectFit + visible: QGroundControl.airspaceManager.connected + anchors.right: parent.right + anchors.rightMargin: ScreenTools.defaultFontPixelWidth + anchors.verticalCenter: parent.verticalCenter + } + MouseArea { + anchors.fill: parent + enabled: QGroundControl.airspaceManager.connected + onClicked: { + QGroundControl.airspaceManager.airspaceVisible = true + } + } + } + //--------------------------------------------------------------- + //-- Expanded State + Rectangle { + id: expandedRect + width: parent.width + height: !_colapsed ? expandedCol.height + ScreenTools.defaultFontPixelHeight : 0 + color: _validAdvisories ? getAispaceColor(QGroundControl.airspaceManager.advisories.airspaceColor) : _colorGray + radius: _radius + visible: !_colapsed + MouseArea { + anchors.fill: parent + onWheel: { wheel.accepted = true; } + onPressed: { mouse.accepted = true; } + onReleased: { mouse.accepted = true; } + } + Column { + id: expandedCol + spacing: ScreenTools.defaultFontPixelHeight * 0.5 + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + //-- Header + Item { + height: expandedRow.height + anchors.left: parent.left + anchors.right: parent.right + Row { + id: expandedRow + spacing: ScreenTools.defaultFontPixelWidth + anchors.left: parent.left + anchors.leftMargin: ScreenTools.defaultFontPixelWidth + QGCColoredImage { + width: height + height: ScreenTools.defaultFontPixelWidth * 2.5 + sourceSize.height: height + source: "qrc:/airmap/advisory-icon.svg" + color: _textColor + fillMode: Image.PreserveAspectFit + anchors.verticalCenter: parent.verticalCenter + } + Column { + spacing: 0 + anchors.verticalCenter: parent.verticalCenter + QGCLabel { + text: qsTr("Airspace") + color: _textColor + } + QGCLabel { + text: _validAdvisories ? QGroundControl.airspaceManager.advisories.advisories.count + qsTr(" Advisories") : "" + color: _textColor + visible: _validAdvisories + font.pointSize: ScreenTools.smallFontPointSize + } + } + Item { + width: ScreenTools.defaultFontPixelWidth + height: 1 + } + AirspaceWeather { + visible: QGroundControl.airspaceManager.weatherInfo.valid && showColapse + contentColor: _textColor + anchors.verticalCenter: parent.verticalCenter + } + } + QGCColoredImage { + width: height + height: ScreenTools.defaultFontPixelWidth * 2.5 + sourceSize.height: height + source: "qrc:/airmap/colapse.svg" + color: _textColor + visible: showColapse + fillMode: Image.PreserveAspectFit + anchors.right: parent.right + anchors.rightMargin: ScreenTools.defaultFontPixelWidth + anchors.verticalCenter: parent.verticalCenter + MouseArea { + anchors.fill: parent + enabled: showColapse + onClicked: QGroundControl.airspaceManager.airspaceVisible = false + } + } + AirspaceWeather { + visible: QGroundControl.airspaceManager.weatherInfo.valid && !showColapse + contentColor: _textColor + anchors.right: parent.right + anchors.rightMargin: ScreenTools.defaultFontPixelWidth + anchors.verticalCenter: parent.verticalCenter + } + } + //-- Contents (Brown Box) + Rectangle { + color: _colorBrown + height: airspaceCol.height + ScreenTools.defaultFontPixelHeight + radius: _radius + anchors.left: parent.left + anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 0.5 + anchors.right: parent.right + anchors.rightMargin: ScreenTools.defaultFontPixelWidth * 0.5 + Column { + id: airspaceCol + spacing: ScreenTools.defaultFontPixelHeight * 0.5 + anchors.left: parent.left + anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 0.5 + anchors.right: parent.right + anchors.rightMargin: ScreenTools.defaultFontPixelWidth * 0.5 + anchors.verticalCenter: parent.verticalCenter + //-- Regulations + Rectangle { + color: _colorLightBrown + height: regCol.height + ScreenTools.defaultFontPixelHeight + radius: _radius + anchors.left: parent.left + anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 0.5 + anchors.right: parent.right + anchors.rightMargin: ScreenTools.defaultFontPixelWidth * 0.5 + Column { + id: regCol + spacing: ScreenTools.defaultFontPixelHeight * 0.25 + anchors.left: parent.left + anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 0.5 + anchors.right: parent.right + anchors.rightMargin: ScreenTools.defaultFontPixelWidth * 0.5 + anchors.verticalCenter: parent.verticalCenter + QGCLabel { + text: qsTr("Airspace Regulations") + color: _colorWhite + anchors.horizontalCenter: parent.horizontalCenter + } + QGCLabel { + text: qsTr("Advisories based on the selected rules.") + color: _colorWhite + anchors.horizontalCenter: parent.horizontalCenter + font.pointSize: ScreenTools.smallFontPointSize + } + Item { width: 1; height: ScreenTools.defaultFontPixelHeight * 0.125; } + GridLayout { + columns: 2 + anchors.left: parent.left + anchors.right: parent.right + Rectangle { + width: regButton.height + height: width + radius: 2 + color: _colorGray + Layout.alignment: Qt.AlignVCenter + QGCColoredImage { + id: pencilIcon + width: height + height: parent.height * 0.5 + sourceSize.height: height + source: "qrc:/airmap/pencil.svg" + color: _colorWhite + fillMode: Image.PreserveAspectFit + anchors.centerIn: parent + MouseArea { + anchors.fill: parent + onClicked: { + ruleSelector.open() + } + } + } + } + Rectangle { + id: regButton + height: ScreenTools.defaultFontPixelHeight * 1.5 + radius: 2 + color: _colorMidBrown + Layout.fillWidth: true + QGCLabel { + id: regLabel + text: _validRules ? QGroundControl.airspaceManager.ruleSets.selectedRuleSets : qsTr("None") + elide: Text.ElideRight + horizontalAlignment: Text.AlignHCenter + color: _colorWhite + anchors.left: parent.left + anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 0.5 + anchors.right: parent.right + anchors.rightMargin: ScreenTools.defaultFontPixelWidth * 0.5 + anchors.verticalCenter: parent.verticalCenter + } + } + } + } + } + Flickable { + clip: true + height: ScreenTools.defaultFontPixelHeight * 8 + contentHeight: advisoryCol.height + flickableDirection: Flickable.VerticalFlick + anchors.left: parent.left + anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 0.5 + anchors.right: parent.right + anchors.rightMargin:ScreenTools.defaultFontPixelWidth * 0.5 + Column { + id: advisoryCol + spacing: ScreenTools.defaultFontPixelHeight * 0.5 + anchors.right: parent.right + anchors.left: parent.left + Repeater { + model: _validAdvisories ? QGroundControl.airspaceManager.advisories.advisories : [] + delegate: AirspaceRegulation { + regTitle: object.typeStr + regText: object.name + regColor: getAispaceColor(object.color) + anchors.right: parent.right + anchors.rightMargin: ScreenTools.defaultFontPixelWidth + anchors.left: parent.left + anchors.leftMargin: ScreenTools.defaultFontPixelWidth + } + } + } + } + } + } + //-- Footer + QGCButton { + text: planView ? qsTr("File Flight Plan") : qsTr("Flight Brief") + backRadius: 4 + heightFactor: 0.3333 + showBorder: true + width: ScreenTools.defaultFontPixelWidth * 16 + visible: _flightPermit !== AirspaceFlightPlanProvider.PermitNone + anchors.horizontalCenter: parent.horizontalCenter + onClicked: { + planView ? flightDetails.open() : flightBrief.open() + } + } + QGCLabel { + text: qsTr("Powered by AIRMAP") + color: _textColor + font.pointSize: ScreenTools.smallFontPointSize + anchors.horizontalCenter: parent.horizontalCenter + } + } + } + //--------------------------------------------------------------- + //-- Rule Selector + Popup { + id: ruleSelector + width: rulesCol.width + ScreenTools.defaultFontPixelWidth + height: rulesCol.height + ScreenTools.defaultFontPixelHeight + modal: true + focus: true + parent: Overlay.overlay + closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside + + property var _popupTarget: null + property var _arrowTarget: null + + onVisibleChanged: { + if(visible) { + _popupTarget = mainWindow.contentItem.mapFromItem(_root, 0, 0) + _arrowTarget = mainWindow.contentItem.mapFromItem(pencilIcon, 0, 0) + } + } + + x: _popupTarget ? _popupTarget.x - width - (ScreenTools.defaultFontPixelWidth * 5) : 0 + y: _popupTarget ? _popupTarget.y + mainWindow.header.height : 0 + + background: Rectangle { + anchors.fill: parent + color: qgcPal.window + radius: ScreenTools.defaultFontPixelWidth + } + + Column { + id: rulesCol + spacing: ScreenTools.defaultFontPixelHeight * 0.5 + anchors.centerIn: parent + //-- Regulations + Rectangle { + color: qgcPal.windowShade + height: rulesTitle.height + ScreenTools.defaultFontPixelHeight + width: parent.width * 0.95 + radius: _radius + anchors.horizontalCenter: parent.horizontalCenter + QGCLabel { + id: rulesTitle + text: qsTr("Airspace Regulation Options") + anchors.centerIn: parent + } + } + Flickable { + clip: true + width: ScreenTools.defaultFontPixelWidth * 30 + height: ScreenTools.defaultFontPixelHeight * 14 + contentHeight: rulesetCol.height + flickableDirection: Flickable.VerticalFlick + Column { + id: rulesetCol + spacing: ScreenTools.defaultFontPixelHeight * 0.25 + anchors.right: parent.right + anchors.left: parent.left + anchors.rightMargin: ScreenTools.defaultFontPixelWidth * 2 + anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 2 + Item { + width: 1 + height: 1 + } + QGCLabel { + text: qsTr("PICK ONE REGULATION") + font.pointSize: ScreenTools.smallFontPointSize + anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 2 + } + Repeater { + model: _validRules ? QGroundControl.airspaceManager.ruleSets.ruleSets : [] + delegate: RuleSelector { + visible: object.selectionType === AirspaceRuleSet.Pickone + rule: object + autoExclusive: true + anchors.right: parent.right + anchors.rightMargin: ScreenTools.defaultFontPixelWidth + anchors.left: parent.left + anchors.leftMargin: ScreenTools.defaultFontPixelWidth + } + } + Item { + width: 1 + height: 1 + } + QGCLabel { + text: qsTr("OPTIONAL") + font.pointSize: ScreenTools.smallFontPointSize + anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 2 + } + Repeater { + model: _validRules ? QGroundControl.airspaceManager.ruleSets.ruleSets : [] + delegate: RuleSelector { + visible: object.selectionType === AirspaceRuleSet.Optional + rule: object + anchors.right: parent.right + anchors.rightMargin: ScreenTools.defaultFontPixelWidth + anchors.left: parent.left + anchors.leftMargin: ScreenTools.defaultFontPixelWidth + } + } + Item { + width: 1 + height: 1 + } + QGCLabel { + text: qsTr("REQUIRED") + font.pointSize: ScreenTools.smallFontPointSize + anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 2 + } + Repeater { + model: _validRules ? QGroundControl.airspaceManager.ruleSets.ruleSets : [] + delegate: RuleSelector { + visible: object.selectionType === AirspaceRuleSet.Required + rule: object + enabled: false + anchors.right: parent.right + anchors.rightMargin: ScreenTools.defaultFontPixelWidth + anchors.left: parent.left + anchors.leftMargin: ScreenTools.defaultFontPixelWidth + } + } + } + } + } + + //-- Arrow + QGCColoredImage { + id: arrowIcon + width: height + height: ScreenTools.defaultFontPixelHeight * 2 + sourceSize.height: height + source: "qrc:/airmap/right-arrow.svg" + color: qgcPal.window + anchors.left: parent.right + y: ruleSelector._arrowTarget ? (ruleSelector._arrowTarget.y - height) : 0 + } + } + + //--------------------------------------------------------------- + //-- Flight Details + Popup { + id: flightDetails + width: flDetailsRow.width + (ScreenTools.defaultFontPixelWidth * 4) + height: flDetailsRow.height + (ScreenTools.defaultFontPixelHeight * 2) + modal: true + focus: true + parent: Overlay.overlay + x: Math.round((mainWindow.width - width) * 0.5) + y: Math.round((mainWindow.height - height) * 0.5) + closePolicy: Popup.NoAutoClose + background: Rectangle { + anchors.fill: parent + color: qgcPal.window + radius: ScreenTools.defaultFontPixelWidth + } + Row { + id: flDetailsRow + spacing: ScreenTools.defaultFontPixelWidth + anchors.centerIn: parent + //--------------------------------------------------------- + //-- Flight Details + FlightDetails { + id: _flightDetails + baseHeight: _baseHeight + baseWidth: _baseWidth + } + //--------------------------------------------------------- + //-- Divider + Rectangle { + color: qgcPal.text + width: 1 + height: parent.height + opacity: 0.25 + anchors.verticalCenter: parent.verticalCenter + } + //--------------------------------------------------------- + //-- Flight Brief + FlightBrief { + baseHeight: _baseHeight + baseWidth: _baseWidth + onClosed: flightDetails.close() + } + } + } + //--------------------------------------------------------------- + //-- Flight Brief + Popup { + id: flightBrief + width: flightBriedItem.width + (ScreenTools.defaultFontPixelWidth * 4) + height: flightBriedItem.height + (ScreenTools.defaultFontPixelHeight * 2) + modal: true + focus: true + parent: Overlay.overlay + x: Math.round((mainWindow.width - width) * 0.5) + y: Math.round((mainWindow.height - height) * 0.5) + closePolicy: Popup.NoAutoClose + background: Rectangle { + anchors.fill: parent + color: qgcPal.window + radius: ScreenTools.defaultFontPixelWidth + } + //--------------------------------------------------------- + //-- Flight Brief + FlightBrief { + id: flightBriedItem + baseHeight: _baseHeight + baseWidth: _baseWidth + onClosed: flightBrief.close() + anchors.centerIn: parent + } + } +} diff --git a/src/Airmap/AirspaceRegulation.qml b/src/Airmap/AirspaceRegulation.qml new file mode 100644 index 0000000..91a0af1 --- /dev/null +++ b/src/Airmap/AirspaceRegulation.qml @@ -0,0 +1,58 @@ +import QtQuick 2.3 +import QtQuick.Controls 1.2 +import QtQuick.Controls.Styles 1.4 +import QtQuick.Dialogs 1.2 +import QtQml 2.2 + +import QGroundControl 1.0 +import QGroundControl.ScreenTools 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.Palette 1.0 +import QGroundControl.Airmap 1.0 + +Item { + id: _root + height: regCol.height + + property var textColor: "white" + property var regColor: "white" + property var regTitle: "" + property var regText: "" + + Column { + id: regCol + spacing: ScreenTools.defaultFontPixelHeight * 0.5 + anchors.left: parent.left + anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 0.5 + anchors.right: parent.right + anchors.rightMargin: ScreenTools.defaultFontPixelWidth * 0.5 + Row { + spacing: ScreenTools.defaultFontPixelWidth + anchors.left: parent.left + anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 0.5 + anchors.right: parent.right + anchors.rightMargin: ScreenTools.defaultFontPixelWidth * 0.5 + Rectangle { + width: height + height: ScreenTools.defaultFontPixelWidth * 1.5 + radius: height * 0.5 + color: regColor + anchors.verticalCenter: parent.verticalCenter + } + QGCLabel { + text: regTitle + color: textColor + } + } + QGCLabel { + text: regText + color: textColor + anchors.left: parent.left + anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 0.5 + anchors.right: parent.right + anchors.rightMargin: ScreenTools.defaultFontPixelWidth * 0.5 + wrapMode: Text.WordWrap + font.pointSize: ScreenTools.smallFontPointSize + } + } +} diff --git a/src/Airmap/AirspaceWeather.qml b/src/Airmap/AirspaceWeather.qml new file mode 100644 index 0000000..265b212 --- /dev/null +++ b/src/Airmap/AirspaceWeather.qml @@ -0,0 +1,44 @@ +import QtQuick 2.3 +import QtQuick.Controls 1.2 +import QtQuick.Controls.Styles 1.4 +import QtQuick.Dialogs 1.2 +import QtQml 2.2 + +import QGroundControl 1.0 +import QGroundControl.Airmap 1.0 +import QGroundControl.Airspace 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.Palette 1.0 +import QGroundControl.ScreenTools 1.0 +import QGroundControl.SettingsManager 1.0 + +Item { + height: _valid ? weatherRow.height : 0 + width: _valid ? weatherRow.width : 0 + property color contentColor: "#ffffff" + property real iconHeight: ScreenTools.defaultFontPixelHeight * 2 + property bool _valid: QGroundControl.airspaceManager.weatherInfo.valid + property bool _celcius: QGroundControl.settingsManager.unitsSettings.temperatureUnits.rawValue === UnitsSettings.TemperatureUnitsCelsius + property int _tempC: _valid ? QGroundControl.airspaceManager.weatherInfo.temperature : 0 + property string _tempS: (_celcius ? _tempC : _tempC * 1.8 + 32).toFixed(0) + (_celcius ? "°C" : "°F") + Row { + id: weatherRow + spacing: ScreenTools.defaultFontPixelHeight * 0.5 + QGCColoredImage { + width: height + height: iconHeight + sourceSize.height: height + source: _valid ? QGroundControl.airspaceManager.weatherInfo.icon : "" + color: contentColor + visible: _valid + fillMode: Image.PreserveAspectFit + anchors.verticalCenter: parent.verticalCenter + } + QGCLabel { + text: _tempS + color: contentColor + visible: _valid + anchors.verticalCenter: parent.verticalCenter + } + } +} diff --git a/src/Airmap/CMakeLists.txt b/src/Airmap/CMakeLists.txt new file mode 100644 index 0000000..1f8a0cd --- /dev/null +++ b/src/Airmap/CMakeLists.txt @@ -0,0 +1,49 @@ + +if(QGC_AIRMAP) + + add_library(Airmap + AirMapAdvisoryManager.cc + AirMapFlightManager.cc + AirMapFlightPlanManager.cc + AirMapManager.cc + AirMapRestrictionManager.cc + AirMapRulesetsManager.cc + AirMapSettings.cc + AirMapSharedState.cc + AirMapTelemetry.cc + AirMapTrafficMonitor.cc + AirMapVehicleManager.cc + AirMapWeatherInfoManager.cc + + airmap.qrc + ) + add_custom_target(AirmapQml + SOURCES + AirmapSettings.qml + AirspaceRegulation.qml + ComplianceRules.qml + FlightDetails.qml + RuleSelector.qml + AirspaceControl.qml + AirspaceWeather.qml + FlightBrief.qml + FlightFeature.qml + ) +else() + add_library(Airmap + dummy/AirspaceManager.cc + airmap.qrc + ) + target_include_directories(Airmap PUBLIC dummy) +endif() + +target_link_libraries(Airmap + Qt5::Core + Qt5::Location + Qt5::Widgets + + qgc +) + +target_include_directories(Airmap INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) + diff --git a/src/Airmap/ComplianceRules.qml b/src/Airmap/ComplianceRules.qml new file mode 100644 index 0000000..fe8d4ae --- /dev/null +++ b/src/Airmap/ComplianceRules.qml @@ -0,0 +1,124 @@ +import QtQuick 2.3 +import QtQuick.Controls 1.2 +import QtQuick.Controls.Styles 1.4 +import QtQuick.Dialogs 1.2 +import QtQml 2.2 + +import QGroundControl 1.0 +import QGroundControl.ScreenTools 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.Palette 1.0 +import QGroundControl.Airmap 1.0 +import QGroundControl.SettingsManager 1.0 + +Item { + id: _root + height: checked ? (header.height + content.height) : header.height + property var rules: null + property color color: "white" + property alias text: title.text + property bool checked: false + property ExclusiveGroup exclusiveGroup: null + onExclusiveGroupChanged: { + if (exclusiveGroup) { + exclusiveGroup.bindCheckable(_root) + } + } + QGCPalette { + id: qgcPal + colorGroupEnabled: enabled + } + Rectangle { + id: header + height: ScreenTools.defaultFontPixelHeight * 2 + color: qgcPal.windowShade + anchors.top: parent.top + anchors.right: parent.right + anchors.left: parent.left + } + Row { + spacing: ScreenTools.defaultFontPixelWidth * 2 + anchors.fill: header + Rectangle { + height: parent.height + width: ScreenTools.defaultFontPixelWidth * 0.75 + color: _root.color + } + QGCLabel { + id: title + anchors.verticalCenter: parent.verticalCenter + } + } + QGCColoredImage { + source: checked ? "qrc:/airmap/colapse.svg" : "qrc:/airmap/expand.svg" + height: ScreenTools.defaultFontPixelHeight + width: height + color: qgcPal.text + fillMode: Image.PreserveAspectFit + sourceSize.height: height + anchors.right: header.right + anchors.rightMargin: ScreenTools.defaultFontPixelWidth + anchors.verticalCenter: header.verticalCenter + } + MouseArea { + anchors.fill: header + onClicked: { + _root.checked = !_root.checked + } + } + Rectangle { + id: content + color: qgcPal.window + visible: checked + height: ScreenTools.defaultFontPixelHeight * 10 + anchors.top: header.bottom + anchors.right: parent.right + anchors.left: parent.left + anchors.margins: ScreenTools.defaultFontPixelWidth + Flickable { + clip: true + anchors.fill: parent + contentHeight: rulesetCol.height + flickableDirection: Flickable.VerticalFlick + Column { + id: rulesetCol + spacing: ScreenTools.defaultFontPixelHeight * 0.25 + anchors.right: parent.right + anchors.left: parent.left + Repeater { + model: _root.rules ? _root.rules : [] + delegate: Item { + height: ruleCol.height + anchors.right: parent.right + anchors.left: parent.left + anchors.margins: ScreenTools.defaultFontPixelWidth + Column { + id: ruleCol + spacing: ScreenTools.defaultFontPixelHeight * 0.5 + anchors.right: parent.right + anchors.left: parent.left + Item { width: 1; height: ScreenTools.defaultFontPixelHeight * 0.25; } + QGCLabel { + text: object.shortText !== "" ? object.shortText : qsTr("Rule") + anchors.right: parent.right + anchors.left: parent.left + wrapMode: Text.WordWrap + } + QGCLabel { + text: object.description + visible: object.description !== "" + font.pointSize: ScreenTools.smallFontPointSize + anchors.right: parent.right + anchors.left: parent.left + wrapMode: Text.WordWrap + anchors.rightMargin: ScreenTools.defaultFontPixelWidth * 0.5 + anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 0.5 + } + } + } + } + Item { width: 1; height: ScreenTools.defaultFontPixelHeight * 0.25; } + } + } + } +} diff --git a/src/Airmap/FlightBrief.qml b/src/Airmap/FlightBrief.qml new file mode 100644 index 0000000..061c2db --- /dev/null +++ b/src/Airmap/FlightBrief.qml @@ -0,0 +1,234 @@ +import QtQuick 2.3 +import QtQuick.Controls 1.2 +import QtQuick.Controls.Styles 1.4 +import QtQuick.Dialogs 1.2 +import QtQml 2.2 + +import QGroundControl 1.0 +import QGroundControl.Airmap 1.0 +import QGroundControl.Airspace 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.Palette 1.0 +import QGroundControl.ScreenTools 1.0 +import QGroundControl.SettingsManager 1.0 + +Item { + id: _root + implicitHeight: briefRootCol.height + implicitWidth: briefRootCol.width + property real baseHeight: ScreenTools.defaultFontPixelHeight * 22 + property real baseWidth: ScreenTools.defaultFontPixelWidth * 40 + signal closed() + Column { + id: briefRootCol + spacing: ScreenTools.defaultFontPixelHeight * 0.25 + Rectangle { + color: qgcPal.windowShade + anchors.right: parent.right + anchors.left: parent.left + height: briefLabel.height + ScreenTools.defaultFontPixelHeight + QGCLabel { + id: briefLabel + text: qsTr("Flight Brief") + font.pointSize: ScreenTools.mediumFontPointSize + font.family: ScreenTools.demiboldFontFamily + anchors.centerIn: parent + } + } + Item { width: 1; height: ScreenTools.defaultFontPixelHeight * 0.5; } + Flickable { + clip: true + width: baseWidth + height: baseHeight - buttonRow.height - ScreenTools.defaultFontPixelHeight + contentHeight: briefCol.height + flickableDirection: Flickable.VerticalFlick + Column { + id: briefCol + spacing: ScreenTools.defaultFontPixelHeight * 0.5 + anchors.right: parent.right + anchors.left: parent.left + QGCLabel { + text: qsTr("Authorizations") + } + Rectangle { + color: qgcPal.windowShade + anchors.right: parent.right + anchors.left: parent.left + height: authCol.height + ScreenTools.defaultFontPixelHeight + Column { + id: authCol + spacing: ScreenTools.defaultFontPixelHeight * 0.5 + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.right: parent.right + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + //-- Actual Authorization from some jurisdiction + Repeater { + visible: QGroundControl.airspaceManager.flightPlan.authorizations.count > 0 + model: QGroundControl.airspaceManager.flightPlan.authorizations + Column { + spacing: ScreenTools.defaultFontPixelHeight * 0.5 + anchors.right: parent.right + anchors.left: parent.left + QGCLabel { + text: object.name + font.family: ScreenTools.demiboldFontFamily + anchors.horizontalCenter: parent.horizontalCenter + } + Rectangle { + anchors.right: parent.right + anchors.left: parent.left + height: label.height + (ScreenTools.defaultFontPixelHeight * 0.5) + color: { + if(object.status === AirspaceFlightAuthorization.Pending) + return _colorOrange + if(object.status === AirspaceFlightAuthorization.Accepted || object.status === AirspaceFlightAuthorization.AcceptedOnSubmission) + return _colorGreen + if(object.status === AirspaceFlightAuthorization.Rejected || object.status === AirspaceFlightAuthorization.RejectedOnSubmission) + return _colorRed + return _colorGray + } + QGCLabel { + id: label + color: _colorWhite + text: { + if(object.status === AirspaceFlightAuthorization.Pending) + return qsTr("Authorization Pending") + if(object.status === AirspaceFlightAuthorization.Accepted || object.status === AirspaceFlightAuthorization.AcceptedOnSubmission) + return qsTr("Authorization Accepted") + if(object.status === AirspaceFlightAuthorization.Rejected || object.status === AirspaceFlightAuthorization.RejectedOnSubmission) + return qsTr("Authorization Rejected") + return qsTr("Authorization Unknown") + } + anchors.centerIn: parent + } + } + } + } + //-- Implied Authorization from no jurisdiction + Rectangle { + anchors.right: parent.right + anchors.left: parent.left + height: noAuthLabel.height + (ScreenTools.defaultFontPixelHeight * 0.5) + visible: QGroundControl.airspaceManager.flightPlan.authorizations.count < 1 + color: { + if(_flightPermit === AirspaceFlightPlanProvider.PermitPending) + return _colorOrange + if(_flightPermit === AirspaceFlightPlanProvider.PermitAccepted || _flightPermit === AirspaceFlightPlanProvider.PermitNotRequired) + return _colorGreen + if(_flightPermit === AirspaceFlightPlanProvider.PermitRejected) + return _colorRed + return _colorGray + } + QGCLabel { + id: noAuthLabel + color: _colorWhite + text: { + if(_flightPermit === AirspaceFlightPlanProvider.PermitPending) + return qsTr("Authorization Pending") + if(_flightPermit === AirspaceFlightPlanProvider.PermitAccepted) + return qsTr("Authorization Accepted") + if(_flightPermit === AirspaceFlightPlanProvider.PermitRejected) + return qsTr("Authorization Rejected") + if(_flightPermit === AirspaceFlightPlanProvider.PermitNotRequired) + return qsTr("Authorization Not Required") + return qsTr("Authorization Unknown") + } + anchors.centerIn: parent + } + } + } + } + Item { width: 1; height: ScreenTools.defaultFontPixelHeight * 0.25; } + QGCLabel { + text: qsTr("Rules & Compliance") + visible: hasBriefRules() + } + ExclusiveGroup { id: ruleGroup } + ComplianceRules { + text: qsTr("Rules you may be violating") + rules: violationRules + visible: violationRules && violationRules.count + color: _colorRed + exclusiveGroup: ruleGroup + anchors.right: parent.right + anchors.left: parent.left + property var violationRules: QGroundControl.airspaceManager.flightPlan.rulesViolation + } + ComplianceRules { + text: qsTr("Rules needing more information") + rules: infoRules + color: _colorOrange + visible: infoRules && infoRules.count + exclusiveGroup: ruleGroup + anchors.right: parent.right + anchors.left: parent.left + property var infoRules: QGroundControl.airspaceManager.flightPlan.rulesInfo + } + ComplianceRules { + text: qsTr("Rules you should review") + rules: reviewRules + color: _colorYellow + visible: reviewRules && reviewRules.count + exclusiveGroup: ruleGroup + anchors.right: parent.right + anchors.left: parent.left + property var reviewRules: QGroundControl.airspaceManager.flightPlan.rulesReview + } + ComplianceRules { + text: qsTr("Rules you are following") + rules: followRules + color: _colorGreen + visible: followRules && followRules.count + exclusiveGroup: ruleGroup + anchors.right: parent.right + anchors.left: parent.left + property var followRules: QGroundControl.airspaceManager.flightPlan.rulesFollowing + } + } + } + //------------------------------------------------------------- + //-- File Flight Plan or Close + Item { width: 1; height: ScreenTools.defaultFontPixelHeight; } + Row { + id: buttonRow + spacing: ScreenTools.defaultFontPixelWidth + anchors.horizontalCenter: parent.horizontalCenter + QGCButton { + text: qsTr("Update Plan") + backRadius: 4 + heightFactor: 0.3333 + showBorder: true + enabled: _flightPermit !== AirspaceFlightPlanProvider.PermitNone && QGroundControl.airspaceManager.flightPlan.dirty + visible: planView + width: ScreenTools.defaultFontPixelWidth * 12 + onClicked: { + QGroundControl.airspaceManager.flightPlan.updateFlightPlan() + } + } + QGCButton { + text: qsTr("Submit Plan") + backRadius: 4 + heightFactor: 0.3333 + showBorder: true + enabled: _flightPermit === AirspaceFlightPlanProvider.PermitAccepted || _flightPermit === AirspaceFlightPlanProvider.PermitNotRequired + width: ScreenTools.defaultFontPixelWidth * 12 + visible: planView + onClicked: { + QGroundControl.airspaceManager.flightPlan.submitFlightPlan() + _root.closed() + } + } + QGCButton { + text: qsTr("Close") + backRadius: 4 + heightFactor: 0.3333 + showBorder: true + width: ScreenTools.defaultFontPixelWidth * 12 + onClicked: { + _root.closed() + } + } + } + } +} diff --git a/src/Airmap/FlightDetails.qml b/src/Airmap/FlightDetails.qml new file mode 100644 index 0000000..61a9003 --- /dev/null +++ b/src/Airmap/FlightDetails.qml @@ -0,0 +1,212 @@ +import QtQuick 2.3 +import QtQuick.Controls 1.2 +import QtQuick.Controls.Styles 1.4 +import QtQuick.Dialogs 1.2 +import QtQuick.Layouts 1.2 +import QtQml 2.2 + +import QGroundControl 1.0 +import QGroundControl.Airmap 1.0 +import QGroundControl.Airspace 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.Palette 1.0 +import QGroundControl.ScreenTools 1.0 +import QGroundControl.SettingsManager 1.0 + +Item { + id: _root + implicitHeight: detailCol.height + implicitWidth: detailCol.width + property real baseHeight: ScreenTools.defaultFontPixelHeight * 22 + property real baseWidth: ScreenTools.defaultFontPixelWidth * 40 + Column { + id: detailCol + spacing: ScreenTools.defaultFontPixelHeight * 0.25 + Rectangle { + color: qgcPal.windowShade + anchors.right: parent.right + anchors.left: parent.left + height: detailsLabel.height + ScreenTools.defaultFontPixelHeight + QGCLabel { + id: detailsLabel + text: qsTr("Flight Details") + font.pointSize: ScreenTools.mediumFontPointSize + font.family: ScreenTools.demiboldFontFamily + anchors.centerIn: parent + } + } + Item { width: 1; height: ScreenTools.defaultFontPixelHeight * 0.5; } + Flickable { + clip: true + width: baseWidth + height: baseHeight + contentHeight: flContextCol.height + flickableDirection: Flickable.VerticalFlick + Column { + id: flContextCol + spacing: ScreenTools.defaultFontPixelHeight * 0.25 + anchors.right: parent.right + anchors.left: parent.left + QGCLabel { + text: qsTr("Flight Date & Time") + } + Rectangle { + id: dateRect + color: qgcPal.windowShade + anchors.right: parent.right + anchors.left: parent.left + height: datePickerCol.height + (ScreenTools.defaultFontPixelHeight * 2) + Column { + id: datePickerCol + spacing: ScreenTools.defaultFontPixelHeight * 0.5 + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.right: parent.right + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + RowLayout { + spacing: ScreenTools.defaultFontPixelWidth * 0.5 + anchors.right: parent.right + anchors.left: parent.left + QGCButton { + text: qsTr("Now") + checked: QGroundControl.airspaceManager.flightPlan.flightStartsNow + onClicked: { + QGroundControl.airspaceManager.flightPlan.flightStartsNow = !QGroundControl.airspaceManager.flightPlan.flightStartsNow + } + } + QGCButton { + text: { + var nowTime = new Date() + var setTime = QGroundControl.airspaceManager.flightPlan.flightStartTime + if(setTime.setHours(0,0,0,0) === nowTime.setHours(0,0,0,0)) { + return qsTr("Today") + } else { + return setTime.toLocaleDateString(Qt.locale()) + } + } + Layout.fillWidth: true + enabled: !QGroundControl.airspaceManager.flightPlan.flightStartsNow + iconSource: "qrc:/airmap/expand.svg" + onClicked: { + datePicker.visible = true + } + } + } + QGCLabel { + text: qsTr("Flight Start Time") + } + Item { + anchors.right: parent.right + anchors.left: parent.left + height: timeSlider.height + visible: !QGroundControl.airspaceManager.flightPlan.flightStartsNow + QGCSlider { + id: timeSlider + width: parent.width - timeLabel.width - ScreenTools.defaultFontPixelWidth + stepSize: 1 + enabled: !QGroundControl.airspaceManager.flightPlan.flightStartsNow + minimumValue: 0 + maximumValue: 95 // 96 blocks of 15 minutes in 24 hours + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + onValueChanged: { + var today = QGroundControl.airspaceManager.flightPlan.flightStartTime + today.setHours(Math.floor(timeSlider.value * 0.25)) + today.setMinutes((timeSlider.value * 15) % 60) + today.setSeconds(0) + today.setMilliseconds(0) + QGroundControl.airspaceManager.flightPlan.flightStartTime = today + } + Component.onCompleted: { + updateTime() + } + function updateTime() { + var today = QGroundControl.airspaceManager.flightPlan.flightStartTime + var val = (((today.getHours() * 60) + today.getMinutes()) * (96/1440)) + 1 + if(val > 95) val = 95 + timeSlider.value = Math.ceil(val) + } + } + QGCLabel { + id: timeLabel + text: ('00' + hour).slice(-2) + ":" + ('00' + minute).slice(-2) + width: ScreenTools.defaultFontPixelWidth * 5 + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + property int hour: Math.floor(timeSlider.value * 0.25) + property int minute: (timeSlider.value * 15) % 60 + } + } + QGCLabel { + text: qsTr("Now") + visible: QGroundControl.airspaceManager.flightPlan.flightStartsNow + anchors.horizontalCenter: parent.horizontalCenter + } + QGCLabel { + text: qsTr("Duration") + } + Item { + anchors.right: parent.right + anchors.left: parent.left + height: durationSlider.height + QGCSlider { + id: durationSlider + width: parent.width - durationLabel.width - ScreenTools.defaultFontPixelWidth + stepSize: 1 + minimumValue: 1 + maximumValue: 24 // 24 blocks of 15 minutes in 6 hours + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + onValueChanged: { + var hour = Math.floor(durationSlider.value * 0.25) + var minute = (durationSlider.value * 15) % 60 + var seconds = (hour * 60 * 60) + (minute * 60) + QGroundControl.airspaceManager.flightPlan.flightDuration = seconds + } + Component.onCompleted: { + var val = ((QGroundControl.airspaceManager.flightPlan.flightDuration / 60) * (96/1440)) + 1 + if(val > 24) val = 24 + durationSlider.value = Math.ceil(val) + } + } + QGCLabel { + id: durationLabel + text: ('00' + hour).slice(-2) + ":" + ('00' + minute).slice(-2) + width: ScreenTools.defaultFontPixelWidth * 5 + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + property int hour: Math.floor(durationSlider.value * 0.25) + property int minute: (durationSlider.value * 15) % 60 + } + } + } + } + Item { width: 1; height: ScreenTools.defaultFontPixelHeight * 0.25; } + QGCLabel { + text: qsTr("Flight Context") + visible: QGroundControl.airspaceManager.flightPlan.briefFeatures.count > 0 + } + Repeater { + model: QGroundControl.airspaceManager.flightPlan.briefFeatures + visible: QGroundControl.airspaceManager.flightPlan.briefFeatures.count > 0 + delegate: FlightFeature { + feature: object + visible: object && object.type !== AirspaceRuleFeature.Unknown && object.description !== "" && object.name !== "" + anchors.right: parent.right + anchors.left: parent.left + } + } + } + } + } + Calendar { + id: datePicker + anchors.centerIn: parent + visible: false; + minimumDate: QGroundControl.airspaceManager.flightPlan.flightStartTime + onClicked: { + QGroundControl.airspaceManager.flightPlan.flightStartTime = datePicker.selectedDate + visible = false; + } + } +} diff --git a/src/Airmap/FlightFeature.qml b/src/Airmap/FlightFeature.qml new file mode 100644 index 0000000..d96c53b --- /dev/null +++ b/src/Airmap/FlightFeature.qml @@ -0,0 +1,103 @@ +import QtQuick 2.3 +import QtQuick.Controls 1.2 +import QtQuick.Controls.Styles 1.4 +import QtQuick.Dialogs 1.2 +import QtQml 2.2 + +import QGroundControl 1.0 +import QGroundControl.Airmap 1.0 +import QGroundControl.Airspace 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.Palette 1.0 +import QGroundControl.ScreenTools 1.0 +import QGroundControl.SettingsManager 1.0 + +Rectangle { + id: _root + height: questionCol.height + (ScreenTools.defaultFontPixelHeight * 1.25) + color: qgcPal.windowShade + property var feature: null + QGCPalette { + id: qgcPal + colorGroupEnabled: enabled + } + Column { + id: questionCol + spacing: ScreenTools.defaultFontPixelHeight * 0.5 + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.right: parent.right + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + QGCLabel { + text: feature ? feature.description : "" + anchors.right: parent.right + anchors.left: parent.left + wrapMode: Text.WordWrap + visible: feature ? (feature.type !== AirspaceRuleFeature.Boolean) : false + } + QGCTextField { + text: feature ? (feature.value ? feature.value : "") : "" + visible: feature ? (feature.type !== AirspaceRuleFeature.Boolean) : false + showUnits: true + unitsLabel: { + if(feature) { + if(feature.unit == AirspaceRuleFeature.Kilogram) + return "kg"; + if(feature.unit == AirspaceRuleFeature.Meters) + return "m"; + if(feature.unit == AirspaceRuleFeature.MetersPerSecond) + return "m/s"; + } + return "" + } + anchors.right: parent.right + anchors.left: parent.left + inputMethodHints: feature ? (feature.type === AirspaceRuleFeature.Float ? Qt.ImhFormattedNumbersOnly : Qt.ImhNone) : Qt.ImhNone + onAccepted: { + if(feature) { + if (feature.type === AirspaceRuleFeature.Float) { + feature.value = parseFloat(text) + } + else if (feature.type === AirspaceRuleFeature.String) { + feature.value = text + } + } + } + onEditingFinished: { + if(feature) { + if (feature.type === AirspaceRuleFeature.Float) { + feature.value = parseFloat(text) + } + else if (feature.type === AirspaceRuleFeature.String) { + feature.value = text + } + } + } + } + Item { + height: Math.max(checkBox.height, label.height) + anchors.right: parent.right + anchors.left: parent.left + visible: feature ? (feature.type === AirspaceRuleFeature.Boolean) : false + QGCCheckBox { + id: checkBox + text: "" + onClicked: { if(feature) {feature.value = checked} } + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + Component.onCompleted: { + checked = feature ? (feature.value === 2 ? false : feature.value) : false + } + } + QGCLabel { + id: label + text: feature ? feature.description : "" + anchors.right: parent.right + anchors.left: checkBox.right + anchors.leftMargin: ScreenTools.defaultFontPixelWidth * 0.5 + wrapMode: Text.WordWrap + anchors.verticalCenter: parent.verticalCenter + } + } + } +} diff --git a/src/Airmap/LifetimeChecker.h b/src/Airmap/LifetimeChecker.h new file mode 100644 index 0000000..e0db6bd --- /dev/null +++ b/src/Airmap/LifetimeChecker.h @@ -0,0 +1,29 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#pragma once + +#include + +//----------------------------------------------------------------------------- +/** + * @class LifetimeChecker + * Base class which helps to check if an object instance still exists. + * A subclass can take a weak pointer from _instance and then check if the object was deleted. + * This is used in callbacks that access 'this', but the instance might already be deleted (e.g. vehicle disconnect). + */ +class LifetimeChecker +{ +public: + LifetimeChecker() : _instance(this, [](void*){}) { } + virtual ~LifetimeChecker() = default; + +protected: + std::shared_ptr _instance; +}; diff --git a/src/Airmap/QJsonWebToken/README.md b/src/Airmap/QJsonWebToken/README.md new file mode 100644 index 0000000..8dd2a03 --- /dev/null +++ b/src/Airmap/QJsonWebToken/README.md @@ -0,0 +1,47 @@ +## Introduction + +QJsonWebToken : JWT (JSON Web Token) Implementation in Qt C++ + +This class implements a subset of the [JSON Web Token](https://en.wikipedia.org/wiki/JSON_Web_Token) +open standard [RFC 7519](https://tools.ietf.org/html/rfc7519). + +Currently this implementation **only supports** the following algorithms: + +Alg | Parameter Value Algorithm +----- | ------------------------------------ +HS256 | HMAC using SHA-256 hash algorithm +HS384 | HMAC using SHA-384 hash algorithm +HS512 | HMAC using SHA-512 hash algorithm + +### Include + +In order to include this class in your project, in the qt project **.pro** file add the lines: + +```cmake +HEADERS += ./src/qjsonwebtoken.h +SOURCES += ./src/qjsonwebtoken.cpp +``` + +### Usage + +The repository of this project includes examples that demonstrate the use of this class: + +* ```./examples/jwtcreator/``` : Example that shows how to create a JWT with your custom *payload*. + +* ```./examples/jwtverifier/``` : Example that shows how to validate a JWT with a given *secret*. + +### Limitations + +Currently, `QJsonWebToken` validator, can **only** validate tokens created by `QJsonWebToken` itself. This limitation is due to the usage of Qt's [QJsonDocument API](http://doc.qt.io/qt-5/qjsondocument.html), see [this issue for further explanation](https://github.com/juangburgos/QJsonWebToken/issues/3#issuecomment-333056575). + +### License + +MIT + +``` +The MIT License(MIT) +Copyright(c) <2016> +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions : +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` diff --git a/src/Airmap/QJsonWebToken/src/qjsonwebtoken.cpp b/src/Airmap/QJsonWebToken/src/qjsonwebtoken.cpp new file mode 100644 index 0000000..f207152 --- /dev/null +++ b/src/Airmap/QJsonWebToken/src/qjsonwebtoken.cpp @@ -0,0 +1,337 @@ +// The MIT License(MIT) +// Copyright(c) <2016> +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions : +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#include "qjsonwebtoken.h" + +#include + +QJsonWebToken::QJsonWebToken() +{ + // create the header with default algorithm + setAlgorithmStr("HS256"); + m_jdocPayload = QJsonDocument::fromJson("{}"); + // default for random generation + m_intRandLength = 10; + m_strRandAlphanum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; +} + +QJsonWebToken::QJsonWebToken(const QJsonWebToken &other) +{ + this->m_jdocHeader = other.m_jdocHeader; + this->m_jdocPayload = other.m_jdocPayload; + this->m_byteSignature = other.m_byteSignature; + this->m_strSecret = other.m_strSecret; + this->m_strAlgorithm = other.m_strAlgorithm; +} + +QJsonDocument QJsonWebToken::getHeaderJDoc() +{ + return m_jdocHeader; +} + +QString QJsonWebToken::getHeaderQStr(QJsonDocument::JsonFormat format /*= QJsonDocument::JsonFormat::Indented*/) +{ + return m_jdocHeader.toJson(format); +} + +bool QJsonWebToken::setHeaderJDoc(QJsonDocument jdocHeader) +{ + if (jdocHeader.isEmpty() || jdocHeader.isNull() || !jdocHeader.isObject()) + { + return false; + } + + // check if supported algorithm + QString strAlgorithm = jdocHeader.object().value("alg").toString(); + if (!isAlgorithmSupported(strAlgorithm)) + { + return false; + } + + m_jdocHeader = jdocHeader; + + // set also new algorithm + m_strAlgorithm = strAlgorithm; + + return true; +} + +bool QJsonWebToken::setHeaderQStr(QString strHeader) +{ + QJsonParseError error; + QJsonDocument tmpHeader = QJsonDocument::fromJson(strHeader.toUtf8(), &error); + + // validate and set header + if (error.error != QJsonParseError::NoError || !setHeaderJDoc(tmpHeader)) + { + return false; + } + + return true; +} + +QJsonDocument QJsonWebToken::getPayloadJDoc() +{ + return m_jdocPayload; +} + +QString QJsonWebToken::getPayloadQStr(QJsonDocument::JsonFormat format /*= QJsonDocument::JsonFormat::Indented*/) +{ + return m_jdocPayload.toJson(format); +} + +bool QJsonWebToken::setPayloadJDoc(QJsonDocument jdocPayload) +{ + if (jdocPayload.isEmpty() || jdocPayload.isNull() || !jdocPayload.isObject()) + { + return false; + } + + m_jdocPayload = jdocPayload; + + return true; +} + +bool QJsonWebToken::setPayloadQStr(QString strPayload) +{ + QJsonParseError error; + QJsonDocument tmpPayload = QJsonDocument::fromJson(strPayload.toUtf8(), &error); + + // validate and set payload + if (error.error != QJsonParseError::NoError || !setPayloadJDoc(tmpPayload)) + { + return false; + } + + return true; +} + +QByteArray QJsonWebToken::getSignature() +{ + // recalculate + // get header in compact mode and base64 encoded + QByteArray byteHeaderBase64 = getHeaderQStr(QJsonDocument::JsonFormat::Compact).toUtf8().toBase64(); + // get payload in compact mode and base64 encoded + QByteArray bytePayloadBase64 = getPayloadQStr(QJsonDocument::JsonFormat::Compact).toUtf8().toBase64(); + // calculate signature based on chosen algorithm and secret + m_byteAllData = byteHeaderBase64 + "." + bytePayloadBase64; + if (m_strAlgorithm.compare("HS256", Qt::CaseInsensitive) == 0) // HMAC using SHA-256 hash algorithm + { + m_byteSignature = QMessageAuthenticationCode::hash(m_byteAllData, m_strSecret.toUtf8(), QCryptographicHash::Sha256); + } + else if (m_strAlgorithm.compare("HS384", Qt::CaseInsensitive) == 0) // HMAC using SHA-384 hash algorithm + { + m_byteSignature = QMessageAuthenticationCode::hash(m_byteAllData, m_strSecret.toUtf8(), QCryptographicHash::Sha384); + } + else if (m_strAlgorithm.compare("HS512", Qt::CaseInsensitive) == 0) // HMAC using SHA-512 hash algorithm + { + m_byteSignature = QMessageAuthenticationCode::hash(m_byteAllData, m_strSecret.toUtf8(), QCryptographicHash::Sha512); + } + // TODO : support other algorithms + else + { + m_byteSignature = QByteArray(); + } + // return recalculated + return m_byteSignature; +} + +QByteArray QJsonWebToken::getSignatureBase64() +{ + // note we return through getSignature() to force recalculation + return getSignature().toBase64(); +} + +QString QJsonWebToken::getSecret() +{ + return m_strSecret; +} + +bool QJsonWebToken::setSecret(QString strSecret) +{ + if (strSecret.isEmpty() || strSecret.isNull()) + { + return false; + } + + m_strSecret = strSecret; + + return true; +} + +void QJsonWebToken::setRandomSecret() +{ + m_strSecret.resize(m_intRandLength); + for (int i = 0; i < m_intRandLength; ++i) + { + m_strSecret[i] = m_strRandAlphanum.at(rand() % (m_strRandAlphanum.length() - 1)); + } +} + +QString QJsonWebToken::getAlgorithmStr() +{ + return m_strAlgorithm; +} + +bool QJsonWebToken::setAlgorithmStr(QString strAlgorithm) +{ + // check if supported algorithm + if (!isAlgorithmSupported(strAlgorithm)) + { + return false; + } + // set algorithm + m_strAlgorithm = strAlgorithm; + // modify header + m_jdocHeader = QJsonDocument::fromJson(QStringLiteral("{\"typ\": \"JWT\", \"alg\" : \"").toUtf8() + + m_strAlgorithm.toUtf8() + + QStringLiteral("\"}").toUtf8()); + + return true; +} + +QString QJsonWebToken::getToken() +{ + // important to execute first to update m_byteAllData which contains header + "." + payload in base64 + QByteArray byteSignatureBase64 = getSignatureBase64(); + // compose token and return it + return m_byteAllData + "." + byteSignatureBase64; +} + +bool QJsonWebToken::setToken(QString strToken) +{ + // assume base64 encoded at first, if not try decoding + bool isBase64Encoded = true; + QStringList listJwtParts = strToken.split("."); + // check correct size + if (listJwtParts.count() != 3) + { + return false; + } + // check all parts are valid using another instance, + // so we dont overwrite this instance in case of error + QJsonWebToken tempTokenObj; + if ( !tempTokenObj.setHeaderQStr(QByteArray::fromBase64(listJwtParts.at(0).toUtf8())) || + !tempTokenObj.setPayloadQStr(QByteArray::fromBase64(listJwtParts.at(1).toUtf8())) ) + { + // try unencoded + if (!tempTokenObj.setHeaderQStr(listJwtParts.at(0)) || + !tempTokenObj.setPayloadQStr(listJwtParts.at(1))) + { + return false; + } + else + { + isBase64Encoded = false; + } + } + // set parts on this instance + setHeaderQStr(tempTokenObj.getHeaderQStr()); + setPayloadQStr(tempTokenObj.getPayloadQStr()); + if (isBase64Encoded) + { // unencode + m_byteSignature = QByteArray::fromBase64(listJwtParts.at(2).toUtf8()); + } + else + { + m_byteSignature = listJwtParts.at(2).toUtf8(); + } + // allData not valid anymore + m_byteAllData.clear(); + // success + return true; +} + +QString QJsonWebToken::getRandAlphanum() +{ + return m_strRandAlphanum; +} + +void QJsonWebToken::setRandAlphanum(QString strRandAlphanum) +{ + if(strRandAlphanum.isNull()) + { + return; + } + m_strRandAlphanum = strRandAlphanum; +} + +int QJsonWebToken::getRandLength() +{ + return m_intRandLength; +} + +void QJsonWebToken::setRandLength(int intRandLength) +{ + if(intRandLength < 0 || intRandLength > 1e6) + { + return; + } + m_intRandLength = intRandLength; +} + +bool QJsonWebToken::isValid() +{ + // calculate token on other instance, + // so we dont overwrite this instance's signature + QJsonWebToken tempTokenObj = *this; + if (m_byteSignature != tempTokenObj.getSignature()) + { + return false; + } + return true; +} + +QJsonWebToken QJsonWebToken::fromTokenAndSecret(QString strToken, QString srtSecret) +{ + QJsonWebToken tempTokenObj; + // set Token + tempTokenObj.setToken(strToken); + // set Secret + tempTokenObj.setSecret(srtSecret); + // return + return tempTokenObj; +} + +void QJsonWebToken::appendClaim(QString strClaimType, QString strValue) +{ + // have to make a copy of the json object, modify the copy and then put it back, sigh + QJsonObject jObj = m_jdocPayload.object(); + jObj.insert(strClaimType, strValue); + m_jdocPayload = QJsonDocument(jObj); +} + +void QJsonWebToken::removeClaim(QString strClaimType) +{ + // have to make a copy of the json object, modify the copy and then put it back, sigh + QJsonObject jObj = m_jdocPayload.object(); + jObj.remove(strClaimType); + m_jdocPayload = QJsonDocument(jObj); +} + +bool QJsonWebToken::isAlgorithmSupported(QString strAlgorithm) +{ + // TODO : support other algorithms + if (strAlgorithm.compare("HS256", Qt::CaseInsensitive) != 0 && // HMAC using SHA-256 hash algorithm + strAlgorithm.compare("HS384", Qt::CaseInsensitive) != 0 && // HMAC using SHA-384 hash algorithm + strAlgorithm.compare("HS512", Qt::CaseInsensitive) != 0 /*&& // HMAC using SHA-512 hash algorithm + strAlgorithm.compare("RS256", Qt::CaseInsensitive) != 0 && // RSA using SHA-256 hash algorithm + strAlgorithm.compare("RS384", Qt::CaseInsensitive) != 0 && // RSA using SHA-384 hash algorithm + strAlgorithm.compare("RS512", Qt::CaseInsensitive) != 0 && // RSA using SHA-512 hash algorithm + strAlgorithm.compare("ES256", Qt::CaseInsensitive) != 0 && // ECDSA using P-256 curve and SHA-256 hash algorithm + strAlgorithm.compare("ES384", Qt::CaseInsensitive) != 0 && // ECDSA using P-384 curve and SHA-384 hash algorithm + strAlgorithm.compare("ES512", Qt::CaseInsensitive) != 0*/) // ECDSA using P-521 curve and SHA-512 hash algorithm + { + return false; + } + return true; +} + +QStringList QJsonWebToken::supportedAlgorithms() +{ + // TODO : support other algorithms + return QStringList() << "HS256" << "HS384" << "HS512"; +} diff --git a/src/Airmap/QJsonWebToken/src/qjsonwebtoken.h b/src/Airmap/QJsonWebToken/src/qjsonwebtoken.h new file mode 100644 index 0000000..63482c0 --- /dev/null +++ b/src/Airmap/QJsonWebToken/src/qjsonwebtoken.h @@ -0,0 +1,404 @@ +/** +\file +\version 1.0 +\date 22/06/2016 +\author JGB +\brief JWT (JSON Web Token) Implementation in Qt C++ +*/ + +// The MIT License(MIT) +// Copyright(c) <2016> +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions : +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#ifndef QJSONWEBTOKEN_H +#define QJSONWEBTOKEN_H + +#include +#include +#include +#include + +/** + +\brief QJsonWebToken : JWT (JSON Web Token) Implementation in Qt C++ + +## Introduction + +This class implements a subset of the [JSON Web Token](https://en.wikipedia.org/wiki/JSON_Web_Token) +open standard [RFC 7519](https://tools.ietf.org/html/rfc7519). + +Currently this implementation only supports the following algorithms: + +Alg | Parameter Value Algorithm +----- | ------------------------------------ +HS256 | HMAC using SHA-256 hash algorithm +HS384 | HMAC using SHA-384 hash algorithm +HS512 | HMAC using SHA-512 hash algorithm + +### Include + +In order to include this class in your project, in the qt project **.pro** file add the lines: + +``` +HEADERS += ./src/qjsonwebtoken.h +SOURCES += ./src/qjsonwebtoken.cpp +``` + +### Usage + +The repository of this project includes examples that demonstrate the use of this class: + +* ./examples/jwtcreator/ : Example that shows how to create a JWT with your custom *payload*. + +* ./examples/jwtverifier/ : Example that shows how to validate a JWT with a given *secret*. + +*/ +class QJsonWebToken +{ + +public: + + /** + + \brief Constructor. + \return A new instance of QJsonWebToken. + + Creates a default QJsonWebToken instance with *HS256 algorithm*, empty *payload* + and empty *secret*. + + */ + QJsonWebToken(); // TODO : improve with params + + /** + + \brief Copy Construtor. + \param other Other QJsonWebToken to copy from. + \return A new instance of QJsonWebToken with same contents as the *other* instance. + + Copies to the new instance the JWT *header*, *payload*, *signature*, *secret* and *algorithm*. + + */ + QJsonWebToken(const QJsonWebToken &other); + + /** + + \brief Returns the JWT *header* as a QJsonDocument. + \return JWT *header* as a QJsonDocument. + + */ + QJsonDocument getHeaderJDoc(); + + /** + + \brief Returns the JWT *header* as a QString. + \param format Defines the format of the JSON returned. + \return JWT *header* as a QString. + + Format can be *QJsonDocument::JsonFormat::Indented* or *QJsonDocument::JsonFormat::Compact* + + */ + QString getHeaderQStr(QJsonDocument::JsonFormat format = QJsonDocument::JsonFormat::Indented); + + /** + + \brief Sets the JWT *header* from a QJsonDocument. + \param jdocHeader JWT *header* as a QJsonDocument. + \return true if the header was set, false if the header was not set. + + This method checks for a valid header format and returns false if the header is invalid. + + */ + bool setHeaderJDoc(QJsonDocument jdocHeader); + + /** + + \brief Sets the JWT *header* from a QString. + \param jdocHeader JWT *header* as a QString. + \return true if the header was set, false if the header was not set. + + This method checks for a valid header format and returns false if the header is invalid. + + */ + bool setHeaderQStr(QString strHeader); + + /** + + \brief Returns the JWT *payload* as a QJsonDocument. + \return JWT *payload* as a QJsonDocument. + + */ + QJsonDocument getPayloadJDoc(); + + /** + + \brief Returns the JWT *payload* as a QString. + \param format Defines the format of the JSON returned. + \return JWT *payload* as a QString. + + Format can be *QJsonDocument::JsonFormat::Indented* or *QJsonDocument::JsonFormat::Compact* + + */ + QString getPayloadQStr(QJsonDocument::JsonFormat format = QJsonDocument::JsonFormat::Indented); + + /** + + \brief Sets the JWT *payload* from a QJsonDocument. + \param jdocHeader JWT *payload* as a QJsonDocument. + \return true if the payload was set, false if the payload was not set. + + This method checks for a valid payload format and returns false if the payload is invalid. + + */ + bool setPayloadJDoc(QJsonDocument jdocPayload); + + /** + + \brief Sets the JWT *payload* from a QString. + \param jdocHeader JWT *payload* as a QString. + \return true if the payload was set, false if the payload was not set. + + This method checks for a valid payload format and returns false if the payload is invalid. + + */ + bool setPayloadQStr(QString strPayload); + + /** + + \brief Returns the JWT *signature* as a QByteArray. + \return JWT *signature* as a decoded QByteArray. + + Recalculates the JWT signature given the current *header*, *payload*, *algorithm* and + *secret*. + + \warning This method overwrites the old signature internally. This could be undesired when + the signature was obtained by copying from another QJsonWebToken using the copy constructor. + + */ + QByteArray getSignature(); // WARNING overwrites signature + + /** + + \brief Returns the JWT *signature* as a QByteArray. + \return JWT *signature* as a **base64 encoded** QByteArray. + + Recalculates the JWT signature given the current *header*, *payload*, *algorithm* and + *secret*. Then encodes the calculated signature using base64 encoding. + + \warning This method overwrites the old signature internally. This could be undesired when + the signature was obtained by copying from another QJsonWebToken using the copy constructor. + + */ + QByteArray getSignatureBase64(); // WARNING overwrites signature + + /** + + \brief Returns the JWT *secret* as a QString. + \return JWT *secret* as a QString. + + */ + QString getSecret(); + + /** + + \brief Sets the JWT *secret* from a QString. + \param strSecret JWT *secret* as a QString. + \return true if the secret was set, false if the secret was not set. + + This method checks for a valid secret format and returns false if the secret is invalid. + + */ + bool setSecret(QString strSecret); + + /** + + \brief Creates and sets a random secret. + + This method creates a random secret with the length defined by QJsonWebToken::getRandLength(), + and the characters defined by QJsonWebToken::getRandAlphanum(). + + \sa QJsonWebToken::getRandLength(). + \sa QJsonWebToken::getRandAlphanum(). + + */ + void setRandomSecret(); + + /** + + \brief Returns the JWT *algorithm* as a QString. + \return JWT *algorithm* as a QString. + + */ + QString getAlgorithmStr(); + + /** + + \brief Sets the JWT *algorithm* from a QString. + \param strAlgorithm JWT *algorithm* as a QString. + \return true if the algorithm was set, false if the algorithm was not set. + + This method checks for a valid supported algorithm. Valid values are: + + "HS256", "HS384" and "HS512". + + \sa QJsonWebToken::supportedAlgorithms(). + + */ + bool setAlgorithmStr(QString strAlgorithm); + + /** + + \brief Returns the complete JWT as a QString. + \return Complete JWT as a QString. + + The token has the form: + + ``` + xxxxx.yyyyy.zzzzz + ``` + + where: + + - *xxxxx* is the *header* enconded in base64. + - *yyyyy* is the *payload* enconded in base64. + - *zzzzz* is the *signature* enconded in base64. + + */ + QString getToken(); + + /** + + \brief Sets the complete JWT as a QString. + \param strToken Complete JWT as a QString. + \return true if the complete JWT was set, false if not set. + + This method checks for a valid JWT format. It overwrites the *header*, + *payload* , *signature* and *algorithm*. It does **not** overwrite the secret. + + \sa QJsonWebToken::getToken(). + + */ + bool setToken(QString strToken); + + /** + + \brief Returns the current set of characters used to create random secrets. + \return Set of characters as a QString. + + The default value is "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + + \sa QJsonWebToken::setRandomSecret() + \sa QJsonWebToken::setRandAlphanum() + + */ + QString getRandAlphanum(); + + /** + + \brief Sets the current set of characters used to create random secrets. + \param strRandAlphanum Set of characters as a QString. + + \sa QJsonWebToken::setRandomSecret() + \sa QJsonWebToken::getRandAlphanum() + + */ + void setRandAlphanum(QString strRandAlphanum); + + /** + + \brief Returns the current length used to create random secrets. + \return Length of random secret as a QString. + + The default value is 10; + + \sa QJsonWebToken::setRandomSecret() + \sa QJsonWebToken::setRandLength() + + */ + int getRandLength(); + + /** + + \brief Sets the current length used to create random secrets. + \param intRandLength Length of random secret. + + \sa QJsonWebToken::setRandomSecret() + \sa QJsonWebToken::getRandLength() + + */ + void setRandLength(int intRandLength); + + /** + + \brief Checks validity of current JWT with respect to secret. + \return true if the JWT is valid with respect to secret, else false. + + Uses the current *secret* to calculate a temporary *signature* and compares it to the + current signature to check if they are the same. If they are, true is returned, if not then + false is returned. + + */ + bool isValid(); + + /** + + \brief Creates a QJsonWebToken instance from the complete JWT and a secret. + \param strToken Complete JWT as a QString. + \param srtSecret Secret as a QString. + \return Instance of QJsonWebToken. + + The JWT provided must have a valid format, else a QJsonWebToken instance with default + values will be returned. + + */ + static QJsonWebToken fromTokenAndSecret(QString strToken, QString srtSecret); + + /** + + \brief Returns a list of the supported algorithms. + \return List of supported algorithms as a QStringList. + + */ + static QStringList supportedAlgorithms(); + + /** + + \brief Convenience method to append a claim to the *payload*. + \param strClaimType The claim type as a QString. + \param strValue The value type as a QString. + + Both parameters must be non-empty. If the claim type already exists, the current + claim value is updated. + + */ + void appendClaim(QString strClaimType, QString strValue); + + /** + + \brief Convenience method to remove a claim from the *payload*. + \param strClaimType The claim type as a QString. + + If the claim type does not exist in the *payload*, then this method does nothins. + + */ + void removeClaim(QString strClaimType); + +private: + // properties + QJsonDocument m_jdocHeader; // unencoded + QJsonDocument m_jdocPayload; // unencoded + QByteArray m_byteSignature; // unencoded + QString m_strSecret; + QString m_strAlgorithm; + + int m_intRandLength ; + QString m_strRandAlphanum; + + // helpers + QByteArray m_byteAllData; + + bool isAlgorithmSupported(QString strAlgorithm); +}; + +#endif // QJSONWEBTOKEN_H diff --git a/src/Airmap/QJsonWebToken/src/qjsonwebtoken.pri b/src/Airmap/QJsonWebToken/src/qjsonwebtoken.pri new file mode 100644 index 0000000..3efe5d6 --- /dev/null +++ b/src/Airmap/QJsonWebToken/src/qjsonwebtoken.pri @@ -0,0 +1,7 @@ +CONFIG -= flat + +INCLUDEPATH += $$PWD/ + +SOURCES += $$PWD/qjsonwebtoken.cpp + +HEADERS += $$PWD/qjsonwebtoken.h diff --git a/src/Airmap/README.md b/src/Airmap/README.md new file mode 100644 index 0000000..14e0027 --- /dev/null +++ b/src/Airmap/README.md @@ -0,0 +1,2 @@ +## Work in Progress + diff --git a/src/Airmap/RuleSelector.qml b/src/Airmap/RuleSelector.qml new file mode 100644 index 0000000..dd88b33 --- /dev/null +++ b/src/Airmap/RuleSelector.qml @@ -0,0 +1,55 @@ +import QtQuick 2.11 +import QtQuick.Controls 2.4 + +import QGroundControl 1.0 +import QGroundControl.ScreenTools 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.Palette 1.0 +import QGroundControl.Airmap 1.0 +import QGroundControl.SettingsManager 1.0 + +Button { + id: _root + autoExclusive: false + height: ScreenTools.defaultFontPixelHeight + background: Rectangle { + anchors.fill: parent + color: _selected ? qgcPal.windowShade : qgcPal.window + } + property var rule: null + property bool _selected: { + if (autoExclusive) { + return checked + } else { + return rule ? rule.selected : false + } + } + onCheckedChanged: { + rule.selected = checked + } + contentItem: Row { + id: ruleRow + spacing: ScreenTools.defaultFontPixelWidth + anchors.right: parent.right + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + Rectangle { + width: ScreenTools.defaultFontPixelWidth * 0.75 + height: ScreenTools.defaultFontPixelHeight + color: _selected ? qgcPal.colorGreen : qgcPal.window + anchors.verticalCenter: parent.verticalCenter + } + QGCLabel { + text: rule ? (rule.name === "" ? rule.shortName : rule.name) : "" + font.pointSize: ScreenTools.smallFontPointSize + anchors.verticalCenter: parent.verticalCenter + } + } + onClicked: { + if (autoExclusive) { + checked = true + } else { + rule.selected = !rule.selected + } + } +} diff --git a/src/Airmap/airmap.qrc b/src/Airmap/airmap.qrc new file mode 100644 index 0000000..07e71bf --- /dev/null +++ b/src/Airmap/airmap.qrc @@ -0,0 +1,59 @@ + + + AirmapSettings.qml + AirspaceControl.qml + AirspaceRegulation.qml + AirspaceWeather.qml + ComplianceRules.qml + FlightBrief.qml + FlightDetails.qml + FlightFeature.qml + ../QmlControls/QGroundControl/Airmap/qmldir + RuleSelector.qml + + + AirMap.SettingsGroup.json + + + images/advisory-icon.svg + images/colapse.svg + images/expand.svg + images/pencil.svg + images/right-arrow.svg + images/unavailable.svg + + + images/weather-icons/clear.svg + images/weather-icons/sunny.svg + images/weather-icons/cloudy.svg + images/weather-icons/cloudy_wind.svg + images/weather-icons/drizzle.svg + images/weather-icons/drizzle_day.svg + images/weather-icons/drizzle_night.svg + images/weather-icons/foggy.svg + images/weather-icons/frigid.svg + images/weather-icons/hail.svg + images/weather-icons/heavy_rain.svg + images/weather-icons/hurricane.svg + images/weather-icons/isolated_thunderstorms.svg + images/weather-icons/mostly_clear.svg + images/weather-icons/mostly_cloudy_day.svg + images/weather-icons/mostly_cloudy_night.svg + images/weather-icons/mostly_sunny.svg + images/weather-icons/partly_cloudy_day.svg + images/weather-icons/partly_cloudy_night.svg + images/weather-icons/rain.svg + images/weather-icons/rain_snow.svg + images/weather-icons/scattered_snow_showers_day.svg + images/weather-icons/scattered_snow_showers_night.svg + images/weather-icons/scattered_thunderstorms_day.svg + images/weather-icons/scattered_thunderstorms_night.svg + images/weather-icons/snow.svg + images/weather-icons/snow_storm.svg + images/weather-icons/sunny.svg + images/weather-icons/thunderstorm.svg + images/weather-icons/tornado.svg + images/weather-icons/unknown.svg + images/weather-icons/windy.svg + + diff --git a/src/Airmap/dummy/AirspaceControl.qml b/src/Airmap/dummy/AirspaceControl.qml new file mode 100644 index 0000000..ca9b339 --- /dev/null +++ b/src/Airmap/dummy/AirspaceControl.qml @@ -0,0 +1,6 @@ +import QtQuick 2.3 +Item { + property bool colapsed: true + property bool showColapse: false + property bool planView: false +} diff --git a/src/Airmap/dummy/AirspaceManager.cc b/src/Airmap/dummy/AirspaceManager.cc new file mode 100644 index 0000000..2f99417 --- /dev/null +++ b/src/Airmap/dummy/AirspaceManager.cc @@ -0,0 +1,35 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + + +#include "AirspaceManager.h" +#include "QGCApplication.h" + +AirspaceManager::AirspaceManager(QGCApplication* app, QGCToolbox* toolbox) + : QGCTool(app, toolbox) +{ + qmlRegisterUncreatableType ("QGroundControl.Airspace", 1, 0, "AirspaceManager", "Reference only"); +} + +AirspaceManager::~AirspaceManager() +{ +} + +void AirspaceManager::setToolbox(QGCToolbox* toolbox) +{ + QGCTool::setToolbox(toolbox); +} + +void AirspaceManager::setROI(const QGeoCoordinate& pointNW, const QGeoCoordinate& pointSE, bool planView, bool reset) +{ + Q_UNUSED(pointNW); + Q_UNUSED(pointSE); + Q_UNUSED(planView); + Q_UNUSED(reset) +} diff --git a/src/Airmap/dummy/AirspaceManager.h b/src/Airmap/dummy/AirspaceManager.h new file mode 100644 index 0000000..546bef6 --- /dev/null +++ b/src/Airmap/dummy/AirspaceManager.h @@ -0,0 +1,58 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#pragma once + +/** + * @file AirspaceManager.h + * Dummy file for when airspace management is disabled + */ + +#include "QGCToolbox.h" +#include + +//----------------------------------------------------------------------------- +/** + * @class AirspaceManager + * Base class for airspace management. There is one (global) instantiation of this + */ +class AirspaceManager : public QGCTool { + Q_OBJECT +public: + AirspaceManager(QGCApplication* app, QGCToolbox* toolbox); + virtual ~AirspaceManager() override; + + Q_PROPERTY(QString providerName READ providerName CONSTANT) + Q_PROPERTY(QObject* weatherInfo READ weatherInfo CONSTANT) + Q_PROPERTY(QObject* advisories READ advisories CONSTANT) + Q_PROPERTY(QObject* ruleSets READ ruleSets CONSTANT) + Q_PROPERTY(QObject* airspaces READ airspaces CONSTANT) + Q_PROPERTY(QObject* flightPlan READ flightPlan CONSTANT) + Q_PROPERTY(bool airspaceVisible READ airspaceVisible CONSTANT) + + Q_INVOKABLE void setROI (const QGeoCoordinate& pointNW, const QGeoCoordinate& pointSE, bool planView, bool reset = false); + + QObject* weatherInfo () { return &_dummy; } + QObject* advisories () { return &_dummy; } + QObject* ruleSets () { return &_dummy; } + QObject* airspaces () { return &_dummy; } + QObject* flightPlan () { return &_dummy; } + + void setToolbox(QGCToolbox* toolbox) override; + + virtual QString providerName () const { return QString("None"); } + + virtual bool airspaceVisible () { return false; } + +signals: + void airspaceVisibleChanged (); + +private: + QObject _dummy; +}; diff --git a/src/Airmap/dummy/AirspaceRegulation.qml b/src/Airmap/dummy/AirspaceRegulation.qml new file mode 100644 index 0000000..9009b3f --- /dev/null +++ b/src/Airmap/dummy/AirspaceRegulation.qml @@ -0,0 +1,3 @@ +import QtQuick 2.3 +Item { +} diff --git a/src/Airmap/dummy/AirspaceWeather.qml b/src/Airmap/dummy/AirspaceWeather.qml new file mode 100644 index 0000000..a48aacc --- /dev/null +++ b/src/Airmap/dummy/AirspaceWeather.qml @@ -0,0 +1,4 @@ +import QtQuick 2.3 +Item { + property var iconHeight: 0 +} diff --git a/src/Airmap/dummy/ComplianceRules.qml b/src/Airmap/dummy/ComplianceRules.qml new file mode 100644 index 0000000..5c0536c --- /dev/null +++ b/src/Airmap/dummy/ComplianceRules.qml @@ -0,0 +1,5 @@ +import QtQuick 2.3 + +Item { + +} diff --git a/src/Airmap/dummy/FlightBrief.qml b/src/Airmap/dummy/FlightBrief.qml new file mode 100644 index 0000000..5c0536c --- /dev/null +++ b/src/Airmap/dummy/FlightBrief.qml @@ -0,0 +1,5 @@ +import QtQuick 2.3 + +Item { + +} diff --git a/src/Airmap/dummy/FlightDetails.qml b/src/Airmap/dummy/FlightDetails.qml new file mode 100644 index 0000000..5c0536c --- /dev/null +++ b/src/Airmap/dummy/FlightDetails.qml @@ -0,0 +1,5 @@ +import QtQuick 2.3 + +Item { + +} diff --git a/src/Airmap/dummy/FlightFeature.qml b/src/Airmap/dummy/FlightFeature.qml new file mode 100644 index 0000000..5c0536c --- /dev/null +++ b/src/Airmap/dummy/FlightFeature.qml @@ -0,0 +1,5 @@ +import QtQuick 2.3 + +Item { + +} diff --git a/src/Airmap/dummy/QGroundControl.Airmap.qmldir b/src/Airmap/dummy/QGroundControl.Airmap.qmldir new file mode 100644 index 0000000..0196743 --- /dev/null +++ b/src/Airmap/dummy/QGroundControl.Airmap.qmldir @@ -0,0 +1,5 @@ +Module QGroundControl.Airmap + +AirspaceControl 1.0 AirspaceControl.qml +AirspaceRegulation 1.0 AirspaceRegulation.qml +AirspaceWeather 1.0 AirspaceWeather.qml diff --git a/src/Airmap/dummy/RuleSelector.qml b/src/Airmap/dummy/RuleSelector.qml new file mode 100644 index 0000000..5c0536c --- /dev/null +++ b/src/Airmap/dummy/RuleSelector.qml @@ -0,0 +1,5 @@ +import QtQuick 2.3 + +Item { + +} diff --git a/src/Airmap/dummy/airmap_dummy.qrc b/src/Airmap/dummy/airmap_dummy.qrc new file mode 100644 index 0000000..ea38277 --- /dev/null +++ b/src/Airmap/dummy/airmap_dummy.qrc @@ -0,0 +1,13 @@ + + + QGroundControl.Airmap.qmldir + AirspaceControl.qml + AirspaceRegulation.qml + AirspaceWeather.qml + ComplianceRules.qml + FlightBrief.qml + FlightDetails.qml + FlightFeature.qml + RuleSelector.qml + + diff --git a/src/Airmap/images/advisory-icon.svg b/src/Airmap/images/advisory-icon.svg new file mode 100644 index 0000000..9141d18 --- /dev/null +++ b/src/Airmap/images/advisory-icon.svg @@ -0,0 +1,21 @@ + + + + +Page 1 +Created with Sketch. + + + + + + diff --git a/src/Airmap/images/colapse.svg b/src/Airmap/images/colapse.svg new file mode 100644 index 0000000..bf33cf0 --- /dev/null +++ b/src/Airmap/images/colapse.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/src/Airmap/images/expand.svg b/src/Airmap/images/expand.svg new file mode 100644 index 0000000..196447d --- /dev/null +++ b/src/Airmap/images/expand.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/src/Airmap/images/pencil.svg b/src/Airmap/images/pencil.svg new file mode 100644 index 0000000..2b98ce6 --- /dev/null +++ b/src/Airmap/images/pencil.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/src/Airmap/images/right-arrow.svg b/src/Airmap/images/right-arrow.svg new file mode 100644 index 0000000..811093e --- /dev/null +++ b/src/Airmap/images/right-arrow.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/src/Airmap/images/unavailable.svg b/src/Airmap/images/unavailable.svg new file mode 100644 index 0000000..71a646b --- /dev/null +++ b/src/Airmap/images/unavailable.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/src/Airmap/images/weather-icons/clear.svg b/src/Airmap/images/weather-icons/clear.svg new file mode 100755 index 0000000..5a34322 --- /dev/null +++ b/src/Airmap/images/weather-icons/clear.svg @@ -0,0 +1,12 @@ + + + + clear + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/cloudy.svg b/src/Airmap/images/weather-icons/cloudy.svg new file mode 100755 index 0000000..33b8f68 --- /dev/null +++ b/src/Airmap/images/weather-icons/cloudy.svg @@ -0,0 +1,12 @@ + + + + cloudy + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/cloudy_wind.svg b/src/Airmap/images/weather-icons/cloudy_wind.svg new file mode 100755 index 0000000..350f6bd --- /dev/null +++ b/src/Airmap/images/weather-icons/cloudy_wind.svg @@ -0,0 +1,12 @@ + + + + cloudy_wind + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/drizzle.svg b/src/Airmap/images/weather-icons/drizzle.svg new file mode 100755 index 0000000..4e3b411 --- /dev/null +++ b/src/Airmap/images/weather-icons/drizzle.svg @@ -0,0 +1,12 @@ + + + + drizzle + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/drizzle_day.svg b/src/Airmap/images/weather-icons/drizzle_day.svg new file mode 100755 index 0000000..62c8adc --- /dev/null +++ b/src/Airmap/images/weather-icons/drizzle_day.svg @@ -0,0 +1,12 @@ + + + + drizzle_day + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/drizzle_night.svg b/src/Airmap/images/weather-icons/drizzle_night.svg new file mode 100755 index 0000000..7a95b95 --- /dev/null +++ b/src/Airmap/images/weather-icons/drizzle_night.svg @@ -0,0 +1,12 @@ + + + + drizzle_night + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/foggy.svg b/src/Airmap/images/weather-icons/foggy.svg new file mode 100755 index 0000000..4c77893 --- /dev/null +++ b/src/Airmap/images/weather-icons/foggy.svg @@ -0,0 +1,18 @@ + + + + foggy + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/frigid.svg b/src/Airmap/images/weather-icons/frigid.svg new file mode 100755 index 0000000..3fbea9a --- /dev/null +++ b/src/Airmap/images/weather-icons/frigid.svg @@ -0,0 +1,13 @@ + + + + frigid + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/hail.svg b/src/Airmap/images/weather-icons/hail.svg new file mode 100755 index 0000000..58f3ede --- /dev/null +++ b/src/Airmap/images/weather-icons/hail.svg @@ -0,0 +1,12 @@ + + + + hail + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/heavy_rain.svg b/src/Airmap/images/weather-icons/heavy_rain.svg new file mode 100755 index 0000000..c955fa1 --- /dev/null +++ b/src/Airmap/images/weather-icons/heavy_rain.svg @@ -0,0 +1,12 @@ + + + + heavy_rain + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/hurricane.svg b/src/Airmap/images/weather-icons/hurricane.svg new file mode 100755 index 0000000..1a10107 --- /dev/null +++ b/src/Airmap/images/weather-icons/hurricane.svg @@ -0,0 +1,14 @@ + + + + hurricane + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/isolated_thunderstorms.svg b/src/Airmap/images/weather-icons/isolated_thunderstorms.svg new file mode 100755 index 0000000..c486070 --- /dev/null +++ b/src/Airmap/images/weather-icons/isolated_thunderstorms.svg @@ -0,0 +1,12 @@ + + + + isolated_thunderstorms + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/mostly_clear.svg b/src/Airmap/images/weather-icons/mostly_clear.svg new file mode 100755 index 0000000..9946586 --- /dev/null +++ b/src/Airmap/images/weather-icons/mostly_clear.svg @@ -0,0 +1,12 @@ + + + + mostly_clear + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/mostly_cloudy_day.svg b/src/Airmap/images/weather-icons/mostly_cloudy_day.svg new file mode 100755 index 0000000..c820b41 --- /dev/null +++ b/src/Airmap/images/weather-icons/mostly_cloudy_day.svg @@ -0,0 +1,12 @@ + + + + mostly_cloudy_day + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/mostly_cloudy_night.svg b/src/Airmap/images/weather-icons/mostly_cloudy_night.svg new file mode 100755 index 0000000..673b54c --- /dev/null +++ b/src/Airmap/images/weather-icons/mostly_cloudy_night.svg @@ -0,0 +1,12 @@ + + + + mostly_cloudy_night + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/mostly_sunny.svg b/src/Airmap/images/weather-icons/mostly_sunny.svg new file mode 100755 index 0000000..047ccc4 --- /dev/null +++ b/src/Airmap/images/weather-icons/mostly_sunny.svg @@ -0,0 +1,12 @@ + + + + mostly_sunny + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/partly_cloudy_day.svg b/src/Airmap/images/weather-icons/partly_cloudy_day.svg new file mode 100755 index 0000000..456db3b --- /dev/null +++ b/src/Airmap/images/weather-icons/partly_cloudy_day.svg @@ -0,0 +1,12 @@ + + + + partly_cloudy_day + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/partly_cloudy_night.svg b/src/Airmap/images/weather-icons/partly_cloudy_night.svg new file mode 100755 index 0000000..79374a2 --- /dev/null +++ b/src/Airmap/images/weather-icons/partly_cloudy_night.svg @@ -0,0 +1,12 @@ + + + + partyly_cloudy_night + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/rain.svg b/src/Airmap/images/weather-icons/rain.svg new file mode 100755 index 0000000..a7ee9ed --- /dev/null +++ b/src/Airmap/images/weather-icons/rain.svg @@ -0,0 +1,12 @@ + + + + rain + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/rain_snow.svg b/src/Airmap/images/weather-icons/rain_snow.svg new file mode 100755 index 0000000..21c2f32 --- /dev/null +++ b/src/Airmap/images/weather-icons/rain_snow.svg @@ -0,0 +1,14 @@ + + + + rain_snow + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/scattered_snow_showers_day.svg b/src/Airmap/images/weather-icons/scattered_snow_showers_day.svg new file mode 100755 index 0000000..ddaa563 --- /dev/null +++ b/src/Airmap/images/weather-icons/scattered_snow_showers_day.svg @@ -0,0 +1,14 @@ + + + + scattered_snow_showers_day + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/scattered_snow_showers_night.svg b/src/Airmap/images/weather-icons/scattered_snow_showers_night.svg new file mode 100755 index 0000000..11cf9fc --- /dev/null +++ b/src/Airmap/images/weather-icons/scattered_snow_showers_night.svg @@ -0,0 +1,14 @@ + + + + scattered_snow_showers_night + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/scattered_thunderstorms_day.svg b/src/Airmap/images/weather-icons/scattered_thunderstorms_day.svg new file mode 100755 index 0000000..22c68ef --- /dev/null +++ b/src/Airmap/images/weather-icons/scattered_thunderstorms_day.svg @@ -0,0 +1,13 @@ + + + + scattered_thunderstorms_day + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/scattered_thunderstorms_night.svg b/src/Airmap/images/weather-icons/scattered_thunderstorms_night.svg new file mode 100755 index 0000000..dd6c2e2 --- /dev/null +++ b/src/Airmap/images/weather-icons/scattered_thunderstorms_night.svg @@ -0,0 +1,12 @@ + + + + scattered_thunderstorms_night + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/snow.svg b/src/Airmap/images/weather-icons/snow.svg new file mode 100755 index 0000000..26f3fcb --- /dev/null +++ b/src/Airmap/images/weather-icons/snow.svg @@ -0,0 +1,15 @@ + + + + snow + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/snow_storm.svg b/src/Airmap/images/weather-icons/snow_storm.svg new file mode 100755 index 0000000..1049f19 --- /dev/null +++ b/src/Airmap/images/weather-icons/snow_storm.svg @@ -0,0 +1,15 @@ + + + + snow_storm + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/sunny.svg b/src/Airmap/images/weather-icons/sunny.svg new file mode 100755 index 0000000..a5b2d49 --- /dev/null +++ b/src/Airmap/images/weather-icons/sunny.svg @@ -0,0 +1,12 @@ + + + + sunny + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/thunderstorm.svg b/src/Airmap/images/weather-icons/thunderstorm.svg new file mode 100755 index 0000000..57973e8 --- /dev/null +++ b/src/Airmap/images/weather-icons/thunderstorm.svg @@ -0,0 +1,12 @@ + + + + thunderstorm + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/tornado.svg b/src/Airmap/images/weather-icons/tornado.svg new file mode 100755 index 0000000..529b698 --- /dev/null +++ b/src/Airmap/images/weather-icons/tornado.svg @@ -0,0 +1,12 @@ + + + + tornado + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/Airmap/images/weather-icons/unknown.svg b/src/Airmap/images/weather-icons/unknown.svg new file mode 100644 index 0000000..4533afd --- /dev/null +++ b/src/Airmap/images/weather-icons/unknown.svg @@ -0,0 +1,14 @@ + + + +sunny +Created with Sketch. + + + + diff --git a/src/Airmap/images/weather-icons/windy.svg b/src/Airmap/images/weather-icons/windy.svg new file mode 100755 index 0000000..5b77480 --- /dev/null +++ b/src/Airmap/images/weather-icons/windy.svg @@ -0,0 +1,12 @@ + + + + windy + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/Airmap/services/advisory.cpp b/src/Airmap/services/advisory.cpp new file mode 100644 index 0000000..25724c2 --- /dev/null +++ b/src/Airmap/services/advisory.cpp @@ -0,0 +1,36 @@ +#include + +std::shared_ptr airmap::services::Advisory::create(const std::shared_ptr& dispatcher, + const std::shared_ptr& client) { + return std::shared_ptr{new Advisory{dispatcher, client}}; +} + +airmap::services::Advisory::Advisory(const std::shared_ptr& dispatcher, + const std::shared_ptr& client) + : dispatcher_{dispatcher}, client_{client} { +} + +void airmap::services::Advisory::for_id(const ForId::Parameters& parameters, const ForId::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->advisory().for_id(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::Advisory::search(const Search::Parameters& parameters, const Search::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->advisory().search(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::Advisory::report_weather(const ReportWeather::Parameters& parameters, + const ReportWeather::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->advisory().report_weather(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} diff --git a/src/Airmap/services/advisory.h b/src/Airmap/services/advisory.h new file mode 100644 index 0000000..5c58144 --- /dev/null +++ b/src/Airmap/services/advisory.h @@ -0,0 +1,29 @@ +#ifndef AIRMAP_QT_ADVISORY_H_ +#define AIRMAP_QT_ADVISORY_H_ + +#include +#include +#include "dispatcher.h" + +namespace airmap { +namespace services { + +class Advisory : public airmap::Advisory, public std::enable_shared_from_this { + public: + static std::shared_ptr create(const std::shared_ptr& dispatcher, + const std::shared_ptr& client); + + void for_id(const ForId::Parameters& parameters, const ForId::Callback& cb) override; + void search(const Search::Parameters& parameters, const Search::Callback& cb) override; + void report_weather(const ReportWeather::Parameters& parameters, const ReportWeather::Callback& cb) override; + + private: + explicit Advisory(const std::shared_ptr& dispatcher, const std::shared_ptr& client); + std::shared_ptr dispatcher_; + std::shared_ptr client_; +}; + +} // namespace qt +} // namespace airmap + +#endif // AIRMAP_QT_ADVISORY_H_ diff --git a/src/Airmap/services/aircrafts.cpp b/src/Airmap/services/aircrafts.cpp new file mode 100644 index 0000000..d086966 --- /dev/null +++ b/src/Airmap/services/aircrafts.cpp @@ -0,0 +1,36 @@ +#include + +std::shared_ptr airmap::services::Aircrafts::create(const std::shared_ptr& dispatcher, + const std::shared_ptr& client) { + return std::shared_ptr{new Aircrafts{dispatcher, client}}; +} + +airmap::services::Aircrafts::Aircrafts(const std::shared_ptr& dispatcher, + const std::shared_ptr& client) + : dispatcher_{dispatcher}, client_{client} { +} + +void airmap::services::Aircrafts::manufacturers(const Manufacturers::Parameters& parameters, + const Manufacturers::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->aircrafts().manufacturers(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::Aircrafts::models(const Models::Parameters& parameters, const Models::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->aircrafts().models(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::Aircrafts::model_for_id(const ModelForId::Parameters& parameters, const ModelForId::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->aircrafts().model_for_id(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} diff --git a/src/Airmap/services/aircrafts.h b/src/Airmap/services/aircrafts.h new file mode 100644 index 0000000..83be8aa --- /dev/null +++ b/src/Airmap/services/aircrafts.h @@ -0,0 +1,32 @@ +#ifndef AIRMAP_QT_AIRCRAFTS_H_ +#define AIRMAP_QT_AIRCRAFTS_H_ + +#include +#include +#include + +#include +#include + +namespace airmap { +namespace services { + +class Aircrafts : public airmap::Aircrafts, public std::enable_shared_from_this { + public: + static std::shared_ptr create(const std::shared_ptr& dispatcher, + const std::shared_ptr& client); + + void manufacturers(const Manufacturers::Parameters& parameters, const Manufacturers::Callback& cb) override; + void models(const Models::Parameters& parameters, const Models::Callback& cb) override; + void model_for_id(const ModelForId::Parameters& parameters, const ModelForId::Callback& cb) override; + + private: + explicit Aircrafts(const std::shared_ptr& dispatcher, const std::shared_ptr& client); + std::shared_ptr dispatcher_; + std::shared_ptr client_; +}; + +} // namespace qt +} // namespace airmap + +#endif // AIRMAP_QT_AIRCRAFTS_H_ diff --git a/src/Airmap/services/airspaces.cpp b/src/Airmap/services/airspaces.cpp new file mode 100644 index 0000000..556fa87 --- /dev/null +++ b/src/Airmap/services/airspaces.cpp @@ -0,0 +1,27 @@ +#include + +std::shared_ptr airmap::services::Airspaces::create(const std::shared_ptr& dispatcher, + const std::shared_ptr& client) { + return std::shared_ptr{new Airspaces{dispatcher, client}}; +} + +airmap::services::Airspaces::Airspaces(const std::shared_ptr& dispatcher, + const std::shared_ptr& client) + : dispatcher_{dispatcher}, client_{client} { +} + +void airmap::services::Airspaces::search(const Search::Parameters& parameters, const Search::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->airspaces().search(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::Airspaces::for_ids(const ForIds::Parameters& parameters, const ForIds::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->airspaces().for_ids(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} diff --git a/src/Airmap/services/airspaces.h b/src/Airmap/services/airspaces.h new file mode 100644 index 0000000..920b7b3 --- /dev/null +++ b/src/Airmap/services/airspaces.h @@ -0,0 +1,31 @@ +#ifndef AIRMAP_QT_AIRSPACES_H_ +#define AIRMAP_QT_AIRSPACES_H_ + +#include +#include +#include + +#include + +namespace airmap { +namespace services { + +class Airspaces : public airmap::Airspaces, public std::enable_shared_from_this { + public: + static std::shared_ptr create(const std::shared_ptr& dispatcher, + const std::shared_ptr& client); + + void search(const Search::Parameters& parameters, const Search::Callback& cb) override; + void for_ids(const ForIds::Parameters& parameters, const ForIds::Callback& cb) override; + + private: + explicit Airspaces(const std::shared_ptr& dispatcher, const std::shared_ptr& client); + + std::shared_ptr dispatcher_; + std::shared_ptr client_; +}; + +} // namespace qt +} // namespace airmap + +#endif // AIRMAP_QT_AIRSPACES_H_ diff --git a/src/Airmap/services/authenticator.cpp b/src/Airmap/services/authenticator.cpp new file mode 100644 index 0000000..8371387 --- /dev/null +++ b/src/Airmap/services/authenticator.cpp @@ -0,0 +1,38 @@ +#include + +std::shared_ptr airmap::services::Authenticator::create( + const std::shared_ptr& dispatcher, const std::shared_ptr& client) { + return std::shared_ptr{new Authenticator{dispatcher, client}}; +} + +airmap::services::Authenticator::Authenticator(const std::shared_ptr& dispatcher, + const std::shared_ptr& client) + : dispatcher_{dispatcher}, client_{client} { +} + +void airmap::services::Authenticator::authenticate_with_password(const AuthenticateWithPassword::Params& parameters, + const AuthenticateWithPassword::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->authenticator().authenticate_with_password(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::Authenticator::authenticate_anonymously(const AuthenticateAnonymously::Params& parameters, + const AuthenticateAnonymously::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->authenticator().authenticate_anonymously(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::Authenticator::renew_authentication(const RenewAuthentication::Params& parameters, + const RenewAuthentication::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->authenticator().renew_authentication(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} diff --git a/src/Airmap/services/authenticator.h b/src/Airmap/services/authenticator.h new file mode 100644 index 0000000..00e96c4 --- /dev/null +++ b/src/Airmap/services/authenticator.h @@ -0,0 +1,37 @@ +#ifndef AIRMAP_QT_AUTHENTICATOR_H_ +#define AIRMAP_QT_AUTHENTICATOR_H_ + +#include +#include +#include + +#include + +namespace airmap { +namespace services { + +class Authenticator : public airmap::Authenticator, public std::enable_shared_from_this { + public: + static std::shared_ptr create(const std::shared_ptr& dispatcher, + const std::shared_ptr& client); + + void authenticate_with_password(const AuthenticateWithPassword::Params& params, + const AuthenticateWithPassword::Callback& cb) override; + + void authenticate_anonymously(const AuthenticateAnonymously::Params& params, + const AuthenticateAnonymously::Callback& cb) override; + + void renew_authentication(const RenewAuthentication::Params& params, + const RenewAuthentication::Callback& cb) override; + + private: + explicit Authenticator(const std::shared_ptr& dispatcher, const std::shared_ptr& client); + + std::shared_ptr dispatcher_; + std::shared_ptr client_; +}; + +} // namespace qt +} // namespace airmap + +#endif // AIRMAP_QT_AUTHENTICATOR_H_ diff --git a/src/Airmap/services/client.cpp b/src/Airmap/services/client.cpp new file mode 100644 index 0000000..aea558d --- /dev/null +++ b/src/Airmap/services/client.cpp @@ -0,0 +1,166 @@ +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace { + +class ContextRunner { + public: + explicit ContextRunner(const std::shared_ptr& context) : context_{context} { + } + + void start() { + worker_ = std::thread{[this]() { context_->run(); }}; + } + + void stop() { + context_->stop(); + if (worker_.joinable()) + worker_.join(); + } + + const std::shared_ptr& context() const { + return context_; + } + + private: + std::shared_ptr context_; + std::thread worker_; +}; + +} // namespace + +struct airmap::services::Client::Private { + explicit Private(const Client::Configuration& configuration, const std::shared_ptr& context_runner, + const std::shared_ptr& dispatcher, const std::shared_ptr& client) + : configuration_{configuration}, + context_runner_{context_runner}, + dispatcher_{dispatcher}, + client_{client}, + advisory_{airmap::services::Advisory::create(dispatcher_, client_)}, + aircrafts_{airmap::services::Aircrafts::create(dispatcher_, client_)}, + airspaces_{airmap::services::Airspaces::create(dispatcher_, client_)}, + authenticator_{airmap::services::Authenticator::create(dispatcher_, client_)}, + flight_plans_{airmap::services::FlightPlans::create(dispatcher_, client_)}, + flights_{airmap::services::Flights::create(dispatcher_, client_)}, + pilots_{airmap::services::Pilots::create(dispatcher_, client_)}, + rulesets_{airmap::services::RuleSets::create(dispatcher_, client_)}, + status_{airmap::services::Status::create(dispatcher_, client_)}, + telemetry_{airmap::services::Telemetry::create(dispatcher_, client_)}, + traffic_{airmap::services::Traffic::create(dispatcher_, client_)} { + } + + ~Private() { + context_runner_->stop(); + } + + Client::Configuration configuration_; + std::shared_ptr context_runner_; + std::shared_ptr dispatcher_; + std::shared_ptr client_; + std::shared_ptr advisory_; + std::shared_ptr aircrafts_; + std::shared_ptr airspaces_; + std::shared_ptr authenticator_; + std::shared_ptr flight_plans_; + std::shared_ptr flights_; + std::shared_ptr pilots_; + std::shared_ptr rulesets_; + std::shared_ptr status_; + std::shared_ptr telemetry_; + std::shared_ptr traffic_; +}; + +void airmap::services::Client::create(const Client::Configuration& configuration, const std::shared_ptr& logger, + QObject* parent, const CreateCallback& cb) { + register_types(); + + auto result = Context::create(logger); + auto dispatcher = std::make_shared(result.value()); + + if (!result) { + dispatcher->dispatch_to_qt([result, cb]() { cb(CreateResult{result.error()}); }); + } else { + auto cr = std::make_shared(result.value()); + + cr->context()->create_client_with_configuration( + configuration, [dispatcher, configuration, parent, cr, cb](const auto& result) { + dispatcher->dispatch_to_qt([dispatcher, configuration, parent, cr, result, cb]() { + if (result) { + cb(CreateResult{new Client{ + std::unique_ptr{new Private{configuration, cr, dispatcher, result.value()}}, parent}}); + } else { + cb(CreateResult{result.error()}); + } + }); + }); + + cr->start(); + } +} + +airmap::services::Client::Client(std::unique_ptr&& d, QObject* parent) : QObject{parent}, d_{std::move(d)} { +} + +airmap::services::Client::~Client() = default; + +// From airmap::Client +airmap::Authenticator& airmap::services::Client::authenticator() { + return *d_->authenticator_; +} + +airmap::Advisory& airmap::services::Client::advisory() { + return *d_->advisory_; +} + +airmap::Aircrafts& airmap::services::Client::aircrafts() { + return *d_->aircrafts_; +} + +airmap::Airspaces& airmap::services::Client::airspaces() { + return *d_->airspaces_; +} + +airmap::FlightPlans& airmap::services::Client::flight_plans() { + return *d_->flight_plans_; +} + +airmap::Flights& airmap::services::Client::flights() { + return *d_->flights_; +} + +airmap::Pilots& airmap::services::Client::pilots() { + return *d_->pilots_; +} + +airmap::RuleSets& airmap::services::Client::rulesets() { + return *d_->rulesets_; +} + +airmap::Status& airmap::services::Client::status() { + return *d_->status_; +} + +airmap::Telemetry& airmap::services::Client::telemetry() { + return *d_->telemetry_; +} + +airmap::Traffic& airmap::services::Client::traffic() { + return *d_->traffic_; +} diff --git a/src/Airmap/services/client.h b/src/Airmap/services/client.h new file mode 100644 index 0000000..a06e38a --- /dev/null +++ b/src/Airmap/services/client.h @@ -0,0 +1,65 @@ +#ifndef AIRMAP_QT_CLIENT_H_ +#define AIRMAP_QT_CLIENT_H_ + +#include +#include +#include +#include +#include +#include + +#include + +namespace airmap { +/// @namespace namespace services bundles up types and functions that help with integrating AirMap functionality +/// into Qt-based applications and libraries. +namespace services { + +/// Client implements the airmap::Client interface, bridging over between +/// the Qt event loop and the native event loop of the airmap::Client. +/// +/// All callback invocations that might happen in the context of a Client instance +/// are dispatched to the Qt applications' main thread. +class AIRMAP_EXPORT Client : public QObject, public airmap::Client { + public: + using CreateResult = Outcome; + using CreateCallback = std::function; + + /// create creates a new Client instance with parent 'parent', logging to 'logger', using the config + /// 'configuration'. The result of the request is reported to 'cb', on the thread that issued the create request. + /// + /// Please note that this function must be called on Qt's main thread as event dispatching between different + /// event loops to the Qt world is set up here. + static void create(const Client::Configuration& configuration, const std::shared_ptr& logger, QObject* parent, + const CreateCallback& cb); + + ~Client() override; + + // From airmap::Client + Authenticator& authenticator() override; + Advisory& advisory() override; + Aircrafts& aircrafts() override; + Airspaces& airspaces() override; + FlightPlans& flight_plans() override; + Flights& flights() override; + Pilots& pilots() override; + RuleSets& rulesets() override; + Status& status() override; + Telemetry& telemetry() override; + Traffic& traffic() override; + + private: + /// @cond + struct Private; + Client(std::unique_ptr&& d, QObject* parent); + std::unique_ptr d_; + /// @endcond +}; + +} // namespace qt +} // namespace airmap + +/// @example qt/client.cpp +/// Illustrates how to use airmap::services::Client, airmap::services::DispatchingLogger and airmap::services::Logger. + +#endif // AIRMAP_QT_CLIENT_H_ diff --git a/src/Airmap/services/dispatcher.cpp b/src/Airmap/services/dispatcher.cpp new file mode 100644 index 0000000..f481a67 --- /dev/null +++ b/src/Airmap/services/dispatcher.cpp @@ -0,0 +1,62 @@ +#include + +#include +#include + +#include + +QEvent::Type airmap::services::Dispatcher::Event::registered_type() { + static const Type rt = static_cast(registerEventType()); + return rt; +} + +airmap::services::Dispatcher::Event::Event(const std::function& task) : QEvent{registered_type()}, task_{task} { +} + +void airmap::services::Dispatcher::Event::dispatch() { + task_(); +} + +std::shared_ptr airmap::services::Dispatcher::ToQt::create() { + return std::shared_ptr{new ToQt{}}; +} + +airmap::services::Dispatcher::ToQt::ToQt() { +} + +void airmap::services::Dispatcher::ToQt::dispatch(const Task& task) { + auto sp = shared_from_this(); + + QCoreApplication::postEvent(this, new Event{[sp, task]() { task(); }}); +} + +bool airmap::services::Dispatcher::ToQt::event(QEvent* event) { + assert(QCoreApplication::instance()); + assert(QThread::currentThread() == QCoreApplication::instance()->thread()); + + if (event->type() == Event::registered_type()) { + event->accept(); + + if (auto e = dynamic_cast(event)) { + e->dispatch(); + } + + return true; + } + + return false; +} + +airmap::services::Dispatcher::Dispatcher(const std::shared_ptr& context) + : to_qt_{ToQt::create()}, context_{context} { +} + +void airmap::services::Dispatcher::dispatch_to_qt(const std::function& task) { + to_qt_->dispatch(task); +} + +void airmap::services::Dispatcher::dispatch_to_airmap(const std::function& task) { + context_->schedule_in(task); +} + +// From QObject diff --git a/src/Airmap/services/dispatcher.h b/src/Airmap/services/dispatcher.h new file mode 100644 index 0000000..db9863d --- /dev/null +++ b/src/Airmap/services/dispatcher.h @@ -0,0 +1,53 @@ +#ifndef AIRMAP_QT_DISPATCHER_H_ +#define AIRMAP_QT_DISPATCHER_H_ + +#include + +#include +#include + +#include +#include +namespace airmap { +namespace services { + +class Dispatcher : public QObject { + public: + class Event : public QEvent { + public: + static Type registered_type(); + + explicit Event(const std::function& task); + void dispatch(); + + private: + std::function task_; + }; + + using Task = std::function; + + class ToQt : public QObject, public std::enable_shared_from_this { + public: + static std::shared_ptr create(); + void dispatch(const Task& task); + + private: + ToQt(); + // From QObject + bool event(QEvent* event) override; + }; + + explicit Dispatcher(const std::shared_ptr& context); + + void dispatch_to_qt(const Task& task); + void dispatch_to_airmap(const Task& task); + + private: + std::shared_ptr to_qt_; + std::shared_ptr context_; +}; + +} // namespace qt +} // namespace airmap + +#endif // AIRMAP_QT_DISPATCHER_H_ diff --git a/src/Airmap/services/flight_plans.cpp b/src/Airmap/services/flight_plans.cpp new file mode 100644 index 0000000..4e434ee --- /dev/null +++ b/src/Airmap/services/flight_plans.cpp @@ -0,0 +1,60 @@ +#include + +std::shared_ptr airmap::services::FlightPlans::create( + const std::shared_ptr& dispatcher, const std::shared_ptr& client) { + return std::shared_ptr{new FlightPlans{dispatcher, client}}; +} + +airmap::services::FlightPlans::FlightPlans(const std::shared_ptr& dispatcher, + const std::shared_ptr& client) + : dispatcher_{dispatcher}, client_{client} { +} + +void airmap::services::FlightPlans::for_id(const ForId::Parameters& parameters, const ForId::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->flight_plans().for_id(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::FlightPlans::create_by_polygon(const Create::Parameters& parameters, const Create::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->flight_plans().create_by_polygon(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::FlightPlans::update(const Update::Parameters& parameters, const Update::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->flight_plans().update(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::FlightPlans::delete_(const Delete::Parameters& parameters, const Delete::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->flight_plans().delete_(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::FlightPlans::render_briefing(const RenderBriefing::Parameters& parameters, + const RenderBriefing::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->flight_plans().render_briefing(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::FlightPlans::submit(const Submit::Parameters& parameters, const Submit::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->flight_plans().submit(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} diff --git a/src/Airmap/services/flight_plans.h b/src/Airmap/services/flight_plans.h new file mode 100644 index 0000000..c4233ea --- /dev/null +++ b/src/Airmap/services/flight_plans.h @@ -0,0 +1,36 @@ +#ifndef AIRMAP_QT_FLIGHT_PLANS_H_ +#define AIRMAP_QT_FLIGHT_PLANS_H_ + +#include +#include +#include + +#include + +namespace airmap { +namespace services { + +/// FlightPlans provides functionality for managing flight plans. +class FlightPlans : public airmap::FlightPlans, public std::enable_shared_from_this { + public: + static std::shared_ptr create(const std::shared_ptr& dispatcher, + const std::shared_ptr& client); + + void for_id(const ForId::Parameters& parameters, const ForId::Callback& cb) override; + void create_by_polygon(const Create::Parameters& parameters, const Create::Callback& cb) override; + void update(const Update::Parameters& parameters, const Update::Callback& cb) override; + void delete_(const Delete::Parameters& parameters, const Delete::Callback& cb) override; + void render_briefing(const RenderBriefing::Parameters& parameters, const RenderBriefing::Callback& cb) override; + void submit(const Submit::Parameters& parameters, const Submit::Callback& cb) override; + + private: + explicit FlightPlans(const std::shared_ptr& dispatcher, const std::shared_ptr& client); + + std::shared_ptr dispatcher_; + std::shared_ptr client_; +}; + +} // namespace qt +} // namespace airmap + +#endif // AIRMAP_QT_FLIGHT_PLANS_H_ diff --git a/src/Airmap/services/flights.cpp b/src/Airmap/services/flights.cpp new file mode 100644 index 0000000..1bfa342 --- /dev/null +++ b/src/Airmap/services/flights.cpp @@ -0,0 +1,88 @@ +#include + +std::shared_ptr airmap::services::Flights::create(const std::shared_ptr& dispatcher, + const std::shared_ptr& client) { + return std::shared_ptr{new Flights{dispatcher, client}}; +} + +airmap::services::Flights::Flights(const std::shared_ptr& dispatcher, + const std::shared_ptr& client) + : dispatcher_{dispatcher}, client_{client} { +} + +void airmap::services::Flights::search(const Search::Parameters& parameters, const Search::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->flights().search(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::Flights::for_id(const ForId::Parameters& parameters, const ForId::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->flights().for_id(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::Flights::create_flight_by_point(const CreateFlight::Parameters& parameters, + const CreateFlight::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->flights().create_flight_by_point(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::Flights::create_flight_by_path(const CreateFlight::Parameters& parameters, + const CreateFlight::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->flights().create_flight_by_path(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::Flights::create_flight_by_polygon(const CreateFlight::Parameters& parameters, + const CreateFlight::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->flights().create_flight_by_polygon(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::Flights::end_flight(const EndFlight::Parameters& parameters, const EndFlight::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->flights().end_flight(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::Flights::delete_flight(const DeleteFlight::Parameters& parameters, const DeleteFlight::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->flights().delete_flight(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::Flights::start_flight_communications(const StartFlightCommunications::Parameters& parameters, + const StartFlightCommunications::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->flights().start_flight_communications(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::Flights::end_flight_communications(const EndFlightCommunications::Parameters& parameters, + const EndFlightCommunications::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->flights().end_flight_communications(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} diff --git a/src/Airmap/services/flights.h b/src/Airmap/services/flights.h new file mode 100644 index 0000000..4fb9d7f --- /dev/null +++ b/src/Airmap/services/flights.h @@ -0,0 +1,40 @@ +#ifndef AIRMAP_QT_FLIGHTS_H_ +#define AIRMAP_QT_FLIGHTS_H_ + +#include +#include +#include + +#include + +namespace airmap { +namespace services { + +class Flights : public airmap::Flights, public std::enable_shared_from_this { + public: + static std::shared_ptr create(const std::shared_ptr& dispatcher, + const std::shared_ptr& client); + + void search(const Search::Parameters& parameters, const Search::Callback& cb) override; + void for_id(const ForId::Parameters& parameters, const ForId::Callback& cb) override; + void create_flight_by_point(const CreateFlight::Parameters& parameters, const CreateFlight::Callback& cb) override; + void create_flight_by_path(const CreateFlight::Parameters& parameters, const CreateFlight::Callback& cb) override; + void create_flight_by_polygon(const CreateFlight::Parameters& parameters, const CreateFlight::Callback& cb) override; + void end_flight(const EndFlight::Parameters& parameters, const EndFlight::Callback& cb) override; + void delete_flight(const DeleteFlight::Parameters& parameters, const DeleteFlight::Callback& cb) override; + void start_flight_communications(const StartFlightCommunications::Parameters& parameters, + const StartFlightCommunications::Callback& cb) override; + void end_flight_communications(const EndFlightCommunications::Parameters& parameters, + const EndFlightCommunications::Callback& cb) override; + + private: + explicit Flights(const std::shared_ptr& dispatcher, const std::shared_ptr& client); + + std::shared_ptr dispatcher_; + std::shared_ptr client_; +}; + +} // namespace qt +} // namespace airmap + +#endif // AIRMAP_QT_FLIGHTS_H_ diff --git a/src/Airmap/services/logger.cpp b/src/Airmap/services/logger.cpp new file mode 100644 index 0000000..042e628 --- /dev/null +++ b/src/Airmap/services/logger.cpp @@ -0,0 +1,78 @@ +#include + +#include + +struct airmap::services::Logger::Private { + QLoggingCategory logging_category{"airmap"}; +}; + +struct airmap::services::DispatchingLogger::Private { + std::shared_ptr next; + std::shared_ptr dispatcher; +}; + +airmap::services::Logger::Logger() : d_{new Private{}} { +} +airmap::services::Logger::~Logger() { +} + +QLoggingCategory& airmap::services::Logger::logging_category() { + static QLoggingCategory lc{"airmap"}; + return lc; +} + +void airmap::services::Logger::log(Severity severity, const char* message, const char*) { + switch (severity) { + case Severity::debug: + qCDebug(logging_category(), "%s", message); + break; + case Severity::info: + qCInfo(logging_category(), "%s", message); + break; + case Severity::error: + qCWarning(logging_category(), "%s", message); + break; + default: + break; + } +} + +bool airmap::services::Logger::should_log(Severity severity, const char*, const char*) { + switch (severity) { + case Severity::debug: + return logging_category().isDebugEnabled(); + case Severity::info: + return logging_category().isInfoEnabled(); + case Severity::error: + return logging_category().isWarningEnabled(); + default: + break; + } + + return true; +} + +airmap::services::DispatchingLogger::DispatchingLogger(const std::shared_ptr& next) + : d_{new Private{next, Dispatcher::ToQt::create()}} { +} + +airmap::services::DispatchingLogger::~DispatchingLogger() { +} + +void airmap::services::DispatchingLogger::log(Severity severity, const char* message, const char* component) { + std::string cmessage{message}; + std::string ccomponent{component}; + auto cnext{d_->next}; + + d_->dispatcher->dispatch([severity, cmessage, ccomponent, cnext] { + if (cnext->should_log(severity, cmessage.c_str(), ccomponent.c_str())) + cnext->log(severity, cmessage.c_str(), ccomponent.c_str()); + }); +} + +bool airmap::services::DispatchingLogger::should_log(Severity, const char*, const char*) { + // We have to accept all incoming log messages and postpone + // the actual evaluation of should_log in the context of next until we + // run on the correct thread. + return true; +} diff --git a/src/Airmap/services/logger.h b/src/Airmap/services/logger.h new file mode 100644 index 0000000..8a27385 --- /dev/null +++ b/src/Airmap/services/logger.h @@ -0,0 +1,57 @@ +#ifndef AIRMAP_QT_LOGGER_H_ +#define AIRMAP_QT_LOGGER_H_ + +#include +#include + +#include + +#include + +namespace airmap { +namespace services { + +/// Logger is an airmap::Logger implementation that uses to +/// Qt's logging facilities. +class AIRMAP_EXPORT Logger : public airmap::Logger { + public: + /// logging_category returns a QLoggingCategory instance + /// that enables calling code to fine-tune logging behavior of a Logger instance. + QLoggingCategory& logging_category(); + + /// Logger initializes a new instance. + Logger(); + /// ~Logger cleans up all resources held by a Logger instance. + ~Logger(); + + // From airmap::Logger + void log(Severity severity, const char* message, const char* component) override; + bool should_log(Severity severity, const char* message, const char* component) override; + + private: + struct Private; + std::unique_ptr d_; +}; + +/// DispatchingLogger is an airmap::Logger implementation that dispatches to Qt's main +/// event loop for logger invocation +class AIRMAP_EXPORT DispatchingLogger : public airmap::Logger { + public: + /// DispatchingLogger initializes a new instance with 'next'. + DispatchingLogger(const std::shared_ptr& next); + /// ~DispatchingLogging cleans up all resources held a DispatchingLogger instance. + ~DispatchingLogger(); + + // From airmap::Logger + void log(Severity severity, const char* message, const char* component) override; + bool should_log(Severity severity, const char* message, const char* component) override; + + private: + struct Private; + std::unique_ptr d_; +}; + +} // namespace qt +} // namespace airmap + +#endif // AIRMAP_QT_LOGGER_H_ diff --git a/src/Airmap/services/pilots.cpp b/src/Airmap/services/pilots.cpp new file mode 100644 index 0000000..b11047b --- /dev/null +++ b/src/Airmap/services/pilots.cpp @@ -0,0 +1,86 @@ +#include + +std::shared_ptr airmap::services::Pilots::create(const std::shared_ptr& dispatcher, + const std::shared_ptr& client) { + return std::shared_ptr{new Pilots{dispatcher, client}}; +} + +airmap::services::Pilots::Pilots(const std::shared_ptr& dispatcher, const std::shared_ptr& client) + : dispatcher_{dispatcher}, client_{client} { +} + +void airmap::services::Pilots::authenticated(const Authenticated::Parameters& parameters, const Authenticated::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->pilots().authenticated(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::Pilots::for_id(const ForId::Parameters& parameters, const ForId::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->pilots().for_id(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::Pilots::update_for_id(const UpdateForId::Parameters& parameters, const UpdateForId::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->pilots().update_for_id(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::Pilots::start_verify_pilot_phone_for_id(const StartVerifyPilotPhoneForId::Parameters& parameters, + const StartVerifyPilotPhoneForId::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->pilots().start_verify_pilot_phone_for_id(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::Pilots::finish_verify_pilot_phone_for_id(const FinishVerifyPilotPhoneForId::Parameters& parameters, + const FinishVerifyPilotPhoneForId::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->pilots().finish_verify_pilot_phone_for_id(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::Pilots::aircrafts(const Aircrafts::Parameters& parameters, const Aircrafts::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->pilots().aircrafts(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::Pilots::add_aircraft(const AddAircraft::Parameters& parameters, const AddAircraft::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->pilots().add_aircraft(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::Pilots::delete_aircraft(const DeleteAircraft::Parameters& parameters, + const DeleteAircraft::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->pilots().delete_aircraft(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::Pilots::update_aircraft(const UpdateAircraft::Parameters& parameters, + const UpdateAircraft::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->pilots().update_aircraft(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} diff --git a/src/Airmap/services/pilots.h b/src/Airmap/services/pilots.h new file mode 100644 index 0000000..1380409 --- /dev/null +++ b/src/Airmap/services/pilots.h @@ -0,0 +1,41 @@ +#ifndef AIRMAP_QT_PILOTS_H_ +#define AIRMAP_QT_PILOTS_H_ + +#include + +#include +#include + +#include + +namespace airmap { +namespace services { + +class Pilots : public airmap::Pilots, public std::enable_shared_from_this { + public: + static std::shared_ptr create(const std::shared_ptr& dispatcher, + const std::shared_ptr& client); + + void authenticated(const Authenticated::Parameters& parameters, const Authenticated::Callback& cb) override; + void for_id(const ForId::Parameters& parameters, const ForId::Callback& cb) override; + void update_for_id(const UpdateForId::Parameters& parameters, const UpdateForId::Callback& cb) override; + void start_verify_pilot_phone_for_id(const StartVerifyPilotPhoneForId::Parameters& parameters, + const StartVerifyPilotPhoneForId::Callback& cb) override; + void finish_verify_pilot_phone_for_id(const FinishVerifyPilotPhoneForId::Parameters& parameters, + const FinishVerifyPilotPhoneForId::Callback& cb) override; + void aircrafts(const Aircrafts::Parameters& parameters, const Aircrafts::Callback& cb) override; + void add_aircraft(const AddAircraft::Parameters& parameters, const AddAircraft::Callback& cb) override; + void delete_aircraft(const DeleteAircraft::Parameters& parameters, const DeleteAircraft::Callback& cb) override; + void update_aircraft(const UpdateAircraft::Parameters& parameters, const UpdateAircraft::Callback& cb) override; + + private: + explicit Pilots(const std::shared_ptr& dispatcher, const std::shared_ptr& client); + + std::shared_ptr dispatcher_; + std::shared_ptr client_; +}; + +} // namespace qt +} // namespace airmap + +#endif // AIRMAP_QT_PILOTS_H_ diff --git a/src/Airmap/services/rulesets.cpp b/src/Airmap/services/rulesets.cpp new file mode 100644 index 0000000..77ea647 --- /dev/null +++ b/src/Airmap/services/rulesets.cpp @@ -0,0 +1,53 @@ +#include + +std::shared_ptr airmap::services::RuleSets::create(const std::shared_ptr& dispatcher, + const std::shared_ptr& client) { + return std::shared_ptr{new RuleSets{dispatcher, client}}; +} + +airmap::services::RuleSets::RuleSets(const std::shared_ptr& dispatcher, + const std::shared_ptr& client) + : dispatcher_{dispatcher}, client_{client} { +} + +void airmap::services::RuleSets::search(const Search::Parameters& parameters, const Search::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->rulesets().search(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::RuleSets::for_id(const ForId::Parameters& parameters, const ForId::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->rulesets().for_id(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::RuleSets::fetch_rules(const FetchRules::Parameters& parameters, const FetchRules::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->rulesets().fetch_rules(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::RuleSets::evaluate_rulesets(const EvaluateRules::Parameters& parameters, + const EvaluateRules::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->rulesets().evaluate_rulesets(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::RuleSets::evaluate_flight_plan(const EvaluateFlightPlan::Parameters& parameters, + const EvaluateFlightPlan::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->rulesets().evaluate_flight_plan(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} diff --git a/src/Airmap/services/rulesets.h b/src/Airmap/services/rulesets.h new file mode 100644 index 0000000..157d370 --- /dev/null +++ b/src/Airmap/services/rulesets.h @@ -0,0 +1,31 @@ +#ifndef AIRMAP_QT_RULESETS_H_ +#define AIRMAP_QT_RULESETS_H_ + +#include +#include +#include + +namespace airmap { +namespace services { + +class RuleSets : public airmap::RuleSets, public std::enable_shared_from_this { + public: + static std::shared_ptr create(const std::shared_ptr& dispatcher, + const std::shared_ptr& client); + + void search(const Search::Parameters& parameters, const Search::Callback& cb) override; + void for_id(const ForId::Parameters& parameters, const ForId::Callback& cb) override; + void fetch_rules(const FetchRules::Parameters& parameters, const FetchRules::Callback& cb) override; + void evaluate_rulesets(const EvaluateRules::Parameters& parameters, const EvaluateRules::Callback& cb) override; + void evaluate_flight_plan(const EvaluateFlightPlan::Parameters& parameters, const EvaluateFlightPlan::Callback& cb) override; + + private: + explicit RuleSets(const std::shared_ptr& dispatcher, const std::shared_ptr& client); + std::shared_ptr dispatcher_; + std::shared_ptr client_; +}; + +} // namespace qt +} // namespace airmap + +#endif // AIRMAP_QT_RULESETS_H_ diff --git a/src/Airmap/services/status.cpp b/src/Airmap/services/status.cpp new file mode 100644 index 0000000..8a89902 --- /dev/null +++ b/src/Airmap/services/status.cpp @@ -0,0 +1,34 @@ +#include + +std::shared_ptr airmap::services::Status::create(const std::shared_ptr& dispatcher, + const std::shared_ptr& client) { + return std::shared_ptr{new Status{dispatcher, client}}; +} + +airmap::services::Status::Status(const std::shared_ptr& dispatcher, const std::shared_ptr& client) + : dispatcher_{dispatcher}, client_{client} { +} + +void airmap::services::Status::get_status_by_point(const GetStatus::Parameters& parameters, const GetStatus::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->status().get_status_by_point(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::Status::get_status_by_path(const GetStatus::Parameters& parameters, const GetStatus::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->status().get_status_by_path(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} + +void airmap::services::Status::get_status_by_polygon(const GetStatus::Parameters& parameters, const GetStatus::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->status().get_status_by_polygon(parameters, [this, sp, cb](const auto& result) { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + }); + }); +} diff --git a/src/Airmap/services/status.h b/src/Airmap/services/status.h new file mode 100644 index 0000000..431c4c3 --- /dev/null +++ b/src/Airmap/services/status.h @@ -0,0 +1,32 @@ +#ifndef AIRMAP_QT_STATUS_H_ +#define AIRMAP_QT_STATUS_H_ + +#include +#include +#include + +#include + +namespace airmap { +namespace services { + +class Status : public airmap::Status, public std::enable_shared_from_this { + public: + static std::shared_ptr create(const std::shared_ptr& dispatcher, + const std::shared_ptr& client); + + void get_status_by_point(const GetStatus::Parameters& parameters, const GetStatus::Callback& cb) override; + void get_status_by_path(const GetStatus::Parameters& parameters, const GetStatus::Callback& cb) override; + void get_status_by_polygon(const GetStatus::Parameters& parameters, const GetStatus::Callback& cb) override; + + private: + explicit Status(const std::shared_ptr& dispatcher, const std::shared_ptr& client); + + std::shared_ptr dispatcher_; + std::shared_ptr client_; +}; + +} // namespace qt +} // namespace airmap + +#endif // AIRMAP_QT_STATUS_H_ diff --git a/src/Airmap/services/telemetry.cpp b/src/Airmap/services/telemetry.cpp new file mode 100644 index 0000000..aded0bb --- /dev/null +++ b/src/Airmap/services/telemetry.cpp @@ -0,0 +1,20 @@ +#include + +#include + +std::shared_ptr airmap::services::Telemetry::create(const std::shared_ptr& dispatcher, + const std::shared_ptr& client) { + return std::shared_ptr{new Telemetry{dispatcher, client}}; +} + +airmap::services::Telemetry::Telemetry(const std::shared_ptr& dispatcher, + const std::shared_ptr& client) + : dispatcher_{dispatcher}, client_{client} { +} + +void airmap::services::Telemetry::submit_updates(const Flight& flight, const std::string& key, + const std::initializer_list& updates) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), flight, key, updates]() { + sp->client_->telemetry().submit_updates(flight, key, updates); + }); +} diff --git a/src/Airmap/services/telemetry.h b/src/Airmap/services/telemetry.h new file mode 100644 index 0000000..ddb4f10 --- /dev/null +++ b/src/Airmap/services/telemetry.h @@ -0,0 +1,31 @@ +#ifndef AIRMAP_QT_TELEMETRY_H_ +#define AIRMAP_QT_TELEMETRY_H_ + +#include +#include +#include + +#include + +namespace airmap { +namespace services { + +class Telemetry : public airmap::Telemetry, public std::enable_shared_from_this { + public: + static std::shared_ptr create(const std::shared_ptr& dispatcher, + const std::shared_ptr& client); + + void submit_updates(const Flight& flight, const std::string& key, + const std::initializer_list& updates) override; + + private: + explicit Telemetry(const std::shared_ptr& dispatcher, const std::shared_ptr& client); + + std::shared_ptr dispatcher_; + std::shared_ptr client_; +}; + +} // namespace qt +} // namespace airmap + +#endif // AIRMAP_QT_TELEMETRY_H_ diff --git a/src/Airmap/services/traffic.cpp b/src/Airmap/services/traffic.cpp new file mode 100644 index 0000000..d3d9a60 --- /dev/null +++ b/src/Airmap/services/traffic.cpp @@ -0,0 +1,52 @@ +#include + +std::shared_ptr airmap::services::Traffic::Monitor::create( + const std::shared_ptr& dispatcher, const std::shared_ptr& native) { + return std::shared_ptr{new Monitor{dispatcher, native}}; +} + +airmap::services::Traffic::Monitor::Monitor(const std::shared_ptr& dispatcher, + const std::shared_ptr& native) + : dispatcher_{dispatcher}, native_{native} { +} + +void airmap::services::Traffic::Monitor::subscribe(const std::shared_ptr& subscriber) { + dispatcher_->dispatch_to_qt([this, sp = shared_from_this(), subscriber] { sp->subscribers_.insert(subscriber); }); +} + +void airmap::services::Traffic::Monitor::unsubscribe( + const std::shared_ptr& subscriber) { + dispatcher_->dispatch_to_qt([this, sp = shared_from_this(), subscriber] { sp->subscribers_.erase(subscriber); }); +} + +void airmap::services::Traffic::Monitor::handle_update(Update::Type type, const std::vector& update) { + dispatcher_->dispatch_to_qt([this, sp = shared_from_this(), type, update]() { + for (const auto& subscriber : sp->subscribers_) + subscriber->handle_update(type, update); + }); +} + +std::shared_ptr airmap::services::Traffic::create(const std::shared_ptr& dispatcher, + const std::shared_ptr& client) { + return std::shared_ptr{new Traffic{dispatcher, client}}; +} + +airmap::services::Traffic::Traffic(const std::shared_ptr& dispatcher, + const std::shared_ptr& client) + : dispatcher_{dispatcher}, client_{client} { +} + +void airmap::services::Traffic::monitor(const Monitor::Params& parameters, const Monitor::Callback& cb) { + dispatcher_->dispatch_to_airmap([this, sp = shared_from_this(), parameters, cb]() { + sp->client_->traffic().monitor(parameters, [this, sp, parameters, cb](const auto& result) { + if (result) { + auto m = result.value(); + auto mm = Monitor::create(sp->dispatcher_, m); + m->subscribe(mm); + sp->dispatcher_->dispatch_to_qt([sp, mm, cb]() { cb(Monitor::Result{mm}); }); + } else { + sp->dispatcher_->dispatch_to_qt([sp, result, cb]() { cb(result); }); + } + }); + }); +} diff --git a/src/Airmap/services/traffic.h b/src/Airmap/services/traffic.h new file mode 100644 index 0000000..a3cd156 --- /dev/null +++ b/src/Airmap/services/traffic.h @@ -0,0 +1,54 @@ +#ifndef AIRMAP_QT_TRAFFIC_H_ +#define AIRMAP_QT_TRAFFIC_H_ + +#include + +#include + +#include +#include + +namespace airmap { +namespace services { + +class Traffic : public airmap::Traffic, public std::enable_shared_from_this { + public: + static std::shared_ptr create(const std::shared_ptr& dispatcher, + const std::shared_ptr& client); + + class Monitor : public airmap::Traffic::Monitor, + public airmap::Traffic::Monitor::Subscriber, + public std::enable_shared_from_this { + public: + static std::shared_ptr create(const std::shared_ptr& dispatcher, + const std::shared_ptr& native); + + // From airmap::Traffic::Monitor + void subscribe(const std::shared_ptr& subscriber) override; + void unsubscribe(const std::shared_ptr& subscriber) override; + // From airmap::Traffic::Monitor::Subscriber + void handle_update(Update::Type type, const std::vector& update) override; + + private: + explicit Monitor(const std::shared_ptr& dispatcher, + const std::shared_ptr& native); + + std::shared_ptr dispatcher_; + std::shared_ptr native_; + std::set> subscribers_; + }; + + // From airmap::Traffic + void monitor(const Monitor::Params& params, const Monitor::Callback& cb) override; + + private: + explicit Traffic(const std::shared_ptr& dispatcher, const std::shared_ptr& client); + + std::shared_ptr dispatcher_; + std::shared_ptr client_; +}; + +} // namespace qt +} // namespace airmap + +#endif // AIRMAP_QT_TRAFFIC_H_ diff --git a/src/Airmap/services/types.cpp b/src/Airmap/services/types.cpp new file mode 100644 index 0000000..102e75b --- /dev/null +++ b/src/Airmap/services/types.cpp @@ -0,0 +1,79 @@ +#include + +namespace { + +template +inline void register_type_once(const char* name) { + static const int id = qRegisterMetaType(name); + (void)id; +} + +template +inline void register_type_once() { + static const int id = qRegisterMetaType(); + (void)id; +} + +} // namespace + +void airmap::services::register_types() { + register_type_once("Aircraft"); + register_type_once("Airspace"); + register_type_once("Credentials"); + register_type_once("DateTime"); + register_type_once("Error"); + register_type_once("FlightPlan"); + register_type_once("Flight"); + register_type_once("Geometry"); + register_type_once("Pilot"); + register_type_once("Rule"); + register_type_once("RuleSet"); + register_type_once("RuleSet::Rule"); + register_type_once("Status::Advisory"); + register_type_once("Status::Wind"); + register_type_once("Status::Weather"); + register_type_once("Status::Report"); + register_type_once("Telemetry::Position"); + register_type_once("Telemetry::Speed"); + register_type_once("Telemetry::Attitude"); + register_type_once("Telemetry::Barometer"); + register_type_once>("Optional"); + register_type_once("Token::Type"); + register_type_once("Token::Anonymous"); + register_type_once("Token::OAuth"); + register_type_once("Token::Refreshed"); + register_type_once("Token"); + register_type_once("Traffic::Update::Type"); + register_type_once("Traffic::Update"); + register_type_once("Version"); + + register_type_once("airmap::Aircraft"); + register_type_once("airmap::Airspace"); + register_type_once("airmap::Credentials"); + register_type_once("airmap::DateTime"); + register_type_once("airmap::Error"); + register_type_once("airmap::FlightPlan"); + register_type_once("airmap::Flight"); + register_type_once("airmap::Geometry"); + register_type_once("airmap::Pilot"); + register_type_once("airmap::Rule"); + register_type_once("airmap::RuleSet"); + register_type_once("airmap::RuleSet::Rule"); + register_type_once("airmap::Advisory"); + register_type_once("airmap::Wind"); + register_type_once("airmap::Weather"); + register_type_once("airmap::Report"); + register_type_once("airmap::Telemetry::Position"); + register_type_once("airmap::Telemetry::Speed"); + register_type_once("airmap::Telemetry::Attitude"); + register_type_once("airmap::Telemetry::Barometer"); + register_type_once>("airmap::Optional"); + register_type_once("airmap::Token::Type"); + register_type_once("airmap::Token::Anonymous"); + register_type_once("airmap::Token::OAuth"); + register_type_once("airmap::Token::Refreshed"); + register_type_once("airmap::Token"); + register_type_once("airmap::Traffic::Update::Type"); + register_type_once("airmap::Traffic::Update"); + register_type_once("airmap::Version"); +} diff --git a/src/Airmap/services/types.h b/src/Airmap/services/types.h new file mode 100644 index 0000000..97e76c7 --- /dev/null +++ b/src/Airmap/services/types.h @@ -0,0 +1,67 @@ +#ifndef AIRMAP_QT_TYPES_H_ +#define AIRMAP_QT_TYPES_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +Q_DECLARE_METATYPE(airmap::Aircraft) +Q_DECLARE_METATYPE(airmap::Airspace) +Q_DECLARE_METATYPE(airmap::Credentials) +Q_DECLARE_METATYPE(airmap::DateTime) +Q_DECLARE_METATYPE(airmap::Error) +Q_DECLARE_METATYPE(airmap::FlightPlan) +Q_DECLARE_METATYPE(airmap::Flight) +Q_DECLARE_METATYPE(airmap::Geometry) +Q_DECLARE_METATYPE(airmap::Pilot) +Q_DECLARE_METATYPE(airmap::Rule) +Q_DECLARE_METATYPE(airmap::RuleSet) +Q_DECLARE_METATYPE(airmap::RuleSet::Rule) +Q_DECLARE_METATYPE(airmap::Status::Advisory) +Q_DECLARE_METATYPE(airmap::Status::Wind) +Q_DECLARE_METATYPE(airmap::Status::Weather) +Q_DECLARE_METATYPE(airmap::Status::Report) +Q_DECLARE_METATYPE(airmap::Telemetry::Position) +Q_DECLARE_METATYPE(airmap::Telemetry::Speed) +Q_DECLARE_METATYPE(airmap::Telemetry::Attitude) +Q_DECLARE_METATYPE(airmap::Telemetry::Barometer) +Q_DECLARE_METATYPE(airmap::Optional) +Q_DECLARE_METATYPE(airmap::Token::Type) +Q_DECLARE_METATYPE(airmap::Token::Anonymous) +Q_DECLARE_METATYPE(airmap::Token::OAuth) +Q_DECLARE_METATYPE(airmap::Token::Refreshed) +Q_DECLARE_METATYPE(airmap::Token) +Q_DECLARE_METATYPE(airmap::Traffic::Update::Type) +Q_DECLARE_METATYPE(airmap::Traffic::Update) +Q_DECLARE_METATYPE(airmap::Version) + +namespace airmap { +namespace services { + +/// register_types makes airmap::* types known to the Qt type system. +/// +/// This function has to be called at least once to be able to use airmap::* +/// types in queued signal-slot connections. +AIRMAP_EXPORT void register_types(); + +} // namespace qt +} // namespace airmap + +#endif // AIRMAP_QT_TYPES_H_ diff --git a/src/AirspaceManagement/AirspaceAdvisoryProvider.cc b/src/AirspaceManagement/AirspaceAdvisoryProvider.cc new file mode 100644 index 0000000..9399885 --- /dev/null +++ b/src/AirspaceManagement/AirspaceAdvisoryProvider.cc @@ -0,0 +1,46 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#include "AirspaceAdvisoryProvider.h" + +AirspaceAdvisory::AirspaceAdvisory(QObject* parent) + : QObject(parent) +{ +} + +AirspaceAdvisoryProvider::AirspaceAdvisoryProvider(QObject *parent) + : QObject(parent) +{ +} + +//-- TODO: This enum is a bitmask, which implies an airspace can be any +// combination of these types. However, I have not seen any that this +// was the case. + +QString +AirspaceAdvisory::typeStr() +{ + switch(type()) { + case Airport: return tr("Airport"); + case Controlled_airspace: return tr("Controlled Airspace"); + case Special_use_airspace: return tr("Special Use Airspace"); + case Tfr: return tr("TFR"); + case Wildfire: return tr("Wild Fire"); + case Park: return tr("Park"); + case Power_plant: return tr("Power Plant"); + case Heliport: return tr("Heliport"); + case Prison: return tr("Prison"); + case School: return tr("School"); + case Hospital: return tr("Hospital"); + case Fire: return tr("Fire"); + case Emergency: return tr("Emergency"); + case Invalid: return tr("Custom"); + default: return tr("Unknown"); + } +} diff --git a/src/AirspaceManagement/AirspaceAdvisoryProvider.h b/src/AirspaceManagement/AirspaceAdvisoryProvider.h new file mode 100644 index 0000000..075b898 --- /dev/null +++ b/src/AirspaceManagement/AirspaceAdvisoryProvider.h @@ -0,0 +1,104 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#pragma once + +/** + * @file AirspaceAdvisoryProvider.h + * Weather information provided by the Airspace Managemement + */ + +#include "QmlObjectListModel.h" +#include "QGCGeoBoundingCube.h" + +#include +#include + +//----------------------------------------------------------------------------- +class AirspaceAdvisoryProvider : public QObject +{ + Q_OBJECT +public: + + enum AdvisoryColor { + Green, + Yellow, + Orange, + Red + }; + + Q_ENUM(AdvisoryColor) + + AirspaceAdvisoryProvider (QObject *parent = nullptr); + virtual ~AirspaceAdvisoryProvider () {} + + Q_PROPERTY(bool valid READ valid NOTIFY advisoryChanged) + Q_PROPERTY(AdvisoryColor airspaceColor READ airspaceColor NOTIFY advisoryChanged) + Q_PROPERTY(QmlObjectListModel* advisories READ advisories NOTIFY advisoryChanged) + + virtual bool valid () = 0; ///< Current data is valid + virtual AdvisoryColor airspaceColor () = 0; ///< Aispace overall color + virtual QmlObjectListModel* advisories () = 0; ///< List of AirspaceAdvisory + + /** + * Set region of interest that should be queried. When finished, the advisoryChanged() signal will be emmited. + * @param center Center coordinate for ROI + */ + virtual void setROI (const QGCGeoBoundingCube& roi, bool reset = false) = 0; + +signals: + void advisoryChanged (); +}; + +//----------------------------------------------------------------------------- +class AirspaceAdvisory : public QObject +{ + Q_OBJECT +public: + + enum AdvisoryType { + Invalid = 0, + Airport = 1 << 0, + Controlled_airspace = 1 << 1, + Special_use_airspace = 1 << 2, + Tfr = 1 << 3, + Wildfire = 1 << 4, + Park = 1 << 5, + Power_plant = 1 << 6, + Heliport = 1 << 7, + Prison = 1 << 8, + School = 1 << 9, + Hospital = 1 << 10, + Fire = 1 << 11, + Emergency = 1 << 12, + }; + + Q_ENUM(AdvisoryType) + + AirspaceAdvisory (QObject* parent = nullptr); + + Q_PROPERTY(QString id READ id CONSTANT) + Q_PROPERTY(QString name READ name CONSTANT) + Q_PROPERTY(AdvisoryType type READ type CONSTANT) + Q_PROPERTY(QString typeStr READ typeStr CONSTANT) + Q_PROPERTY(QGeoCoordinate coordinates READ coordinates CONSTANT) + Q_PROPERTY(qreal radius READ radius CONSTANT) + + Q_PROPERTY(AirspaceAdvisoryProvider::AdvisoryColor color READ color CONSTANT) + + virtual QString id () = 0; + virtual QString name () = 0; + virtual AdvisoryType type () = 0; + virtual QString typeStr (); + virtual QGeoCoordinate coordinates () = 0; + virtual qreal radius () = 0; + + virtual AirspaceAdvisoryProvider::AdvisoryColor color () = 0; +}; + diff --git a/src/AirspaceManagement/AirspaceFlightPlanProvider.cc b/src/AirspaceManagement/AirspaceFlightPlanProvider.cc new file mode 100644 index 0000000..53bfa4e --- /dev/null +++ b/src/AirspaceManagement/AirspaceFlightPlanProvider.cc @@ -0,0 +1,169 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#include "AirspaceManager.h" +#include "AirspaceFlightPlanProvider.h" +#include + +//----------------------------------------------------------------------------- +AirspaceFlightAuthorization::AirspaceFlightAuthorization(QObject *parent) + : QObject(parent) +{ +} + +//----------------------------------------------------------------------------- +AirspaceFlightInfo::AirspaceFlightInfo(QObject *parent) + : QObject(parent) +{ +} + +//----------------------------------------------------------------------------- +AirspaceFlightPlanProvider::AirspaceFlightPlanProvider(QObject *parent) + : QObject(parent) +{ +} + +//----------------------------------------------------------------------------- +AirspaceFlightModel::AirspaceFlightModel(QObject *parent) + : QAbstractListModel(parent) +{ + +} + +//----------------------------------------------------------------------------- +AirspaceFlightInfo* +AirspaceFlightModel::get(int index) +{ + if (index < 0 || index >= _flightEntries.count()) { + return nullptr; + } + return _flightEntries[index]; +} + +//----------------------------------------------------------------------------- +int +AirspaceFlightModel::findFlightID(QString flightID) +{ + for(int i = 0; i < _flightEntries.count(); i++) { + if(_flightEntries[i]->flightID() == flightID) { + return i; + } + } + return -1; +} + +//----------------------------------------------------------------------------- +int +AirspaceFlightModel::count() const +{ + return _flightEntries.count(); +} + +//----------------------------------------------------------------------------- +void +AirspaceFlightModel::append(AirspaceFlightInfo* object) +{ + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + QQmlEngine::setObjectOwnership(object, QQmlEngine::CppOwnership); + _flightEntries.append(object); + endInsertRows(); + emit countChanged(); +} + +//----------------------------------------------------------------------------- +void +AirspaceFlightModel::remove(const QString& flightID) +{ + remove(findFlightID(flightID)); +} + +//----------------------------------------------------------------------------- +void +AirspaceFlightModel::remove(int index) +{ + if (index >= 0 && index < _flightEntries.count()) { + beginRemoveRows(QModelIndex(), index, index); + AirspaceFlightInfo* entry = _flightEntries[index]; + if(entry) { + qCDebug(AirspaceManagementLog) << "Deleting flight plan" << entry->flightPlanID(); + entry->deleteLater(); + } + _flightEntries.removeAt(index); + endRemoveRows(); + emit countChanged(); + } +} + +//----------------------------------------------------------------------------- +void +AirspaceFlightModel::clear(void) +{ + if(!_flightEntries.isEmpty()) { + beginResetModel(); + while (_flightEntries.count()) { + AirspaceFlightInfo* entry = _flightEntries.last(); + if(entry) entry->deleteLater(); + _flightEntries.removeLast(); + } + endResetModel(); + emit countChanged(); + } +} + +//----------------------------------------------------------------------------- +static bool +flight_sort(QObject* a, QObject* b) +{ + AirspaceFlightInfo* aa = qobject_cast(a); + AirspaceFlightInfo* bb = qobject_cast(b); + if(!aa || !bb) return false; + return aa->qStartTime() > bb->qStartTime(); +} + +//----------------------------------------------------------------------------- +void +AirspaceFlightModel::sortStartFlight() +{ + beginResetModel(); + std::sort(_flightEntries.begin(), _flightEntries.end(), flight_sort); + endResetModel(); +} + + +//----------------------------------------------------------------------------- +AirspaceFlightInfo* +AirspaceFlightModel::operator[](int index) +{ + return get(index); +} + +//----------------------------------------------------------------------------- +int +AirspaceFlightModel::rowCount(const QModelIndex& /*parent*/) const +{ + return _flightEntries.count(); +} + +//----------------------------------------------------------------------------- +QVariant +AirspaceFlightModel::data(const QModelIndex & index, int role) const { + if (index.row() < 0 || index.row() >= _flightEntries.count()) + return QVariant(); + if (role == ObjectRole) + return QVariant::fromValue(_flightEntries[index.row()]); + return QVariant(); +} + +//----------------------------------------------------------------------------- +QHash +AirspaceFlightModel::roleNames() const { + QHash roles; + roles[ObjectRole] = "flightEntry"; + return roles; +} diff --git a/src/AirspaceManagement/AirspaceFlightPlanProvider.h b/src/AirspaceManagement/AirspaceFlightPlanProvider.h new file mode 100644 index 0000000..f92ddb5 --- /dev/null +++ b/src/AirspaceManagement/AirspaceFlightPlanProvider.h @@ -0,0 +1,216 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#pragma once + +/** + * @file AirspaceFlightPlanProvider.h + * Create and maintain a flight plan + */ + +#include "AirspaceAdvisoryProvider.h" +#include "QmlObjectListModel.h" + +#include +#include +#include +#include + +class PlanMasterController; +class AirspaceFlightInfo; + +//----------------------------------------------------------------------------- +class AirspaceFlightAuthorization : public QObject +{ + Q_OBJECT +public: + AirspaceFlightAuthorization (QObject *parent = nullptr); + + enum AuthorizationStatus { + Accepted, + Rejected, + Pending, + AcceptedOnSubmission, + RejectedOnSubmission, + Unknown + }; + + Q_ENUM(AuthorizationStatus) + + Q_PROPERTY(QString name READ name CONSTANT) + Q_PROPERTY(QString id READ id CONSTANT) + Q_PROPERTY(AuthorizationStatus status READ status CONSTANT) + Q_PROPERTY(QString message READ message CONSTANT) + + virtual QString name () = 0; + virtual QString id () = 0; + virtual AuthorizationStatus status () = 0; + virtual QString message () = 0; + +}; + + +//----------------------------------------------------------------------------- +class AirspaceFlightInfo : public QObject +{ + Q_OBJECT +public: + AirspaceFlightInfo (QObject *parent = nullptr); + + Q_PROPERTY(QString flightID READ flightID CONSTANT) + Q_PROPERTY(QString flightPlanID READ flightPlanID CONSTANT) + Q_PROPERTY(QString createdTime READ createdTime CONSTANT) + Q_PROPERTY(QString startTime READ startTime CONSTANT) + Q_PROPERTY(QString endTime READ endTime CONSTANT) + Q_PROPERTY(QGeoCoordinate takeOff READ takeOff CONSTANT) + Q_PROPERTY(QVariantList boundingBox READ boundingBox CONSTANT) + Q_PROPERTY(bool active READ active NOTIFY activeChanged) + + virtual QString flightID () = 0; + virtual QString flightPlanID () = 0; + virtual QString createdTime () = 0; + virtual QString startTime () = 0; + virtual QDateTime qStartTime () = 0; + virtual QString endTime () = 0; + virtual QGeoCoordinate takeOff () = 0; + virtual QVariantList boundingBox () = 0; + virtual bool active () = 0; + +signals: + void activeChanged (); +}; + +//----------------------------------------------------------------------------- +class AirspaceFlightModel : public QAbstractListModel +{ + Q_OBJECT +public: + + enum QGCLogModelRoles { + ObjectRole = Qt::UserRole + 1 + }; + + AirspaceFlightModel (QObject *parent = 0); + + Q_PROPERTY(int count READ count NOTIFY countChanged) + + Q_INVOKABLE AirspaceFlightInfo* get (int index); + Q_INVOKABLE int findFlightID (QString flightID); + + int count () const; + void append (AirspaceFlightInfo *entry); + void remove (const QString& flightID); + void remove (int index); + void clear (); + void sortStartFlight (); + + AirspaceFlightInfo* + operator[] (int i); + + int rowCount (const QModelIndex & parent = QModelIndex()) const; + QVariant data (const QModelIndex & index, int role = Qt::DisplayRole) const; + +signals: + void countChanged (); + +protected: + QHash roleNames() const; +private: + QList _flightEntries; +}; + +//----------------------------------------------------------------------------- +class AirspaceFlightPlanProvider : public QObject +{ + Q_OBJECT +public: + + enum PermitStatus { + PermitNone = 0, //-- No flght plan + PermitPending, + PermitAccepted, + PermitRejected, + PermitNotRequired, + }; + + Q_ENUM(PermitStatus) + + AirspaceFlightPlanProvider (QObject *parent = nullptr); + + ///< Flight Planning and Filing + Q_PROPERTY(QDateTime flightStartTime READ flightStartTime WRITE setFlightStartTime NOTIFY flightStartTimeChanged) ///< Start of flight + Q_PROPERTY(int flightDuration READ flightDuration WRITE setFlightDuration NOTIFY flightDurationChanged) ///< Flight Duration + Q_PROPERTY(bool flightStartsNow READ flightStartsNow WRITE setFlightStartsNow NOTIFY flightStartsNowChanged) + + ///< Flight Briefing + Q_PROPERTY(PermitStatus flightPermitStatus READ flightPermitStatus NOTIFY flightPermitStatusChanged) ///< State of flight permission + Q_PROPERTY(bool valid READ valid NOTIFY advisoryChanged) + Q_PROPERTY(QmlObjectListModel* advisories READ advisories NOTIFY advisoryChanged) + Q_PROPERTY(QmlObjectListModel* ruleSets READ ruleSets NOTIFY advisoryChanged) + Q_PROPERTY(QGCGeoBoundingCube* missionArea READ missionArea NOTIFY missionAreaChanged) + Q_PROPERTY(AirspaceAdvisoryProvider::AdvisoryColor airspaceColor READ airspaceColor NOTIFY advisoryChanged) + Q_PROPERTY(QmlObjectListModel* rulesViolation READ rulesViolation NOTIFY rulesChanged) + Q_PROPERTY(QmlObjectListModel* rulesInfo READ rulesInfo NOTIFY rulesChanged) + Q_PROPERTY(QmlObjectListModel* rulesReview READ rulesReview NOTIFY rulesChanged) + Q_PROPERTY(QmlObjectListModel* rulesFollowing READ rulesFollowing NOTIFY rulesChanged) + Q_PROPERTY(QmlObjectListModel* briefFeatures READ briefFeatures NOTIFY rulesChanged) + Q_PROPERTY(QmlObjectListModel* authorizations READ authorizations NOTIFY rulesChanged) + + ///< Flight Management + Q_PROPERTY(AirspaceFlightModel* flightList READ flightList NOTIFY flightListChanged) + Q_PROPERTY(bool loadingFlightList READ loadingFlightList NOTIFY loadingFlightListChanged) + Q_PROPERTY(bool dirty READ dirty WRITE setDirty NOTIFY dirtyChanged) + + //-- TODO: This will submit the current flight plan in memory. + Q_INVOKABLE virtual void submitFlightPlan () = 0; + Q_INVOKABLE virtual void updateFlightPlan () = 0; + Q_INVOKABLE virtual void loadFlightList (QDateTime startTime, QDateTime endTime) = 0; + Q_INVOKABLE virtual void endFlight (QString flighID) = 0; + + virtual PermitStatus flightPermitStatus () const { return PermitNone; } + virtual QDateTime flightStartTime () const = 0; + virtual int flightDuration () const = 0; + virtual bool flightStartsNow () const = 0; + virtual QGCGeoBoundingCube* missionArea () = 0; + virtual bool valid () = 0; ///< Current advisory list is valid + virtual QmlObjectListModel* advisories () = 0; ///< List of AirspaceAdvisory + virtual QmlObjectListModel* ruleSets () = 0; ///< List of AirspaceRuleSet + virtual AirspaceAdvisoryProvider::AdvisoryColor airspaceColor () = 0; ///< Aispace overall color + + virtual QmlObjectListModel* rulesViolation () = 0; ///< List of AirspaceRule in violation + virtual QmlObjectListModel* rulesInfo () = 0; ///< List of AirspaceRule need more information + virtual QmlObjectListModel* rulesReview () = 0; ///< List of AirspaceRule should review + virtual QmlObjectListModel* rulesFollowing () = 0; ///< List of AirspaceRule following + virtual QmlObjectListModel* briefFeatures () = 0; ///< List of AirspaceRule in violation + virtual QmlObjectListModel* authorizations () = 0; ///< List of AirspaceFlightAuthorization + virtual AirspaceFlightModel*flightList () = 0; ///< List of AirspaceFlightInfo + virtual bool loadingFlightList () = 0; + virtual bool dirty () { return _dirty; } + + virtual void setFlightStartTime (QDateTime start) = 0; + virtual void setFlightDuration (int seconds) = 0; + virtual void setFlightStartsNow (bool now) = 0; + virtual void startFlightPlanning (PlanMasterController* planController) = 0; + virtual void setDirty (bool dirt) { if(_dirty != dirt) { _dirty = dirt; emit dirtyChanged(); }} + +signals: + void flightPermitStatusChanged (); + void flightStartTimeChanged (); + void flightStartsNowChanged (); + void flightDurationChanged (); + void advisoryChanged (); + void missionAreaChanged (); + void rulesChanged (); + void flightListChanged (); + void loadingFlightListChanged (); + void dirtyChanged (); + +protected: + bool _dirty = false; +}; diff --git a/src/AirspaceManagement/AirspaceManager.cc b/src/AirspaceManagement/AirspaceManager.cc new file mode 100644 index 0000000..e34d2b8 --- /dev/null +++ b/src/AirspaceManagement/AirspaceManager.cc @@ -0,0 +1,155 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + + +#include "AirspaceAdvisoryProvider.h" +#include "AirspaceFlightPlanProvider.h" +#include "AirspaceManager.h" +#include "AirspaceRestriction.h" +#include "AirspaceRestrictionProvider.h" +#include "AirspaceRulesetsProvider.h" +#include "AirspaceVehicleManager.h" +#include "AirspaceWeatherInfoProvider.h" + +#include "Vehicle.h" +#include "QGCApplication.h" + +QGC_LOGGING_CATEGORY(AirspaceManagementLog, "AirspaceManagementLog") + +//----------------------------------------------------------------------------- +AirspaceManager::AirspaceManager(QGCApplication* app, QGCToolbox* toolbox) + : QGCTool(app, toolbox) +{ + _ruleUpdateTimer.setInterval(2000); + _ruleUpdateTimer.setSingleShot(true); + _updateTimer.setInterval(1000); + _updateTimer.setSingleShot(true); + connect(&_ruleUpdateTimer, &QTimer::timeout, this, &AirspaceManager::_updateRulesTimeout); + connect(&_updateTimer, &QTimer::timeout, this, &AirspaceManager::_updateTimeout); + qmlRegisterUncreatableType ("QGroundControl.Airspace", 1, 0, "AirspaceAdvisoryProvider", "Reference only"); + qmlRegisterUncreatableType ("QGroundControl.Airspace", 1, 0, "AirspaceFlightPlanProvider", "Reference only"); + qmlRegisterUncreatableType ("QGroundControl.Airspace", 1, 0, "AirspaceManager", "Reference only"); + qmlRegisterUncreatableType ("QGroundControl.Airspace", 1, 0, "AirspaceRestrictionProvider", "Reference only"); + qmlRegisterUncreatableType ("QGroundControl.Airspace", 1, 0, "AirspaceRule", "Reference only"); + qmlRegisterUncreatableType ("QGroundControl.Airspace", 1, 0, "AirspaceRuleFeature", "Reference only"); + qmlRegisterUncreatableType ("QGroundControl.Airspace", 1, 0, "AirspaceRuleSet", "Reference only"); + qmlRegisterUncreatableType ("QGroundControl.Airspace", 1, 0, "AirspaceRulesetsProvider", "Reference only"); + qmlRegisterUncreatableType ("QGroundControl.Airspace", 1, 0, "AirspaceWeatherInfoProvider", "Reference only"); + qmlRegisterUncreatableType ("QGroundControl.Airspace", 1, 0, "AirspaceFlightAuthorization", "Reference only"); + qmlRegisterUncreatableType ("QGroundControl.Airspace", 1, 0, "AirspaceFlightInfo", "Reference only"); +} + +//----------------------------------------------------------------------------- +AirspaceManager::~AirspaceManager() +{ + delete _advisories; + _advisories = nullptr; + delete _weatherProvider; + _weatherProvider = nullptr; + delete _ruleSetsProvider; + _ruleSetsProvider = nullptr; + delete _airspaces; + _airspaces = nullptr; + delete _flightPlan; + _flightPlan = nullptr; +} + +//----------------------------------------------------------------------------- +void +AirspaceManager::setToolbox(QGCToolbox* toolbox) +{ + QGCTool::setToolbox(toolbox); + // We should not call virtual methods in the constructor, so we instantiate the restriction provider here + _ruleSetsProvider = _instantiateRulesetsProvider(); + _weatherProvider = _instatiateAirspaceWeatherInfoProvider(); + _advisories = _instatiateAirspaceAdvisoryProvider(); + _airspaces = _instantiateAirspaceRestrictionProvider(); + _flightPlan = _instantiateAirspaceFlightPlanProvider(); + //-- Keep track of rule changes + if(_ruleSetsProvider) { + connect(_ruleSetsProvider, &AirspaceRulesetsProvider::selectedRuleSetsChanged, this, &AirspaceManager::_rulesChanged); + } +} + +//----------------------------------------------------------------------------- +void +AirspaceManager::setROI(const QGeoCoordinate& pointNW, const QGeoCoordinate& pointSE, bool planView, bool reset) +{ + if(planView) { + //-- Is there a mission? + if(_flightPlan->flightPermitStatus() != AirspaceFlightPlanProvider::PermitNone) { + //-- Is there a polygon to work with? + if(_flightPlan->missionArea()->isValid() && _flightPlan->missionArea()->area() > 0.0) { + if(reset) { + _roi = *_flightPlan->missionArea(); + _updateToROI(true); + } else { + _setROI(*_flightPlan->missionArea()); + } + return; + } + } + } + //-- Use screen coordinates (what you see is what you get) + if(reset) { + _roi = QGCGeoBoundingCube(pointNW, pointSE); + _updateToROI(true); + } else { + _setROI(QGCGeoBoundingCube(pointNW, pointSE)); + } +} + +//----------------------------------------------------------------------------- +void +AirspaceManager::_setROI(const QGCGeoBoundingCube& roi) +{ + if(_roi != roi) { + _roi = roi; + _updateTimer.start(); + } +} + +//----------------------------------------------------------------------------- +void +AirspaceManager::_updateToROI(bool reset) +{ + if(_airspaces) { + _airspaces->setROI(_roi, reset); + } + if(_ruleSetsProvider) { + _ruleSetsProvider->setROI(_roi, reset); + } + if(_weatherProvider) { + _weatherProvider->setROI(_roi, reset); + } +} + + +//----------------------------------------------------------------------------- +void +AirspaceManager::_updateTimeout() +{ + _updateToROI(false); +} + +//----------------------------------------------------------------------------- +void +AirspaceManager::_rulesChanged() +{ + _ruleUpdateTimer.start(); +} + +//----------------------------------------------------------------------------- +void +AirspaceManager::_updateRulesTimeout() +{ + if (_advisories) { + _advisories->setROI(_roi, true); + } +} diff --git a/src/AirspaceManagement/AirspaceManager.h b/src/AirspaceManagement/AirspaceManager.h new file mode 100644 index 0000000..9d438e8 --- /dev/null +++ b/src/AirspaceManagement/AirspaceManager.h @@ -0,0 +1,148 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#pragma once + +/** + * @file AirspaceManager.h + * This file contains the interface definitions used by an airspace management implementation (AirMap). + * There are 3 base classes that must be subclassed: + * - AirspaceManager + * main manager that contains the restrictions for display. It acts as a factory to create instances of the other + * classes. + * - AirspaceVehicleManager + * this provides the multi-vehicle support - each vehicle has an instance + * - AirspaceAdvisoriesProvider + * Provides airspace advisories and restrictions. Currently only used by AirspaceManager, but + * each vehicle could have its own restrictions. + */ + +#include "QGCToolbox.h" +#include "QGCLoggingCategory.h" +#include "QmlObjectListModel.h" +#include "QGCGeoBoundingCube.h" + +#include +#include +#include +#include +#include + +class AirspaceAdvisoryProvider; +class AirspaceFlightPlanProvider; +class AirspaceRestrictionProvider; +class AirspaceRulesetsProvider; +class AirspaceVehicleManager; +class AirspaceWeatherInfoProvider; +class PlanMasterController; +class QGCApplication; +class Vehicle; + +Q_DECLARE_LOGGING_CATEGORY(AirspaceManagementLog) + +//----------------------------------------------------------------------------- +/** + * @class AirspaceManager + * Base class for airspace management. There is one (global) instantiation of this + */ +class AirspaceManager : public QGCTool { + Q_OBJECT +public: + AirspaceManager(QGCApplication* app, QGCToolbox* toolbox); + virtual ~AirspaceManager() override; + + enum AuthStatus { + Unknown, + Anonymous, + Authenticated, + Error + }; + + Q_ENUM(AuthStatus) + + Q_PROPERTY(QString providerName READ providerName CONSTANT) + Q_PROPERTY(AirspaceWeatherInfoProvider* weatherInfo READ weatherInfo CONSTANT) + Q_PROPERTY(AirspaceAdvisoryProvider* advisories READ advisories CONSTANT) + Q_PROPERTY(AirspaceRulesetsProvider* ruleSets READ ruleSets CONSTANT) + Q_PROPERTY(AirspaceRestrictionProvider* airspaces READ airspaces CONSTANT) + Q_PROPERTY(AirspaceFlightPlanProvider* flightPlan READ flightPlan CONSTANT) + Q_PROPERTY(bool connected READ connected NOTIFY connectedChanged) + Q_PROPERTY(QString connectStatus READ connectStatus NOTIFY connectStatusChanged) + Q_PROPERTY(AirspaceManager::AuthStatus authStatus READ authStatus NOTIFY authStatusChanged) + Q_PROPERTY(bool airspaceVisible READ airspaceVisible WRITE setAirspaceVisible NOTIFY airspaceVisibleChanged) + + Q_INVOKABLE void setROI (const QGeoCoordinate& pointNW, const QGeoCoordinate& pointSE, bool planView, bool reset = false); + + AirspaceWeatherInfoProvider* weatherInfo () { return _weatherProvider; } + AirspaceAdvisoryProvider* advisories () { return _advisories; } + AirspaceRulesetsProvider* ruleSets () { return _ruleSetsProvider; } + AirspaceRestrictionProvider* airspaces () { return _airspaces; } + AirspaceFlightPlanProvider* flightPlan () { return _flightPlan; } + + void setToolbox(QGCToolbox* toolbox) override; + + virtual QString providerName () const = 0; ///< Name of the airspace management provider (used in the UI) + + virtual bool airspaceVisible () { return _airspaceVisible; } + virtual void setAirspaceVisible (bool set) { _airspaceVisible = set; emit airspaceVisibleChanged(); } + virtual bool connected () const = 0; + virtual QString connectStatus () const { return QString(); } + virtual double maxAreaOfInterest() const { return _maxAreaOfInterest; } + + virtual AirspaceManager::AuthStatus authStatus () const { return Anonymous; } + + /** + * Factory method to create an AirspaceVehicleManager object + */ + virtual AirspaceVehicleManager* instantiateVehicle (const Vehicle& vehicle) = 0; + +signals: + void airspaceVisibleChanged (); + void connectedChanged (); + void connectStatusChanged (); + void authStatusChanged (); + +protected: + /** + * Set the ROI for airspace information (restrictions shown in UI) + * @param center Center coordinate for ROI + * @param radiusMeters Radius in meters around center which is of interest + */ + virtual void _setROI (const QGCGeoBoundingCube& roi); + + /** + * Factory methods + */ + virtual AirspaceRulesetsProvider* _instantiateRulesetsProvider () = 0; + virtual AirspaceWeatherInfoProvider* _instatiateAirspaceWeatherInfoProvider () = 0; + virtual AirspaceAdvisoryProvider* _instatiateAirspaceAdvisoryProvider () = 0; + virtual AirspaceRestrictionProvider* _instantiateAirspaceRestrictionProvider () = 0; + virtual AirspaceFlightPlanProvider* _instantiateAirspaceFlightPlanProvider () = 0; + +protected: + bool _airspaceVisible = false; + AirspaceRulesetsProvider* _ruleSetsProvider = nullptr; ///< Rulesets + AirspaceWeatherInfoProvider* _weatherProvider = nullptr; ///< Weather info + AirspaceAdvisoryProvider* _advisories = nullptr; ///< Advisory info + AirspaceRestrictionProvider* _airspaces = nullptr; ///< Airspace info + AirspaceFlightPlanProvider* _flightPlan = nullptr; ///< Flight plan management + double _maxAreaOfInterest = 500.0; ///< Ignore area larger than 500km^2 + QTimer _ruleUpdateTimer; + QTimer _updateTimer; + QGCGeoBoundingCube _roi; + +private slots: + void _updateRulesTimeout (); + void _updateTimeout (); + void _rulesChanged (); + +private: + void _updateToROI (bool reset = false); + +}; diff --git a/src/AirspaceManagement/AirspaceRestriction.cc b/src/AirspaceManagement/AirspaceRestriction.cc new file mode 100644 index 0000000..dc1e3ce --- /dev/null +++ b/src/AirspaceManagement/AirspaceRestriction.cc @@ -0,0 +1,35 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#include "AirspaceRestriction.h" + +AirspaceRestriction::AirspaceRestriction(QString advisoryID, QColor color, QColor lineColor, float lineWidth, QObject* parent) + : QObject(parent) + , _advisoryID(advisoryID) + , _color(color) + , _lineColor(lineColor) + , _lineWidth(lineWidth) +{ +} + +AirspacePolygonRestriction::AirspacePolygonRestriction(const QVariantList& polygon, QString advisoryID, QColor color, QColor lineColor, float lineWidth, QObject* parent) + : AirspaceRestriction(advisoryID, color, lineColor, lineWidth, parent) + , _polygon(polygon) +{ + +} + +AirspaceCircularRestriction::AirspaceCircularRestriction(const QGeoCoordinate& center, double radius, QString advisoryID, QColor color, QColor lineColor, float lineWidth, QObject* parent) + : AirspaceRestriction(advisoryID, color, lineColor, lineWidth, parent) + , _center(center) + , _radius(radius) +{ + +} + diff --git a/src/AirspaceManagement/AirspaceRestriction.h b/src/AirspaceManagement/AirspaceRestriction.h new file mode 100644 index 0000000..7057e25 --- /dev/null +++ b/src/AirspaceManagement/AirspaceRestriction.h @@ -0,0 +1,76 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#pragma once + +#include +#include +#include +#include + +/** + * @class AirspaceRestriction + * Base classe for an airspace restriction + */ + +class AirspaceRestriction : public QObject +{ + Q_OBJECT +public: + AirspaceRestriction(QString advisoryID, QColor color, QColor lineColor, float lineWidth, QObject* parent = nullptr); + Q_PROPERTY(QString advisoryID READ advisoryID CONSTANT) + Q_PROPERTY(QColor color READ color CONSTANT) + Q_PROPERTY(QColor lineColor READ lineColor CONSTANT) + Q_PROPERTY(float lineWidth READ lineWidth CONSTANT) + QString advisoryID () { return _advisoryID; } + QColor color () { return _color; } + QColor lineColor () { return _lineColor; } + float lineWidth () { return _lineWidth; } +protected: + QString _advisoryID; + QColor _color; + QColor _lineColor; + float _lineWidth; +}; + +/** + * @class AirspacePolygonRestriction + * Base classe for an airspace restriction defined by a polygon + */ + +class AirspacePolygonRestriction : public AirspaceRestriction +{ + Q_OBJECT +public: + AirspacePolygonRestriction(const QVariantList& polygon, QString advisoryID, QColor color, QColor lineColor, float lineWidth, QObject* parent = nullptr); + Q_PROPERTY(QVariantList polygon READ polygon CONSTANT) + QVariantList polygon() { return _polygon; } +private: + QVariantList _polygon; +}; + +/** + * @class AirspaceRestriction + * Base classe for an airspace restriction defined by a circle + */ + +class AirspaceCircularRestriction : public AirspaceRestriction +{ + Q_OBJECT +public: + AirspaceCircularRestriction(const QGeoCoordinate& center, double radius, QString advisoryID, QColor color, QColor lineColor, float lineWidth, QObject* parent = nullptr); + Q_PROPERTY(QGeoCoordinate center READ center CONSTANT) + Q_PROPERTY(double radius READ radius CONSTANT) + QGeoCoordinate center () { return _center; } + double radius () { return _radius; } +private: + QGeoCoordinate _center; + double _radius; +}; + diff --git a/android/src/AndroidInterface.h b/src/AirspaceManagement/AirspaceRestrictionProvider.cc similarity index 53% rename from android/src/AndroidInterface.h rename to src/AirspaceManagement/AirspaceRestrictionProvider.cc index a03370a..f3d7df9 100644 --- a/android/src/AndroidInterface.h +++ b/src/AirspaceManagement/AirspaceRestrictionProvider.cc @@ -1,21 +1,15 @@ /**************************************************************************** * - * Copyright (C) 2018 Pinecone Inc. All rights reserved. + * (c) 2009-2020 QGROUNDCONTROL PROJECT * * QGroundControl is licensed according to the terms in the file * COPYING.md in the root of the source code directory. * ****************************************************************************/ -#pragma once +#include "AirspaceRestrictionProvider.h" -#include -#include -#include -#include - -class AndroidInterface +AirspaceRestrictionProvider::AirspaceRestrictionProvider(QObject *parent) + : QObject(parent) { -public: - static QString getSDCardPath(); -}; +} diff --git a/src/AirspaceManagement/AirspaceRestrictionProvider.h b/src/AirspaceManagement/AirspaceRestrictionProvider.h new file mode 100644 index 0000000..6e1a0fc --- /dev/null +++ b/src/AirspaceManagement/AirspaceRestrictionProvider.h @@ -0,0 +1,45 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#pragma once + +/** + * @class AirspaceRestrictionProvider + * Base class that queries for airspace restrictions + */ + +#include "QmlObjectListModel.h" +#include "QGCGeoBoundingCube.h" + +#include +#include +#include + +class AirspacePolygonRestriction; +class AirspaceCircularRestriction; + +class AirspaceRestrictionProvider : public QObject { + Q_OBJECT +public: + AirspaceRestrictionProvider (QObject* parent = nullptr); + ~AirspaceRestrictionProvider () = default; + + Q_PROPERTY(QmlObjectListModel* polygons READ polygons CONSTANT) + Q_PROPERTY(QmlObjectListModel* circles READ circles CONSTANT) + + /** + * Set region of interest that should be queried. When finished, the requestDone() signal will be emmited. + * @param center Center coordinate for ROI + * @param radiusMeters Radius in meters around center which is of interest + */ + virtual void setROI (const QGCGeoBoundingCube& roi, bool reset = false) = 0; + + virtual QmlObjectListModel* polygons () = 0; ///< List of AirspacePolygonRestriction objects + virtual QmlObjectListModel* circles () = 0; ///< List of AirspaceCircularRestriction objects +}; diff --git a/src/AirspaceManagement/AirspaceRulesetsProvider.cc b/src/AirspaceManagement/AirspaceRulesetsProvider.cc new file mode 100644 index 0000000..80ad754 --- /dev/null +++ b/src/AirspaceManagement/AirspaceRulesetsProvider.cc @@ -0,0 +1,30 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#include "AirspaceRulesetsProvider.h" + +AirspaceRuleFeature::AirspaceRuleFeature(QObject* parent) + : QObject(parent) +{ +} + +AirspaceRule::AirspaceRule(QObject *parent) + : QObject(parent) +{ +} + +AirspaceRuleSet::AirspaceRuleSet(QObject* parent) + : QObject(parent) +{ +} + +AirspaceRulesetsProvider::AirspaceRulesetsProvider(QObject *parent) + : QObject(parent) +{ +} diff --git a/src/AirspaceManagement/AirspaceRulesetsProvider.h b/src/AirspaceManagement/AirspaceRulesetsProvider.h new file mode 100644 index 0000000..5168713 --- /dev/null +++ b/src/AirspaceManagement/AirspaceRulesetsProvider.h @@ -0,0 +1,173 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#pragma once + +//----------------------------------------------------------------------------- +/** + * @class AirspaceRulesetsProvider + * Base class that queries for airspace rulesets + */ + +#include "QmlObjectListModel.h" +#include "QGCGeoBoundingCube.h" + +#include +#include + +//----------------------------------------------------------------------------- +class AirspaceRuleFeature : public QObject +{ + Q_OBJECT +public: + + enum Type { + Unknown, + Boolean, + Float, + String, + }; + + enum Measurement { + UnknownMeasurement, + Speed, + Weight, + Distance, + }; + + enum Unit { + UnknownUnit, + Kilogram, + Meters, + MetersPerSecond, + }; + + Q_ENUM(Type) + Q_ENUM(Measurement) + Q_ENUM(Unit) + + AirspaceRuleFeature(QObject* parent = nullptr); + + Q_PROPERTY(quint32 id READ id CONSTANT) + Q_PROPERTY(Type type READ type CONSTANT) + Q_PROPERTY(Unit unit READ unit CONSTANT) + Q_PROPERTY(Measurement measurement READ measurement CONSTANT) + Q_PROPERTY(QString name READ name CONSTANT) + Q_PROPERTY(QString description READ description CONSTANT) + Q_PROPERTY(QVariant value READ value WRITE setValue NOTIFY valueChanged) + + virtual quint32 id () = 0; + virtual Type type () = 0; + virtual Unit unit () = 0; + virtual Measurement measurement () = 0; + virtual QString name () = 0; + virtual QString description () = 0; + virtual QVariant value () = 0; + virtual void setValue (const QVariant val) = 0; + +signals: + void valueChanged (); +}; + +//----------------------------------------------------------------------------- +class AirspaceRule : public QObject +{ + Q_OBJECT +public: + + enum Status { + Conflicting, ///< The rule is conflicting. + MissingInfo, ///< The evaluation requires further information. + NotConflicting, ///< The rule is not conflicting, all good to go. + Informational, ///< The rule is of informational nature. + Unknown, ///< The status of the rule is unknown. + }; + + Q_ENUM(Status) + + AirspaceRule(QObject* parent = nullptr); + + Q_PROPERTY(Status status READ status CONSTANT) + Q_PROPERTY(QString shortText READ shortText CONSTANT) + Q_PROPERTY(QString description READ description CONSTANT) + Q_PROPERTY(QmlObjectListModel* features READ features CONSTANT) + + virtual Status status () = 0; + virtual QString shortText () = 0; + virtual QString description () = 0; + virtual QmlObjectListModel* features () = 0; ///< List of AirspaceRuleFeature +}; + +//----------------------------------------------------------------------------- +class AirspaceRuleSet : public QObject +{ + Q_OBJECT +public: + + enum SelectionType { + Pickone, ///< One rule from the overall set needs to be picked. + Required, ///< Satisfying the RuleSet is required. + Optional ///< Satisfying the RuleSet is not required. + }; + + Q_ENUM(SelectionType) + + AirspaceRuleSet(QObject* parent = nullptr); + + Q_PROPERTY(QString id READ id CONSTANT) + Q_PROPERTY(QString name READ name CONSTANT) + Q_PROPERTY(QString shortName READ shortName CONSTANT) + Q_PROPERTY(QString description READ description CONSTANT) + Q_PROPERTY(bool isDefault READ isDefault CONSTANT) + Q_PROPERTY(SelectionType selectionType READ selectionType CONSTANT) + Q_PROPERTY(bool selected READ selected WRITE setSelected NOTIFY selectedChanged) + Q_PROPERTY(QmlObjectListModel* rules READ rules CONSTANT) + + virtual QString id () = 0; + virtual QString description () = 0; + virtual bool isDefault () = 0; + virtual QString name () = 0; + virtual QString shortName () = 0; + virtual SelectionType selectionType () = 0; + virtual bool selected () = 0; + virtual void setSelected (bool sel) = 0; + virtual QmlObjectListModel* rules () = 0; ///< List of AirspaceRule + +signals: + void selectedChanged (); + +}; + +//----------------------------------------------------------------------------- +class AirspaceRulesetsProvider : public QObject { + Q_OBJECT +public: + AirspaceRulesetsProvider (QObject* parent = nullptr); + ~AirspaceRulesetsProvider () = default; + + Q_PROPERTY(bool valid READ valid NOTIFY ruleSetsChanged) + Q_PROPERTY(QString selectedRuleSets READ selectedRuleSets NOTIFY selectedRuleSetsChanged) + Q_PROPERTY(QmlObjectListModel* ruleSets READ ruleSets NOTIFY ruleSetsChanged) + + Q_INVOKABLE virtual void clearAllFeatures() {;} ///< Clear all saved (persistent) feature values + + virtual bool valid () = 0; ///< Current ruleset is valid + virtual QmlObjectListModel* ruleSets () = 0; ///< List of AirspaceRuleSet + virtual QString selectedRuleSets() = 0; ///< All selected rules concatenated into a string + /** + * Set region of interest that should be queried. When finished, the rulesChanged() signal will be emmited. + * @param center Center coordinate for ROI + */ + virtual void setROI (const QGCGeoBoundingCube& roi, bool reset = false) = 0; + +signals: + void ruleSetsChanged (); + void selectedRuleSetsChanged (); +}; + diff --git a/src/AirspaceManagement/AirspaceVehicleManager.cc b/src/AirspaceManagement/AirspaceVehicleManager.cc new file mode 100644 index 0000000..099a8cd --- /dev/null +++ b/src/AirspaceManagement/AirspaceVehicleManager.cc @@ -0,0 +1,40 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + + +#include "AirspaceManager.h" +#include "AirspaceVehicleManager.h" +#include "Vehicle.h" +#include "MissionItem.h" + +AirspaceVehicleManager::AirspaceVehicleManager(const Vehicle& vehicle) + : _vehicle(vehicle) +{ + qCDebug(AirspaceManagementLog) << "Instatiating AirspaceVehicleManager"; + connect(&_vehicle, &Vehicle::armedChanged, this, &AirspaceVehicleManager::_vehicleArmedChanged); + connect(&_vehicle, &Vehicle::mavlinkMessageReceived, this, &AirspaceVehicleManager::vehicleMavlinkMessageReceived); +} + +void AirspaceVehicleManager::_vehicleArmedChanged(bool armed) +{ + if (armed) { + qCDebug(AirspaceManagementLog) << "Starting telemetry"; + startTelemetryStream(); + _vehicleWasInMissionMode = _vehicle.flightMode() == _vehicle.missionFlightMode(); + } else { + qCDebug(AirspaceManagementLog) << "Stopping telemetry"; + stopTelemetryStream(); + // end the flight if we were in mission mode during arming or disarming + // TODO: needs to be improved. for instance if we do RTL and then want to continue the mission... + if (_vehicleWasInMissionMode || _vehicle.flightMode() == _vehicle.missionFlightMode()) { + endFlight(); + } + } +} + diff --git a/src/AirspaceManagement/AirspaceVehicleManager.h b/src/AirspaceManagement/AirspaceVehicleManager.h new file mode 100644 index 0000000..8531478 --- /dev/null +++ b/src/AirspaceManagement/AirspaceVehicleManager.h @@ -0,0 +1,58 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#pragma once + +#include "AirspaceFlightPlanProvider.h" +#include "QGCMAVLink.h" + +#include +#include +#include + +class Vehicle; + +//----------------------------------------------------------------------------- +/** + * @class AirspaceVehicleManager + * Base class for per-vehicle management (each vehicle has one (or zero) of these) + */ + +class AirspaceVehicleManager : public QObject { + Q_OBJECT +public: + AirspaceVehicleManager (const Vehicle& vehicle); + virtual ~AirspaceVehicleManager () = default; + + /** + * Setup the connection and start sending telemetry + */ + virtual void startTelemetryStream () = 0; + virtual void stopTelemetryStream () = 0; + virtual bool isTelemetryStreaming () = 0; + +public slots: + virtual void endFlight () = 0; + +signals: + void trafficUpdate (bool alert, QString traffic_id, QString vehicle_id, QGeoCoordinate location, float heading); + void flightPermitStatusChanged (); + +protected slots: + virtual void vehicleMavlinkMessageReceived(const mavlink_message_t& message) = 0; + +protected: + const Vehicle& _vehicle; + +private slots: + void _vehicleArmedChanged (bool armed); + +private: + bool _vehicleWasInMissionMode = false; ///< true if the vehicle was in mission mode when arming +}; diff --git a/src/AirspaceManagement/AirspaceWeatherInfoProvider.cc b/src/AirspaceManagement/AirspaceWeatherInfoProvider.cc new file mode 100644 index 0000000..74a0c7c --- /dev/null +++ b/src/AirspaceManagement/AirspaceWeatherInfoProvider.cc @@ -0,0 +1,15 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#include "AirspaceWeatherInfoProvider.h" + +AirspaceWeatherInfoProvider::AirspaceWeatherInfoProvider(QObject *parent) + : QObject(parent) +{ +} diff --git a/src/AirspaceManagement/AirspaceWeatherInfoProvider.h b/src/AirspaceManagement/AirspaceWeatherInfoProvider.h new file mode 100644 index 0000000..9231b98 --- /dev/null +++ b/src/AirspaceManagement/AirspaceWeatherInfoProvider.h @@ -0,0 +1,58 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#pragma once + +/** + * @file AirspaceWeatherInfoProvider.h + * Weather information provided by the Airspace Managemement + */ + +#include "QGCGeoBoundingCube.h" +#include +#include + +class AirspaceWeatherInfoProvider : public QObject +{ + Q_OBJECT +public: + AirspaceWeatherInfoProvider(QObject *parent = nullptr); + virtual ~AirspaceWeatherInfoProvider() {} + + Q_PROPERTY(bool valid READ valid NOTIFY weatherChanged) + Q_PROPERTY(QString condition READ condition NOTIFY weatherChanged) + Q_PROPERTY(QString icon READ icon NOTIFY weatherChanged) + Q_PROPERTY(quint32 windHeading READ windHeading NOTIFY weatherChanged) + Q_PROPERTY(float windSpeed READ windSpeed NOTIFY weatherChanged) + Q_PROPERTY(quint32 windGusting READ windGusting NOTIFY weatherChanged) + Q_PROPERTY(float temperature READ temperature NOTIFY weatherChanged) + Q_PROPERTY(float humidity READ humidity NOTIFY weatherChanged) + Q_PROPERTY(float visibility READ visibility NOTIFY weatherChanged) + Q_PROPERTY(float precipitation READ precipitation NOTIFY weatherChanged) + + virtual bool valid () = 0; ///< Current weather data is valid + virtual QString condition () = 0; ///< The overall weather condition. + virtual QString icon () = 0; ///< 2:1 Aspect ratio icon url ready to be used by an Image QML Item + virtual quint32 windHeading () = 0; ///< The heading in [°]. + virtual float windSpeed () = 0; ///< The speed in [°]. + virtual quint32 windGusting () = 0; + virtual float temperature () = 0; ///< The temperature in [°C]. + virtual float humidity () = 0; + virtual float visibility () = 0; ///< Visibility in [m]. + virtual float precipitation () = 0; ///< The probability of precipitation in [%]. + + /** + * Set region of interest that should be queried. When finished, the weatherChanged() signal will be emmited. + * @param center Center coordinate for ROI + */ + virtual void setROI (const QGCGeoBoundingCube& roi, bool reset = false) = 0; + +signals: + void weatherChanged (); +}; diff --git a/src/AirspaceManagement/CMakeLists.txt b/src/AirspaceManagement/CMakeLists.txt new file mode 100644 index 0000000..306abee --- /dev/null +++ b/src/AirspaceManagement/CMakeLists.txt @@ -0,0 +1,14 @@ + +if(QGC_AIRMAP) + add_library(AirspaceManagement + AirspaceManagement/AirspaceAdvisoryProvider.cc + AirspaceManagement/AirspaceFlightPlanProvider.cc + AirspaceManagement/AirspaceManager.cc + AirspaceManagement/AirspaceRestriction.cc + AirspaceManagement/AirspaceRestrictionProvider.cc + AirspaceManagement/AirspaceRulesetsProvider.cc + AirspaceManagement/AirspaceVehicleManager.cc + AirspaceManagement/AirspaceWeatherInfoProvider.cc + ) +endif() + diff --git a/src/AnalyzeView/AnalyzeView.qml b/src/AnalyzeView/AnalyzeView.qml index 798006c..16fb327 100644 --- a/src/AnalyzeView/AnalyzeView.qml +++ b/src/AnalyzeView/AnalyzeView.qml @@ -127,8 +127,43 @@ Rectangle { property string title Connections { - target: panelLoader.item - onPopout: mainWindow.createrWindowedAnalyzePage(panelLoader.title, panelLoader.source) + target: panelLoader.item + onPopout: { + var windowedPage = windowedAnalyzePage.createObject(mainWindow) + windowedPage.title = panelLoader.title + windowedPage.source = panelLoader.source + _root.popout() + } } + + } + + Component { + id: windowedAnalyzePage + + Window { + width: ScreenTools.defaultFontPixelWidth * 100 + height: ScreenTools.defaultFontPixelHeight * 40 + visible: true + + property alias source: loader.source + + Rectangle { + color: QGroundControl.globalPalette.window + anchors.fill: parent + + Loader { + id: loader + anchors.fill: parent + onLoaded: item.popped = true + } + } + + onClosing: { + visible = false + source = "" + } + } + } } diff --git a/src/AnalyzeView/LogDownloadController.cc b/src/AnalyzeView/LogDownloadController.cc index a5cd060..1f66f85 100644 --- a/src/AnalyzeView/LogDownloadController.cc +++ b/src/AnalyzeView/LogDownloadController.cc @@ -175,7 +175,7 @@ LogDownloadController::_logEntry(UASInterface* uas, uint32_t time_utc, uint32_t if(id < _logEntriesModel.count()) { QGCLogEntry* entry = _logEntriesModel[id]; entry->setSize(size); - entry->setTime(QDateTime::fromSecsSinceEpoch(time_utc)); + entry->setTime(QDateTime::fromTime_t(time_utc)); entry->setReceived(true); entry->setStatus(tr("Available")); } else { diff --git a/src/AnalyzeView/LogDownloadPage.qml b/src/AnalyzeView/LogDownloadPage.qml index 863274a..2ecb7d9 100644 --- a/src/AnalyzeView/LogDownloadPage.qml +++ b/src/AnalyzeView/LogDownloadPage.qml @@ -60,7 +60,6 @@ AnalyzePage { width: ScreenTools.defaultFontPixelWidth * 6 horizontalAlignment: Text.AlignHCenter delegate : Text { - color: styleData.textColor horizontalAlignment: Text.AlignHCenter text: { var o = logController.model.get(styleData.row) @@ -74,7 +73,6 @@ AnalyzePage { width: ScreenTools.defaultFontPixelWidth * 34 horizontalAlignment: Text.AlignHCenter delegate: Text { - color: styleData.textColor text: { var o = logController.model.get(styleData.row) if (o) { @@ -84,7 +82,7 @@ AnalyzePage { if(d.getUTCFullYear() < 2010) return qsTr("Date Unknown") else - return d.toLocaleString(undefined, "short") + return d.toLocaleString() } } return "" @@ -97,7 +95,6 @@ AnalyzePage { width: ScreenTools.defaultFontPixelWidth * 18 horizontalAlignment: Text.AlignHCenter delegate : Text { - color: styleData.textColor horizontalAlignment: Text.AlignRight text: { var o = logController.model.get(styleData.row) @@ -111,7 +108,6 @@ AnalyzePage { width: ScreenTools.defaultFontPixelWidth * 22 horizontalAlignment: Text.AlignHCenter delegate : Text { - color: styleData.textColor horizontalAlignment: Text.AlignHCenter text: { var o = logController.model.get(styleData.row) @@ -173,10 +169,21 @@ AnalyzePage { enabled: !logController.requestingList && !logController.downloadingLogs && logController.model.count > 0 text: qsTr("Erase All") width: _butttonWidth - onClicked: mainWindow.showMessageDialog(qsTr("Delete All Log Files"), - qsTr("All log files will be erased permanently. Is this really what you want?"), - StandardButton.Yes | StandardButton.No, - function() { logController.eraseAll() }) + onClicked: mainWindow.showComponentDialog( + eraseAllMessage, + qsTr("Delete All Log Files"), + mainWindow.showDialogDefaultWidth, + StandardButton.Yes | StandardButton.No) + Component { + id: eraseAllMessage + QGCViewMessage { + message: qsTr("All log files will be erased permanently. Is this really what you want?") + function accept() { + logController.eraseAll() + hideDialog() + } + } + } } QGCButton { text: qsTr("Cancel") diff --git a/src/AnalyzeView/VibrationPage.qml b/src/AnalyzeView/VibrationPage.qml index 3c6e432..345e2ec 100644 --- a/src/AnalyzeView/VibrationPage.qml +++ b/src/AnalyzeView/VibrationPage.qml @@ -21,7 +21,7 @@ import QGroundControl.ScreenTools 1.0 import QGroundControl.Controllers 1.0 AnalyzePage { - id: vibrationPage + id: geoTagPage pageComponent: pageComponent pageDescription: qsTr("Analyze vibration associated with your vehicle.") allowPopout: true @@ -29,7 +29,7 @@ AnalyzePage { property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle ? QGroundControl.multiVehicleManager.activeVehicle : QGroundControl.multiVehicleManager.offlineEditingVehicle property bool _available: !isNaN(_activeVehicle.vibration.xAxis.rawValue) property real _margins: ScreenTools.defaultFontPixelWidth / 2 - property real _barWidth: ScreenTools.defaultFontPixelWidth * 7 + property real _barWidth: ScreenTools.defaultFontPixelWidth * 3 property real _barHeight: ScreenTools.defaultFontPixelHeight * 10 property real _xValue: _activeVehicle.vibration.xAxis.rawValue property real _yValue: _activeVehicle.vibration.yAxis.rawValue @@ -38,7 +38,6 @@ AnalyzePage { readonly property real _barMinimum: 0.0 readonly property real _barMaximum: 90.0 readonly property real _barBadValue: 60.0 - readonly property real _barMidValue: 30.0 QGCPalette { id:qgcPal; colorGroupEnabled: true } @@ -51,7 +50,7 @@ AnalyzePage { RowLayout { id: barRow - spacing: ScreenTools.defaultFontPixelWidth * 2 + spacing: ScreenTools.defaultFontPixelWidth * 4 ColumnLayout { Rectangle { @@ -59,7 +58,6 @@ AnalyzePage { height: _barHeight width: _barWidth Layout.alignment: Qt.AlignHCenter - color: "transparent" border.width: 1 border.color: qgcPal.text @@ -69,42 +67,19 @@ AnalyzePage { height: parent.height * (Math.min(_barMaximum, _xValue) / (_barMaximum - _barMinimum)) color: qgcPal.text } - - // Max vibe indication line at 60 - Rectangle { - anchors.topMargin: parent.height * (1.0 - ((_barBadValue - _barMinimum) / (_barMaximum - _barMinimum))) - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right - width: parent.width - height: 1 - color: "red" - } - - // Mid vibe indication line at 30 - Rectangle { - anchors.topMargin: parent.height * (1.0 - ((_barMidValue - _barMinimum) / (_barMaximum - _barMinimum))) - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right - width: parent.width - height: 1 - color: "red" - } } QGCLabel { Layout.alignment: Qt.AlignHCenter - text: qsTr("X (%1)").arg(_xValue.toFixed(0)) + text: qsTr("X") } } - ColumnLayout { + Column { Rectangle { height: _barHeight width: _barWidth Layout.alignment: Qt.AlignHCenter - color: "transparent" border.width: 1 border.color: qgcPal.text @@ -114,42 +89,19 @@ AnalyzePage { height: parent.height * (Math.min(_barMaximum, _yValue) / (_barMaximum - _barMinimum)) color: qgcPal.text } - - // Max vibe indication line at 60 - Rectangle { - anchors.topMargin: parent.height * (1.0 - ((_barBadValue - _barMinimum) / (_barMaximum - _barMinimum))) - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right - width: parent.width - height: 1 - color: "red" - } - - // Mid vibe indication line at 30 - Rectangle { - anchors.topMargin: parent.height * (1.0 - ((_barMidValue - _barMinimum) / (_barMaximum - _barMinimum))) - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right - width: parent.width - height: 1 - color: "red" - } } QGCLabel { Layout.alignment: Qt.AlignHCenter - text: qsTr("Y (%1)").arg(_yValue.toFixed(0)) + text: qsTr("Y") } } - ColumnLayout { + Column { Rectangle { height: _barHeight width: _barWidth Layout.alignment: Qt.AlignHCenter - color: "transparent" border.width: 1 border.color: qgcPal.text @@ -159,37 +111,26 @@ AnalyzePage { height: parent.height * (Math.min(_barMaximum, _zValue) / (_barMaximum - _barMinimum)) color: qgcPal.text } - - // Max vibe indication line at 60 - Rectangle { - anchors.topMargin: parent.height * (1.0 - ((_barBadValue - _barMinimum) / (_barMaximum - _barMinimum))) - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right - width: parent.width - height: 1 - color: "red" - } - - // Mid vibe indication line at 30 - Rectangle { - anchors.topMargin: parent.height * (1.0 - ((_barMidValue - _barMinimum) / (_barMaximum - _barMinimum))) - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right - width: parent.width - height: 1 - color: "red" - } } QGCLabel { Layout.alignment: Qt.AlignHCenter - text: qsTr("Z (%1)").arg(_zValue.toFixed(0)) + text: qsTr("Z") } } } + // Max vibe indication line at 60 + Rectangle { + anchors.topMargin: xBar.height * (1.0 - ((_barBadValue - _barMinimum) / (_barMaximum - _barMinimum))) + anchors.top: barRow.top + anchors.left: barRow.left + anchors.right: barRow.right + width: barRow.width + height: 1 + color: "red" + } + Column { anchors.margins: ScreenTools.defaultFontPixelWidth anchors.left: barRow.right @@ -199,15 +140,15 @@ AnalyzePage { } QGCLabel { - text: qsTr("Accel 1: %1").arg(_activeVehicle.vibration.clipCount1.rawValue) + text: qsTr("Accel 1: ") + (_activeVehicle.vibration.clipCount1.rawValueString) } QGCLabel { - text: qsTr("Accel 2: %1").arg(_activeVehicle.vibration.clipCount2.rawValue) + text: qsTr("Accel 2: ") + (_activeVehicle.vibration.clipCount2.rawValueString) } QGCLabel { - text: qsTr("Accel 3: %1").arg(_activeVehicle.vibration.clipCount3.rawValue) + text: qsTr("Accel 3: ") + (_activeVehicle.vibration.clipCount3.rawValueString) } } diff --git a/src/AutoPilotPlugins/APM/APMAutoPilotPlugin.cc b/src/AutoPilotPlugins/APM/APMAutoPilotPlugin.cc index a8c2091..4500c00 100644 --- a/src/AutoPilotPlugins/APM/APMAutoPilotPlugin.cc +++ b/src/AutoPilotPlugins/APM/APMAutoPilotPlugin.cc @@ -29,7 +29,6 @@ #include "APMFollowComponent.h" #include "ESP8266Component.h" #include "APMHeliComponent.h" -#include "APMRemoteSupportComponent.h" #include "QGCApplication.h" #include "ParameterManager.h" @@ -54,7 +53,6 @@ APMAutoPilotPlugin::APMAutoPilotPlugin(Vehicle* vehicle, QObject* parent) , _tuningComponent (nullptr) , _esp8266Component (nullptr) , _heliComponent (nullptr) - , _apmRemoteSupportComponent(nullptr) #if 0 // Follow me not ready for Stable , _followComponent (nullptr) @@ -154,10 +152,6 @@ const QVariantList& APMAutoPilotPlugin::vehicleComponents(void) _esp8266Component->setupTriggerSignals(); _components.append(QVariant::fromValue((VehicleComponent*)_esp8266Component)); } - - _apmRemoteSupportComponent = new APMRemoteSupportComponent(_vehicle, this); - _apmRemoteSupportComponent->setupTriggerSignals(); - _components.append(QVariant::fromValue((VehicleComponent*)_apmRemoteSupportComponent)); } else { qWarning() << "Call to vehicleCompenents prior to parametersReady"; } diff --git a/src/AutoPilotPlugins/APM/APMAutoPilotPlugin.h b/src/AutoPilotPlugins/APM/APMAutoPilotPlugin.h index 57c9b04..410fb8b 100644 --- a/src/AutoPilotPlugins/APM/APMAutoPilotPlugin.h +++ b/src/AutoPilotPlugins/APM/APMAutoPilotPlugin.h @@ -27,7 +27,6 @@ class APMLightsComponent; class APMSubFrameComponent; class ESP8266Component; class APMHeliComponent; -class APMRemoteSupportComponent; class APMFollowComponent; /// This is the APM specific implementation of the AutoPilot class. @@ -58,7 +57,6 @@ protected: APMTuningComponent* _tuningComponent; ESP8266Component* _esp8266Component; APMHeliComponent* _heliComponent; - APMRemoteSupportComponent* _apmRemoteSupportComponent; #if 0 // Follow me not ready for Stable APMFollowComponent* _followComponent; diff --git a/src/AutoPilotPlugins/APM/APMCameraSubComponent.qml b/src/AutoPilotPlugins/APM/APMCameraSubComponent.qml index d73b408..97cfa89 100644 --- a/src/AutoPilotPlugins/APM/APMCameraSubComponent.qml +++ b/src/AutoPilotPlugins/APM/APMCameraSubComponent.qml @@ -70,8 +70,6 @@ SetupPage { property Fact _rc12Function: controller.getParameterFact(-1, "r.SERVO12_FUNCTION") property Fact _rc13Function: controller.getParameterFact(-1, "r.SERVO13_FUNCTION") property Fact _rc14Function: controller.getParameterFact(-1, "r.SERVO14_FUNCTION") - property Fact _rc15Function: controller.getParameterFact(-1, "r.SERVO15_FUNCTION") - property Fact _rc16Function: controller.getParameterFact(-1, "r.SERVO16_FUNCTION") // These enable/disable the options for setting up each axis property bool _tiltEnabled: false @@ -89,7 +87,7 @@ SetupPage { readonly property int _rcFunctionMountTilt: 7 readonly property int _rcFunctionMountRoll: 8 readonly property int _firstGimbalOutChannel: 5 - readonly property int _lastGimbalOutChannel: 16 + readonly property int _lastGimbalOutChannel: 14 readonly property int _mountDefaultModeRCTargetting: 3 Component.onCompleted: { @@ -163,8 +161,6 @@ SetupPage { Connections { target: _rc12Function; onValueChanged: calcGimbalOutValues() } Connections { target: _rc13Function; onValueChanged: calcGimbalOutValues() } Connections { target: _rc14Function; onValueChanged: calcGimbalOutValues() } - Connections { target: _rc15Function; onValueChanged: calcGimbalOutValues() } - Connections { target: _rc16Function; onValueChanged: calcGimbalOutValues() } // Whenever an MNT_RC_IN_* setting is changed make sure to turn on RC targeting Connections { @@ -195,8 +191,6 @@ SetupPage { ListElement { text: qsTr("Channel 12"); value: 12 } ListElement { text: qsTr("Channel 13"); value: 13 } ListElement { text: qsTr("Channel 14"); value: 14 } - ListElement { text: qsTr("Channel 15"); value: 15 } - ListElement { text: qsTr("Channel 16"); value: 16 } } QGCCheckBox { diff --git a/src/AutoPilotPlugins/APM/APMCompassCal.cc b/src/AutoPilotPlugins/APM/APMCompassCal.cc new file mode 100644 index 0000000..23a4359 --- /dev/null +++ b/src/AutoPilotPlugins/APM/APMCompassCal.cc @@ -0,0 +1,690 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + + +#include "APMCompassCal.h" +#include "AutoPilotPlugin.h" +#include "ParameterManager.h" + +QGC_LOGGING_CATEGORY(APMCompassCalLog, "APMCompassCalLog") + +const float CalWorkerThread::mag_sphere_radius = 0.2f; +const unsigned int CalWorkerThread::calibration_sides = 6; +const unsigned int CalWorkerThread::calibration_total_points = 240; +const unsigned int CalWorkerThread::calibraton_duration_seconds = CalWorkerThread::calibration_sides * 10; + +const char* CalWorkerThread::rgCompassParams[3][4] = { + { "COMPASS_OFS_X", "COMPASS_OFS_Y", "COMPASS_OFS_Z", "COMPASS_DEV_ID" }, + { "COMPASS_OFS2_X", "COMPASS_OFS2_Y", "COMPASS_OFS2_Z", "COMPASS_DEV_ID2" }, + { "COMPASS_OFS3_X", "COMPASS_OFS3_Y", "COMPASS_OFS3_Z", "COMPASS_DEV_ID3" }, +}; + +CalWorkerThread::CalWorkerThread(Vehicle* vehicle, QObject* parent) + : QThread(parent) + , _vehicle(vehicle) + , _cancel(false) +{ + +} + +void CalWorkerThread::run(void) +{ + if (calibrate() == calibrate_return_ok) { + _emitVehicleTextMessage(QStringLiteral("[cal] progress <100>")); + _emitVehicleTextMessage(QStringLiteral("[cal] calibration done: mag")); + } +} + +void CalWorkerThread::_emitVehicleTextMessage(const QString& message) +{ + emit vehicleTextMessage(_vehicle->id(), 0, MAV_SEVERITY_INFO, message); + qCDebug(APMCompassCalLog) << message; +} + +unsigned CalWorkerThread::progress_percentage(mag_worker_data_t* worker_data) +{ + return 100 * ((float)worker_data->done_count) / calibration_sides; +} + +CalWorkerThread::calibrate_return CalWorkerThread::calibrate(void) +{ + calibrate_return result = calibrate_return_ok; + + mag_worker_data_t worker_data; + + worker_data.done_count = 0; + worker_data.calibration_points_perside = calibration_total_points / calibration_sides; + worker_data.calibration_interval_perside_seconds = calibraton_duration_seconds / calibration_sides; + worker_data.calibration_interval_perside_useconds = worker_data.calibration_interval_perside_seconds * 1000 * 1000; + + // Collect data for all sides + worker_data.side_data_collected[DETECT_ORIENTATION_RIGHTSIDE_UP] = false; + worker_data.side_data_collected[DETECT_ORIENTATION_LEFT] = false; + worker_data.side_data_collected[DETECT_ORIENTATION_NOSE_DOWN] = false; + worker_data.side_data_collected[DETECT_ORIENTATION_TAIL_DOWN] = false; + worker_data.side_data_collected[DETECT_ORIENTATION_UPSIDE_DOWN] = false; + worker_data.side_data_collected[DETECT_ORIENTATION_RIGHT] = false; + + for (size_t cur_mag=0; cur_mag(malloc(sizeof(float) * calibration_points_maxcount)); + worker_data.y[cur_mag] = reinterpret_cast(malloc(sizeof(float) * calibration_points_maxcount)); + worker_data.z[cur_mag] = reinterpret_cast(malloc(sizeof(float) * calibration_points_maxcount)); + if (worker_data.x[cur_mag] == nullptr || worker_data.y[cur_mag] == nullptr || worker_data.z[cur_mag] == nullptr) { + _emitVehicleTextMessage(QStringLiteral("[cal] ERROR: out of memory")); + result = calibrate_return_error; + } + } + } + + if (result == calibrate_return_ok) { + result = calibrate_from_orientation( + worker_data.side_data_collected, // Sides to calibrate + &worker_data); // Opaque data for calibration worked + } + + // Calculate calibration values for each mag + + float sphere_x[max_mags]; + float sphere_y[max_mags]; + float sphere_z[max_mags]; + float sphere_radius[max_mags]; + + // Sphere fit the data to get calibration values + if (result == calibrate_return_ok) { + for (unsigned cur_mag=0; cur_magsendMavCommand(_vehicle->defaultComponentId(), + MAV_CMD_PREFLIGHT_SET_SENSOR_OFFSETS, + true, /* showErrors */ + sensorId, -sphere_x[cur_mag], -sphere_y[cur_mag], -sphere_z[cur_mag]); + } + } + } + } + + return result; +} + +CalWorkerThread::calibrate_return CalWorkerThread::mag_calibration_worker(detect_orientation_return orientation, void* data) +{ + calibrate_return result = calibrate_return_ok; + + unsigned int calibration_counter_side; + + mag_worker_data_t* worker_data = (mag_worker_data_t*)(data); + + _emitVehicleTextMessage(QStringLiteral("[cal] Rotate vehicle around the detected orientation")); + _emitVehicleTextMessage(QStringLiteral("[cal] Continue rotation for %1 seconds").arg(worker_data->calibration_interval_perside_seconds)); + + uint64_t calibration_deadline = QGC::groundTimeUsecs() + worker_data->calibration_interval_perside_useconds; + + unsigned int loop_interval_usecs = (worker_data->calibration_interval_perside_seconds * 1000000) / worker_data->calibration_points_perside; + + calibration_counter_side = 0; + + while (QGC::groundTimeUsecs() < calibration_deadline && calibration_counter_side < worker_data->calibration_points_perside) { + if (_cancel) { + result = calibrate_return_cancelled; + break; + } + + for (size_t cur_mag=0; cur_magx[cur_mag][worker_data->calibration_counter_total[cur_mag]] = copyLastScaledImu.xmag; + worker_data->y[cur_mag][worker_data->calibration_counter_total[cur_mag]] = copyLastScaledImu.ymag; + worker_data->z[cur_mag][worker_data->calibration_counter_total[cur_mag]] = copyLastScaledImu.zmag; + worker_data->calibration_counter_total[cur_mag]++; + } + + calibration_counter_side++; + + // Progress indicator for side + _emitVehicleTextMessage(QStringLiteral("[cal] %1 side calibration: progress <%2>").arg(detect_orientation_str(orientation)).arg(progress_percentage(worker_data) + + (unsigned)((100 / calibration_sides) * ((float)calibration_counter_side / (float)worker_data->calibration_points_perside)))); + + usleep(loop_interval_usecs); + } + + if (result == calibrate_return_ok) { + _emitVehicleTextMessage(QStringLiteral("[cal] %1 side done, rotate to a different side").arg(detect_orientation_str(orientation))); + + worker_data->done_count++; + _emitVehicleTextMessage(QStringLiteral("[cal] progress <%1>").arg(progress_percentage(worker_data))); + } + + return result; +} + +CalWorkerThread::calibrate_return CalWorkerThread::calibrate_from_orientation( + bool side_data_collected[detect_orientation_side_count], + void* worker_data) +{ + calibrate_return result = calibrate_return_ok; + + unsigned orientation_failures = 0; + + // Rotate through all requested orientations + while (true) { + if (_cancel) { + result = calibrate_return_cancelled; + break; + } + + unsigned int side_complete_count = 0; + + // Update the number of completed sides + for (unsigned i = 0; i < detect_orientation_side_count; i++) { + if (side_data_collected[i]) { + side_complete_count++; + } + } + + if (side_complete_count == detect_orientation_side_count) { + // We have completed all sides, move on + break; + } + + /* inform user which orientations are still needed */ + char pendingStr[256]; + pendingStr[0] = 0; + + for (unsigned int cur_orientation=0; cur_orientation 1000) { + break; + } + } else { + stillDetectTime = QGC::groundTimeMilliseconds(); + stillDetected = true; + } + } else { + stillDetected = false; + } + + if (_cancel) { + break; + } + + // FIXME: No timeout for never detect still + + usleep(1000); + } + + static const uint16_t rawImuOneG = 800; + static const uint16_t rawImuNoGThreshold = 200; + + if (lastX > rawImuOneG && abs(lastY) < rawImuNoGThreshold && abs(lastZ) < rawImuNoGThreshold) { + return DETECT_ORIENTATION_TAIL_DOWN; // [ g, 0, 0 ] + } + + if (lastX < -rawImuOneG && abs(lastY) < rawImuNoGThreshold && abs(lastZ) < rawImuNoGThreshold) { + return DETECT_ORIENTATION_NOSE_DOWN; // [ -g, 0, 0 ] + } + + if (lastY > rawImuOneG && abs(lastX) < rawImuNoGThreshold && abs(lastZ) < rawImuNoGThreshold) { + return DETECT_ORIENTATION_LEFT; // [ 0, g, 0 ] + } + + if (lastY < -rawImuOneG && abs(lastX) < rawImuNoGThreshold && abs(lastZ) < rawImuNoGThreshold) { + return DETECT_ORIENTATION_RIGHT; // [ 0, -g, 0 ] + } + + if (lastZ > rawImuOneG && abs(lastX) < rawImuNoGThreshold && abs(lastY) < rawImuNoGThreshold) { + return DETECT_ORIENTATION_UPSIDE_DOWN; // [ 0, 0, g ] + } + + if (lastZ < -rawImuOneG && abs(lastX) < rawImuNoGThreshold && abs(lastY) < rawImuNoGThreshold) { + return DETECT_ORIENTATION_RIGHTSIDE_UP; // [ 0, 0, -g ] + } + + _emitVehicleTextMessage(QStringLiteral("[cal] ERROR: invalid orientation")); + + return DETECT_ORIENTATION_ERROR; // Can't detect orientation +} + +const char* CalWorkerThread::detect_orientation_str(enum detect_orientation_return orientation) +{ + static const char* rgOrientationStrs[] = { + "back", // tail down + "front", // nose down + "left", + "right", + "up", // upside-down + "down", // right-side up + "error" + }; + + return rgOrientationStrs[orientation]; +} + +int CalWorkerThread::sphere_fit_least_squares(const float x[], const float y[], const float z[], + unsigned int size, unsigned int max_iterations, float delta, float *sphere_x, float *sphere_y, float *sphere_z, + float *sphere_radius) +{ + + float x_sumplain = 0.0f; + float x_sumsq = 0.0f; + float x_sumcube = 0.0f; + + float y_sumplain = 0.0f; + float y_sumsq = 0.0f; + float y_sumcube = 0.0f; + + float z_sumplain = 0.0f; + float z_sumsq = 0.0f; + float z_sumcube = 0.0f; + + float xy_sum = 0.0f; + float xz_sum = 0.0f; + float yz_sum = 0.0f; + + float x2y_sum = 0.0f; + float x2z_sum = 0.0f; + float y2x_sum = 0.0f; + float y2z_sum = 0.0f; + float z2x_sum = 0.0f; + float z2y_sum = 0.0f; + + for (unsigned int i = 0; i < size; i++) { + + float x2 = x[i] * x[i]; + float y2 = y[i] * y[i]; + float z2 = z[i] * z[i]; + + x_sumplain += x[i]; + x_sumsq += x2; + x_sumcube += x2 * x[i]; + + y_sumplain += y[i]; + y_sumsq += y2; + y_sumcube += y2 * y[i]; + + z_sumplain += z[i]; + z_sumsq += z2; + z_sumcube += z2 * z[i]; + + xy_sum += x[i] * y[i]; + xz_sum += x[i] * z[i]; + yz_sum += y[i] * z[i]; + + x2y_sum += x2 * y[i]; + x2z_sum += x2 * z[i]; + + y2x_sum += y2 * x[i]; + y2z_sum += y2 * z[i]; + + z2x_sum += z2 * x[i]; + z2y_sum += z2 * y[i]; + } + + // + //Least Squares Fit a sphere A,B,C with radius squared Rsq to 3D data + // + // P is a structure that has been computed with the data earlier. + // P.npoints is the number of elements; the length of X,Y,Z are identical. + // P's members are logically named. + // + // X[n] is the x component of point n + // Y[n] is the y component of point n + // Z[n] is the z component of point n + // + // A is the x coordiante of the sphere + // B is the y coordiante of the sphere + // C is the z coordiante of the sphere + // Rsq is the radius squared of the sphere. + // + //This method should converge; maybe 5-100 iterations or more. + // + float x_sum = x_sumplain / size; //sum( X[n] ) + float x_sum2 = x_sumsq / size; //sum( X[n]^2 ) + float x_sum3 = x_sumcube / size; //sum( X[n]^3 ) + float y_sum = y_sumplain / size; //sum( Y[n] ) + float y_sum2 = y_sumsq / size; //sum( Y[n]^2 ) + float y_sum3 = y_sumcube / size; //sum( Y[n]^3 ) + float z_sum = z_sumplain / size; //sum( Z[n] ) + float z_sum2 = z_sumsq / size; //sum( Z[n]^2 ) + float z_sum3 = z_sumcube / size; //sum( Z[n]^3 ) + + float XY = xy_sum / size; //sum( X[n] * Y[n] ) + float XZ = xz_sum / size; //sum( X[n] * Z[n] ) + float YZ = yz_sum / size; //sum( Y[n] * Z[n] ) + float X2Y = x2y_sum / size; //sum( X[n]^2 * Y[n] ) + float X2Z = x2z_sum / size; //sum( X[n]^2 * Z[n] ) + float Y2X = y2x_sum / size; //sum( Y[n]^2 * X[n] ) + float Y2Z = y2z_sum / size; //sum( Y[n]^2 * Z[n] ) + float Z2X = z2x_sum / size; //sum( Z[n]^2 * X[n] ) + float Z2Y = z2y_sum / size; //sum( Z[n]^2 * Y[n] ) + + //Reduction of multiplications + float F0 = x_sum2 + y_sum2 + z_sum2; + float F1 = 0.5f * F0; + float F2 = -8.0f * (x_sum3 + Y2X + Z2X); + float F3 = -8.0f * (X2Y + y_sum3 + Z2Y); + float F4 = -8.0f * (X2Z + Y2Z + z_sum3); + + //Set initial conditions: + float A = x_sum; + float B = y_sum; + float C = z_sum; + + //First iteration computation: + float A2 = A * A; + float B2 = B * B; + float C2 = C * C; + float QS = A2 + B2 + C2; + float QB = -2.0f * (A * x_sum + B * y_sum + C * z_sum); + + //Set initial conditions: + float Rsq = F0 + QB + QS; + + //First iteration computation: + float Q0 = 0.5f * (QS - Rsq); + float Q1 = F1 + Q0; + float Q2 = 8.0f * (QS - Rsq + QB + F0); + float aA, aB, aC, nA, nB, nC, dA, dB, dC; + + //Iterate N times, ignore stop condition. + unsigned int n = 0; + +#undef FLT_EPSILON +#define FLT_EPSILON 1.1920929e-07F /* 1E-5 */ + + while (n < max_iterations) { + n++; + + //Compute denominator: + aA = Q2 + 16.0f * (A2 - 2.0f * A * x_sum + x_sum2); + aB = Q2 + 16.0f * (B2 - 2.0f * B * y_sum + y_sum2); + aC = Q2 + 16.0f * (C2 - 2.0f * C * z_sum + z_sum2); + aA = (fabsf(aA) < FLT_EPSILON) ? 1.0f : aA; + aB = (fabsf(aB) < FLT_EPSILON) ? 1.0f : aB; + aC = (fabsf(aC) < FLT_EPSILON) ? 1.0f : aC; + + //Compute next iteration + nA = A - ((F2 + 16.0f * (B * XY + C * XZ + x_sum * (-A2 - Q0) + A * (x_sum2 + Q1 - C * z_sum - B * y_sum))) / aA); + nB = B - ((F3 + 16.0f * (A * XY + C * YZ + y_sum * (-B2 - Q0) + B * (y_sum2 + Q1 - A * x_sum - C * z_sum))) / aB); + nC = C - ((F4 + 16.0f * (A * XZ + B * YZ + z_sum * (-C2 - Q0) + C * (z_sum2 + Q1 - A * x_sum - B * y_sum))) / aC); + + //Check for stop condition + dA = (nA - A); + dB = (nB - B); + dC = (nC - C); + + if ((dA * dA + dB * dB + dC * dC) <= delta) { break; } + + //Compute next iteration's values + A = nA; + B = nB; + C = nC; + A2 = A * A; + B2 = B * B; + C2 = C * C; + QS = A2 + B2 + C2; + QB = -2.0f * (A * x_sum + B * y_sum + C * z_sum); + Rsq = F0 + QB + QS; + Q0 = 0.5f * (QS - Rsq); + Q1 = F1 + Q0; + Q2 = 8.0f * (QS - Rsq + QB + F0); + } + + *sphere_x = A; + *sphere_y = B; + *sphere_z = C; + *sphere_radius = sqrtf(Rsq); + + return 0; +} + +APMCompassCal::APMCompassCal(void) + : _vehicle(nullptr) + , _calWorkerThread(nullptr) +{ + +} + +APMCompassCal::~APMCompassCal() +{ + if (_calWorkerThread) { + _calWorkerThread->terminate(); + // deleteLater so it happens on correct thread + _calWorkerThread->deleteLater(); + } +} + +void APMCompassCal::setVehicle(Vehicle* vehicle) +{ + if (!vehicle) { + qWarning() << "vehicle == NULL"; + } + + _vehicle = vehicle; +} + +void APMCompassCal::startCalibration(void) +{ + _setSensorTransmissionSpeed(true /* fast */); + connect (_vehicle, &Vehicle::mavlinkRawImu, this, &APMCompassCal::_handleMavlinkRawImu); + connect (_vehicle, &Vehicle::mavlinkScaledImu2, this, &APMCompassCal::_handleMavlinkScaledImu2); + connect (_vehicle, &Vehicle::mavlinkScaledImu3, this, &APMCompassCal::_handleMavlinkScaledImu3); + + // Simulate a start message + _emitVehicleTextMessage(QStringLiteral("[cal] calibration started: mag")); + + _calWorkerThread = new CalWorkerThread(_vehicle); + connect(_calWorkerThread, &CalWorkerThread::vehicleTextMessage, this, &APMCompassCal::vehicleTextMessage); + + // Clear the offset parameters so we get raw data + for (int i=0; i<3; i++) { + _calWorkerThread->rgCompassAvailable[i] = true; + + const char* deviceIdParam = CalWorkerThread::rgCompassParams[i][3]; + if (_vehicle->parameterManager()->parameterExists(-1, deviceIdParam)) { + _calWorkerThread->rgCompassAvailable[i] = _vehicle->parameterManager()->getParameter(-1, deviceIdParam)->rawValue().toInt() > 0; + for (int j=0; j<3; j++) { + const char* offsetParam = CalWorkerThread::rgCompassParams[i][j]; + Fact* paramFact = _vehicle->parameterManager()->getParameter(-1, offsetParam); + + _rgSavedCompassOffsets[i][j] = paramFact->rawValue().toFloat(); + paramFact->setRawValue(0.0); + } + } else { + _calWorkerThread->rgCompassAvailable[i] = false; + } + qCDebug(APMCompassCalLog) << QStringLiteral("Compass %1 available: %2").arg(i).arg(_calWorkerThread->rgCompassAvailable[i]); + } + + _calWorkerThread->start(); +} + +void APMCompassCal::cancelCalibration(void) +{ + _stopCalibration(); + + // Put the original offsets back + for (int i=0; i<3; i++) { + for (int j=0; j<3; j++) { + const char* offsetParam = CalWorkerThread::rgCompassParams[i][j]; + if (_vehicle->parameterManager()->parameterExists(-1, offsetParam)) { + _vehicle->parameterManager()->getParameter(-1, offsetParam)-> setRawValue(_rgSavedCompassOffsets[i][j]); + } + } + } + + // Simulate a cancelled message + _emitVehicleTextMessage(QStringLiteral("[cal] calibration cancelled")); +} + +void APMCompassCal::_handleMavlinkRawImu(mavlink_message_t message) +{ + _calWorkerThread->lastScaledImuMutex.lock(); + mavlink_msg_raw_imu_decode(&message, &_calWorkerThread->lastRawImu); + _calWorkerThread->rgLastScaledImu[0].xacc = _calWorkerThread->lastRawImu.xacc; + _calWorkerThread->rgLastScaledImu[0].yacc = _calWorkerThread->lastRawImu.yacc; + _calWorkerThread->rgLastScaledImu[0].zacc = _calWorkerThread->lastRawImu.zacc; + _calWorkerThread->rgLastScaledImu[0].xgyro = _calWorkerThread->lastRawImu.xgyro; + _calWorkerThread->rgLastScaledImu[0].ygyro = _calWorkerThread->lastRawImu.ygyro; + _calWorkerThread->rgLastScaledImu[0].zgyro = _calWorkerThread->lastRawImu.zgyro; + _calWorkerThread->rgLastScaledImu[0].xmag = _calWorkerThread->lastRawImu.xmag; + _calWorkerThread->rgLastScaledImu[0].ymag = _calWorkerThread->lastRawImu.ymag; + _calWorkerThread->rgLastScaledImu[0].zmag = _calWorkerThread->lastRawImu.zmag; + _calWorkerThread->lastScaledImuMutex.unlock(); +} + +void APMCompassCal::_handleMavlinkScaledImu2(mavlink_message_t message) +{ + _calWorkerThread->lastScaledImuMutex.lock(); + mavlink_msg_scaled_imu2_decode(&message, (mavlink_scaled_imu2_t*)&_calWorkerThread->rgLastScaledImu[1]); + _calWorkerThread->lastScaledImuMutex.unlock(); +} + +void APMCompassCal::_handleMavlinkScaledImu3(mavlink_message_t message) +{ + _calWorkerThread->lastScaledImuMutex.lock(); + mavlink_msg_scaled_imu3_decode(&message, (mavlink_scaled_imu3_t*)&_calWorkerThread->rgLastScaledImu[2]); + _calWorkerThread->lastScaledImuMutex.unlock(); +} + +void APMCompassCal::_setSensorTransmissionSpeed(bool fast) +{ + _vehicle->requestDataStream(MAV_DATA_STREAM_RAW_SENSORS, fast ? 10 : 2); +} + +void APMCompassCal::_stopCalibration(void) +{ + _calWorkerThread->cancel(); + disconnect (_vehicle, &Vehicle::mavlinkRawImu, this, &APMCompassCal::_handleMavlinkRawImu); + disconnect (_vehicle, &Vehicle::mavlinkScaledImu2, this, &APMCompassCal::_handleMavlinkScaledImu2); + disconnect (_vehicle, &Vehicle::mavlinkScaledImu3, this, &APMCompassCal::_handleMavlinkScaledImu3); + _setSensorTransmissionSpeed(false /* fast */); +} + +void APMCompassCal::_emitVehicleTextMessage(const QString& message) +{ + qCDebug(APMCompassCalLog()) << message; + emit vehicleTextMessage(_vehicle->id(), 0, MAV_SEVERITY_INFO, message); +} diff --git a/src/AutoPilotPlugins/APM/APMCompassCal.h b/src/AutoPilotPlugins/APM/APMCompassCal.h new file mode 100644 index 0000000..890719f --- /dev/null +++ b/src/AutoPilotPlugins/APM/APMCompassCal.h @@ -0,0 +1,168 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + + +#ifndef APMCompassCal_H +#define APMCompassCal_H + +#include +#include +#include + +#include "QGCLoggingCategory.h" +#include "QGCMAVLink.h" +#include "Vehicle.h" + +Q_DECLARE_LOGGING_CATEGORY(APMCompassCalLog) + +class CalWorkerThread : public QThread +{ + Q_OBJECT + +public: + CalWorkerThread(Vehicle* vehicle, QObject* parent = nullptr); + + // Cancel currently in progress calibration + void cancel(void) { _cancel = true; } + + // Overrides from QThread + void run(void) Q_DECL_FINAL; + + static const unsigned max_mags = 3; + + bool rgCompassAvailable[max_mags]; + QMutex lastScaledImuMutex; + mavlink_raw_imu_t lastRawImu; + mavlink_scaled_imu_t rgLastScaledImu[max_mags]; + + static const char* rgCompassParams[3][4]; + +signals: + void vehicleTextMessage(int vehicleId, int compId, int severity, QString text); + +private: + void _emitVehicleTextMessage(const QString& message); + + // The routines below are based on the PX4 flight stack compass cal routines. Hence + // the PX4 Flight Stack coding style to maintain some level of code movement. + + static const float mag_sphere_radius; + static const unsigned int calibration_sides; ///< The total number of sides + static const unsigned int calibration_total_points; ///< The total points per magnetometer + static const unsigned int calibraton_duration_seconds; ///< The total duration the routine is allowed to take + + // The order of these cannot change since the calibration calculations depend on them in this order + enum detect_orientation_return { + DETECT_ORIENTATION_TAIL_DOWN, + DETECT_ORIENTATION_NOSE_DOWN, + DETECT_ORIENTATION_LEFT, + DETECT_ORIENTATION_RIGHT, + DETECT_ORIENTATION_UPSIDE_DOWN, + DETECT_ORIENTATION_RIGHTSIDE_UP, + DETECT_ORIENTATION_ERROR + }; + static const unsigned detect_orientation_side_count = 6; + + // Data passed to calibration worker routine + typedef struct { + unsigned done_count; + unsigned int calibration_points_perside; + unsigned int calibration_interval_perside_seconds; + uint64_t calibration_interval_perside_useconds; + unsigned int calibration_counter_total[max_mags]; + bool side_data_collected[detect_orientation_side_count]; + float* x[max_mags]; + float* y[max_mags]; + float* z[max_mags]; + } mag_worker_data_t; + + enum calibrate_return { + calibrate_return_ok, + calibrate_return_error, + calibrate_return_cancelled + }; + + /** + * Least-squares fit of a sphere to a set of points. + * + * Fits a sphere to a set of points on the sphere surface. + * + * @param x point coordinates on the X axis + * @param y point coordinates on the Y axis + * @param z point coordinates on the Z axis + * @param size number of points + * @param max_iterations abort if maximum number of iterations have been reached. If unsure, set to 100. + * @param delta abort if error is below delta. If unsure, set to 0 to run max_iterations times. + * @param sphere_x coordinate of the sphere center on the X axis + * @param sphere_y coordinate of the sphere center on the Y axis + * @param sphere_z coordinate of the sphere center on the Z axis + * @param sphere_radius sphere radius + * + * @return 0 on success, 1 on failure + */ + int sphere_fit_least_squares(const float x[], const float y[], const float z[], + unsigned int size, unsigned int max_iterations, float delta, float *sphere_x, float *sphere_y, float *sphere_z, + float *sphere_radius); + + /// Wait for vehicle to become still and detect it's orientation + /// @return Returns detect_orientation_return according to orientation of still vehicle + enum detect_orientation_return detect_orientation(void); + + /// Returns the human readable string representation of the orientation + /// @param orientation Orientation to return string for, "error" if buffer is too small + const char* detect_orientation_str(enum detect_orientation_return orientation); + + /// Perform calibration sequence which require a rest orientation detection prior to calibration. + /// @return OK: Calibration succeeded, ERROR: Calibration failed + calibrate_return calibrate_from_orientation( + bool side_data_collected[detect_orientation_side_count], ///< Sides for which data still needs calibration + void* worker_data); ///< Opaque data passed to worker routine + + calibrate_return calibrate(void); + calibrate_return mag_calibration_worker(detect_orientation_return orientation, void* data); + unsigned progress_percentage(mag_worker_data_t* worker_data); + + Vehicle* _vehicle; + bool _cancel; +}; + +// Used to calibrate APM Stack compass by simulating PX4 Flight Stack firmware compass cal +// on the ground station side of things. +class APMCompassCal : public QObject +{ + Q_OBJECT + +public: + APMCompassCal(void); + ~APMCompassCal(); + + void setVehicle(Vehicle* vehicle); + void startCalibration(void); + void cancelCalibration(void); + +signals: + void vehicleTextMessage(int vehicleId, int compId, int severity, QString text); + +private slots: + void _handleMavlinkRawImu(mavlink_message_t message); + void _handleMavlinkScaledImu2(mavlink_message_t message); + void _handleMavlinkScaledImu3(mavlink_message_t message); + +private: + void _setSensorTransmissionSpeed(bool fast); + void _stopCalibration(void); + void _emitVehicleTextMessage(const QString& message); + + Vehicle* _vehicle; + CalWorkerThread* _calWorkerThread; + float _rgSavedCompassOffsets[3][3]; +}; + +#endif + diff --git a/src/AutoPilotPlugins/APM/APMHeliComponent.qml b/src/AutoPilotPlugins/APM/APMHeliComponent.qml index 510034b..9b68204 100644 --- a/src/AutoPilotPlugins/APM/APMHeliComponent.qml +++ b/src/AutoPilotPlugins/APM/APMHeliComponent.qml @@ -42,19 +42,15 @@ SetupPage { property Fact _hSwColDir: controller.getParameterFact(-1, "H_SW_COL_DIR") property Fact _hSwLinSvo: controller.getParameterFact(-1, "H_SW_LIN_SVO") property Fact _hFlybarMode: controller.getParameterFact(-1, "H_FLYBAR_MODE") - property Fact _hCycMax: controller.getParameterFact(-1, "H_CYC_MAX") property Fact _hColMax: controller.getParameterFact(-1, "H_COL_MAX") - property Fact _hColAngMax: controller.getParameterFact(-1, "H_COL_ANG_MAX") + property Fact _hColMid: controller.getParameterFact(-1, "H_COL_MID") property Fact _hColMin: controller.getParameterFact(-1, "H_COL_MIN") - property Fact _hColAngMin: controller.getParameterFact(-1, "H_COL_ANG_MIN") - property Fact _hColZeroThrst: controller.getParameterFact(-1, "H_COL_ZERO_THRST") - property Fact _hColLandMin: controller.getParameterFact(-1, "H_COL_LAND_MIN") + property Fact _hCycMax: controller.getParameterFact(-1, "H_CYC_MAX") property Fact _hRscMode: controller.getParameterFact(-1, "H_RSC_MODE") property Fact _hRscCritical: controller.getParameterFact(-1, "H_RSC_CRITICAL") property Fact _hRscRampTime: controller.getParameterFact(-1, "H_RSC_RAMP_TIME") property Fact _hRscRunupTime: controller.getParameterFact(-1, "H_RSC_RUNUP_TIME") - property Fact _hRscCldwnTime: controller.getParameterFact(-1, "H_RSC_CLDWN_TIME") property Fact _hRscSetpoint: controller.getParameterFact(-1, "H_RSC_SETPOINT") property Fact _hRscIdle: controller.getParameterFact(-1, "H_RSC_IDLE") property Fact _hRscThrcrv0: controller.getParameterFact(-1, "H_RSC_THRCRV_0") @@ -63,12 +59,11 @@ SetupPage { property Fact _hRscThrcrv75: controller.getParameterFact(-1, "H_RSC_THRCRV_75") property Fact _hRscThrcrv100: controller.getParameterFact(-1, "H_RSC_THRCRV_100") - property Fact _hRscGovComp: controller.getParameterFact(-1, "H_RSC_GOV_COMP") + property Fact _hRscGovSetpnt: controller.getParameterFact(-1, "H_RSC_GOV_SETPNT") + property Fact _hRscGovDisgag: controller.getParameterFact(-1, "H_RSC_GOV_DISGAG") property Fact _hRscGovDroop: controller.getParameterFact(-1, "H_RSC_GOV_DROOP") - property Fact _hRscGovFf: controller.getParameterFact(-1, "H_RSC_GOV_FF") + property Fact _hRscGovTcgain: controller.getParameterFact(-1, "H_RSC_GOV_TCGAIN") property Fact _hRscGovRange: controller.getParameterFact(-1, "H_RSC_GOV_RANGE") - property Fact _hRscGovRpm: controller.getParameterFact(-1, "H_RSC_GOV_RPM") - property Fact _hRscGovTorque: controller.getParameterFact(-1, "H_RSC_GOV_TORQUE") property Fact _imStbCol1: controller.getParameterFact(-1, "IM_STB_COL_1") property Fact _imStbCol2: controller.getParameterFact(-1, "IM_STB_COL_2") @@ -315,26 +310,17 @@ SetupPage { indexModel: false } - QGCLabel { text: _hCycMax.shortDescription } - FactTextField { fact: _hCycMax } - QGCLabel { text: _hColMax.shortDescription } FactTextField { fact: _hColMax } - QGCLabel { text: _hColAngMax.shortDescription } - FactTextField { fact: _hColAngMax } + QGCLabel { text: _hColMid.shortDescription } + FactTextField { fact: _hColMid } QGCLabel { text: _hColMin.shortDescription } FactTextField { fact: _hColMin } - QGCLabel { text: _hColAngMin.shortDescription } - FactTextField { fact: _hColAngMin } - - QGCLabel { text: _hColZeroThrst.shortDescription } - FactTextField { fact: _hColZeroThrst } - - QGCLabel { text: _hColLandMin.shortDescription } - FactTextField { fact: _hColLandMin } + QGCLabel { text: _hCycMax.shortDescription } + FactTextField { fact: _hCycMax } } } @@ -359,9 +345,6 @@ SetupPage { QGCLabel { text: _hRscRunupTime.shortDescription } FactTextField { fact: _hRscRunupTime } - QGCLabel { text: _hRscCldwnTime.shortDescription } - FactTextField { fact: _hRscCldwnTime } - QGCLabel { text: _hRscSetpoint.shortDescription } FactTextField { fact: _hRscSetpoint } @@ -391,23 +374,20 @@ SetupPage { GridLayout { columns: 2 - QGCLabel { text: _hRscGovComp.shortDescription } - FactTextField { fact: _hRscGovComp } + QGCLabel { text: _hRscGovSetpnt.shortDescription } + FactTextField { fact: _hRscGovSetpnt } + + QGCLabel { text: _hRscGovDisgag.shortDescription } + FactTextField { fact: _hRscGovDisgag } QGCLabel { text: _hRscGovDroop.shortDescription } FactTextField { fact: _hRscGovDroop } - QGCLabel { text: _hRscGovFf.shortDescription } - FactTextField { fact: _hRscGovFf } + QGCLabel { text: _hRscGovTcgain.shortDescription } + FactTextField { fact: _hRscGovTcgain } QGCLabel { text: _hRscGovRange.shortDescription } FactTextField { fact: _hRscGovRange } - - QGCLabel { text: _hRscGovRpm.shortDescription } - FactTextField { fact: _hRscGovRpm } - - QGCLabel { text: _hRscGovTorque.shortDescription } - FactTextField { fact: _hRscGovTorque } } } diff --git a/src/AutoPilotPlugins/APM/APMLightsComponent.qml b/src/AutoPilotPlugins/APM/APMLightsComponent.qml index 99590f6..ad2f278 100644 --- a/src/AutoPilotPlugins/APM/APMLightsComponent.qml +++ b/src/AutoPilotPlugins/APM/APMLightsComponent.qml @@ -43,8 +43,6 @@ SetupPage { property Fact _rc12Function: controller.getParameterFact(-1, "SERVO12_FUNCTION") property Fact _rc13Function: controller.getParameterFact(-1, "SERVO13_FUNCTION") property Fact _rc14Function: controller.getParameterFact(-1, "SERVO14_FUNCTION") - property Fact _rc15Function: controller.getParameterFact(-1, "SERVO15_FUNCTION") - property Fact _rc16Function: controller.getParameterFact(-1, "SERVO16_FUNCTION") property Fact _stepSize: _oldFW ? controller.getParameterFact(-1, "JS_LIGHTS_STEP") : null // v3.5.1 and prior property Fact _numSteps: _oldFW ? null : controller.getParameterFact(-1, "JS_LIGHTS_STEPS") // v3.5.2 and up @@ -53,7 +51,7 @@ SetupPage { readonly property int _rcFunctionRCIN9: 59 readonly property int _rcFunctionRCIN10: 60 readonly property int _firstLightsOutChannel: 5 - readonly property int _lastLightsOutChannel: 16 + readonly property int _lastLightsOutChannel: 14 Component.onCompleted: { calcLightOutValues() diff --git a/src/AutoPilotPlugins/APM/APMPowerComponent.qml b/src/AutoPilotPlugins/APM/APMPowerComponent.qml index 8baf435..792510f 100644 --- a/src/AutoPilotPlugins/APM/APMPowerComponent.qml +++ b/src/AutoPilotPlugins/APM/APMPowerComponent.qml @@ -131,9 +131,9 @@ SetupPage { property Fact battMonitor: controller.getParameterFact(-1, "BATT_MONITOR", false /* reportMissing */) property Fact battVoltMult: controller.getParameterFact(-1, "BATT_VOLT_MULT", false /* reportMissing */) property Fact battVoltPin: controller.getParameterFact(-1, "BATT_VOLT_PIN", false /* reportMissing */) - property FactGroup _batteryFactGroup: _batt1FullSettings.visible ? controller.vehicle.getFactGroup("battery0") : null - property Fact vehicleVoltage: _batteryFactGroup ? _batteryFactGroup.voltage : null - property Fact vehicleCurrent: _batteryFactGroup ? _batteryFactGroup.current : null + property FactGroup _batteryFactGroup: controller.vehicle.getFactGroup("battery0") + property Fact vehicleVoltage: _batteryFactGroup.voltage + property Fact vehicleCurrent: _batteryFactGroup.current } } } @@ -218,9 +218,9 @@ SetupPage { property Fact battMonitor: controller.getParameterFact(-1, "BATT2_MONITOR", false /* reportMissing */) property Fact battVoltMult: controller.getParameterFact(-1, "BATT2_VOLT_MULT", false /* reportMissing */) property Fact battVoltPin: controller.getParameterFact(-1, "BATT2_VOLT_PIN", false /* reportMissing */) - property FactGroup _batteryFactGroup: batt2FullSettings.visible ? controller.vehicle.getFactGroup("battery1") : null - property Fact vehicleVoltage: _batteryFactGroup ? _batteryFactGroup.voltage : null - property Fact vehicleCurrent: _batteryFactGroup ? _batteryFactGroup.current : null + property FactGroup _batteryFactGroup: controller.vehicle.getFactGroup("battery1") + property Fact vehicleVoltage: _batteryFactGroup.voltage + property Fact vehicleCurrent: _batteryFactGroup.current } } } @@ -296,8 +296,8 @@ SetupPage { function calcSensor() { for (var i=0; i 0) { - battVoltMultFact.value = newVoltageMultiplier + QGCTextField { id: measuredVoltage } + + QGCLabel { text: qsTr("Vehicle voltage:") } + FactLabel { fact: _calcVoltageDlgVehicleVoltage } + + QGCLabel { text: qsTr("Voltage multiplier:") } + FactLabel { fact: _calcVoltageDlgBattVoltMultParam } + } + + QGCButton { + text: qsTr("Calculate And Set") + + onClicked: { + var measuredVoltageValue = parseFloat(measuredVoltage.text) + if (measuredVoltageValue == 0 || isNaN(measuredVoltageValue)) { + return + } + var newVoltageMultiplier = (measuredVoltageValue * _calcVoltageDlgBattVoltMultParam.value) / _calcVoltageDlgVehicleVoltage.value + if (newVoltageMultiplier > 0) { + _calcVoltageDlgBattVoltMultParam.value = newVoltageMultiplier + } } } - } - } - } - } + } // Column + } // QGCFlickable + } // QGCViewDialog + } // Component - calcVoltageMultiplierDlgComponent + + // Must be set prior to use of calcAmpsPerVoltDlgComponent + property Fact _calcAmpsPerVoltDlgVehicleCurrent + property Fact _calcAmpsPerVoltDlgBattAmpPerVoltParam Component { id: calcAmpsPerVoltDlgComponent - QGCPopupDialog { - title: qsTr("Calculate Amps per Volt") - buttons: StandardButton.Close + QGCViewDialog { + id: calcAmpsPerVoltDlg - property Fact vehicleCurrentFact - property Fact battAmpPerVoltFact + QGCFlickable { + anchors.fill: parent + contentHeight: column.height + contentWidth: column.width - ColumnLayout { - spacing: ScreenTools.defaultFontPixelHeight - - QGCLabel { - Layout.preferredWidth: gridLayout.width - wrapMode: Text.WordWrap - text: qsTr("Measure current draw using an external current meter and enter the value below. Click Calculate to set the new amps per volt value.") - } - - GridLayout { - id: gridLayout - columns: 2 + Column { + id: column + width: calcAmpsPerVoltDlg.width + spacing: ScreenTools.defaultFontPixelHeight QGCLabel { - text: qsTr("Measured current:") + width: parent.width + wrapMode: Text.WordWrap + text: qsTr("Measure current draw using an external current meter and enter the value below. Click Calculate to set the new amps per volt value.") } - QGCTextField { id: measuredCurrent } - QGCLabel { text: qsTr("Vehicle current:") } - FactLabel { fact: vehicleCurrentFact } + Grid { + columns: 2 + spacing: ScreenTools.defaultFontPixelHeight / 2 + verticalItemAlignment: Grid.AlignVCenter - QGCLabel { text: qsTr("Amps per volt:") } - FactLabel { fact: battAmpPerVoltFact } - } - - QGCButton { - text: qsTr("Calculate And Set") - - onClicked: { - var measuredCurrentValue = parseFloat(measuredCurrent.text) - if (measuredCurrentValue === 0 || isNaN(measuredCurrentValue) || !vehicleCurrentFact || !battAmpPerVoltFact) { - return + QGCLabel { + text: qsTr("Measured current:") } - var newAmpsPerVolt = (vehicleCurrentFact.value !== 0) ? (measuredCurrentValue * battAmpPerVoltFact.value) / vehicleCurrentFact.value : 0 - if (newAmpsPerVolt !== 0) { - battAmpPerVoltFact.value = newAmpsPerVolt + QGCTextField { id: measuredCurrent } + + QGCLabel { text: qsTr("Vehicle current:") } + FactLabel { fact: _calcAmpsPerVoltDlgVehicleCurrent } + + QGCLabel { text: qsTr("Amps per volt:") } + FactLabel { fact: _calcAmpsPerVoltDlgBattAmpPerVoltParam } + } + + QGCButton { + text: qsTr("Calculate And Set") + + onClicked: { + var measuredCurrentValue = parseFloat(measuredCurrent.text) + if (measuredCurrentValue == 0) { + return + } + var newAmpsPerVolt = (measuredCurrentValue * _calcAmpsPerVoltDlgBattAmpPerVoltParam.value) / _calcAmpsPerVoltDlgVehicleCurrent.value + if (newAmpsPerVolt != 0) { + _calcAmpsPerVoltDlgBattAmpPerVoltParam.value = newAmpsPerVolt + } } } - } - } - } - } + } // Column + } // QGCFlickable + } // QGCViewDialog + } // Component - calcAmpsPerVoltDlgComponent } // SetupPage diff --git a/src/AutoPilotPlugins/APM/APMRemoteSupportComponent.cc b/src/AutoPilotPlugins/APM/APMRemoteSupportComponent.cc deleted file mode 100644 index ab68e60..0000000 --- a/src/AutoPilotPlugins/APM/APMRemoteSupportComponent.cc +++ /dev/null @@ -1,58 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2023 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - - -#include "APMRemoteSupportComponent.h" - -APMRemoteSupportComponent::APMRemoteSupportComponent(Vehicle* vehicle, AutoPilotPlugin* autopilot, QObject* parent) - : VehicleComponent(vehicle, autopilot, parent) - , _name(tr("Remote Support")) -{ -} - -QString APMRemoteSupportComponent::name(void) const -{ - return _name; -} - -QString APMRemoteSupportComponent::description(void) const -{ - return tr("On this menu you can forward mavlink telemetry to an ardupilot support engineer."); -} - -QString APMRemoteSupportComponent::iconResource(void) const -{ - return QStringLiteral("/qmlimages/ForwardingSupportIcon.svg"); -} - -bool APMRemoteSupportComponent::requiresSetup(void) const -{ - return false; -} - -bool APMRemoteSupportComponent::setupComplete(void) const -{ - return true; -} - -QStringList APMRemoteSupportComponent::setupCompleteChangedTriggerList(void) const -{ - return QStringList(); -} - -QUrl APMRemoteSupportComponent::setupSource(void) const -{ - return QUrl::fromUserInput(QStringLiteral("qrc:/qml/APMRemoteSupportComponent.qml")); - -} - -QUrl APMRemoteSupportComponent::summaryQmlSource(void) const -{ - return QUrl(); -} diff --git a/src/AutoPilotPlugins/APM/APMRemoteSupportComponent.h b/src/AutoPilotPlugins/APM/APMRemoteSupportComponent.h deleted file mode 100644 index 01890f3..0000000 --- a/src/AutoPilotPlugins/APM/APMRemoteSupportComponent.h +++ /dev/null @@ -1,35 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2023 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -#pragma once - -#include "VehicleComponent.h" - -class APMRemoteSupportComponent : public VehicleComponent -{ - Q_OBJECT - -public: - APMRemoteSupportComponent(Vehicle* vehicle, AutoPilotPlugin* autopilot, QObject* parent = nullptr); - - // Virtuals from VehicleComponent - QStringList setupCompleteChangedTriggerList(void) const final; - - // Virtuals from VehicleComponent - QString name(void) const final; - QString description(void) const final; - QString iconResource(void) const final; - bool requiresSetup(void) const final; - bool setupComplete(void) const final; - QUrl setupSource(void) const final; - QUrl summaryQmlSource(void) const final; - -private: - const QString _name; -}; \ No newline at end of file diff --git a/src/AutoPilotPlugins/APM/APMRemoteSupportComponent.qml b/src/AutoPilotPlugins/APM/APMRemoteSupportComponent.qml deleted file mode 100644 index 15237b5..0000000 --- a/src/AutoPilotPlugins/APM/APMRemoteSupportComponent.qml +++ /dev/null @@ -1,68 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2023 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -import QtQuick 2.3 -import QtQuick.Controls 1.2 -import QtQuick.Layouts 1.2 - -import QGroundControl 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.ScreenTools 1.0 -import QGroundControl.Palette 1.0 -import QGroundControl.FactControls 1.0 -import QGroundControl.FactSystem 1.0 - -SetupPage { - pageComponent: pageComponent - - Component { - id: pageComponent - - Rectangle { - id: backgroundRectangle - width: availableWidth - height: elementsRow.height * 1.5 - color: qgcPal.windowShade - - GridLayout { - id: elementsRow - columns: 2 - - anchors.left: parent.left - anchors.verticalCenter: parent.verticalCenter - anchors.margins: ScreenTools.defaultFontPixelWidth - - columnSpacing: ScreenTools.defaultFontPixelWidth - rowSpacing: ScreenTools.defaultFontPixelWidth - - QGCLabel { - visible: QGroundControl.settingsManager.appSettings.forwardMavlinkAPMSupportHostName.visible - text: qsTr("Host name:") - } - FactTextField { - id: mavlinkForwardingHostNameField - fact: QGroundControl.settingsManager.appSettings.forwardMavlinkAPMSupportHostName - Layout.preferredWidth: ScreenTools.defaultFontPixelWidth * 40 - } - QGCButton { - text: qsTr("Connect") - enabled: !QGroundControl.linkManager.mavlinkSupportForwardingEnabled - - onPressed: { - QGroundControl.linkManager.createMavlinkForwardingSupportLink() - } - } - QGCLabel { - visible: QGroundControl.linkManager.mavlinkSupportForwardingEnabled - text: qsTr("Forwarding traffic: Mavlink traffic will keep being forwarded until application restarts") - } - } - } - } -} diff --git a/src/AutoPilotPlugins/APM/APMSafetyComponent.qml b/src/AutoPilotPlugins/APM/APMSafetyComponent.qml index 8c75d70..d46f26f 100644 --- a/src/AutoPilotPlugins/APM/APMSafetyComponent.qml +++ b/src/AutoPilotPlugins/APM/APMSafetyComponent.qml @@ -409,117 +409,122 @@ SetupPage { property Fact _fenceRadius: controller.getParameterFact(-1, "FENCE_RADIUS") property Fact _fenceType: controller.getParameterFact(-1, "FENCE_TYPE") - readonly property int _maxAltitudeFenceBitMask: 1 - readonly property int _circleFenceBitMask: 2 - readonly property int _polygonFenceBitMask: 4 - QGCLabel { + id: geoFenceLabel text: qsTr("GeoFence") font.family: ScreenTools.demiboldFontFamily } Rectangle { - width: mainLayout.width + (_margins * 2) - height: mainLayout.height + (_margins * 2) + id: geoFenceSettings + width: fenceAltMaxField.x + fenceAltMaxField.width + _margins + height: fenceAltMaxField.y + fenceAltMaxField.height + _margins color: ggcPal.windowShade - ColumnLayout { - id: mainLayout - x: _margins - y: _margins - spacing: ScreenTools.defaultFontPixellHeight / 2 + QGCCheckBox { + id: circleGeo + anchors.margins: _margins + anchors.left: parent.left + anchors.top: parent.top + text: qsTr("Circle GeoFence enabled") + checked: _fenceEnable.value != 0 && _fenceType.value & 2 - FactCheckBox { - id: enabledCheckBox - text: qsTr("Enabled") - fact: _fenceEnable - } - - GridLayout { - columns: 2 - enabled: enabledCheckBox.checked - - QGCCheckBox { - text: qsTr("Maximum Altitude") - checked: _fenceType.rawValue & _maxAltitudeFenceBitMask - - onClicked: { - if (checked) { - _fenceType.rawValue |= _maxAltitudeFenceBitMask - } else { - _fenceType.value &= ~_maxAltitudeFenceBitMask - } + onClicked: { + if (checked) { + if (_fenceEnable.value == 1) { + _fenceType.value |= 2 + } else { + _fenceEnable.value = 1 + _fenceType.value = 2 } - } - - FactTextField { - fact: _fenceAltMax - } - - QGCCheckBox { - text: qsTr("Circle centered on Home") - checked: _fenceType.rawValue & _circleFenceBitMask - - onClicked: { - if (checked) { - _fenceType.rawValue |= _circleFenceBitMask - } else { - _fenceType.value &= ~_circleFenceBitMask - } - } - } - - FactTextField { - fact: _fenceRadius - showUnits: true - } - - QGCCheckBox { - text: qsTr("Inclusion/Exclusion Circles+Polygons") - checked: _fenceType.rawValue & _polygonFenceBitMask - - onClicked: { - if (checked) { - _fenceType.rawValue |= _polygonFenceBitMask - } else { - _fenceType.value &= ~_polygonFenceBitMask - } - } - } - - Item { - height: 1 - width: 1 - } - } // GridLayout - - Item { - height: 1 - width: 1 - } - - GridLayout { - columns: 2 - enabled: enabledCheckBox.checked - - QGCLabel { - text: qsTr("Breach action") - } - - FactComboBox { - sizeToContents: true - fact: _fenceAction - } - - QGCLabel { - text: qsTr("Fence margin") - } - - FactTextField { - fact: _fenceMargin + } else if (altitudeGeo.checked) { + _fenceType.value &= ~2 + } else { + _fenceEnable.value = 0 + _fenceType.value = 0 } } } + + QGCCheckBox { + id: altitudeGeo + anchors.topMargin: _margins / 2 + anchors.left: circleGeo.left + anchors.top: circleGeo.bottom + text: qsTr("Altitude GeoFence enabled") + checked: _fenceEnable.value != 0 && _fenceType.value & 1 + + onClicked: { + if (checked) { + if (_fenceEnable.value == 1) { + _fenceType.value |= 1 + } else { + _fenceEnable.value = 1 + _fenceType.value = 1 + } + } else if (circleGeo.checked) { + _fenceType.value &= ~1 + } else { + _fenceEnable.value = 0 + _fenceType.value = 0 + } + } + } + + QGCRadioButton { + id: geoReportRadio + anchors.margins: _margins + anchors.left: parent.left + anchors.top: altitudeGeo.bottom + text: qsTr("Report only") + checked: _fenceAction.value == 0 + + onClicked: _fenceAction.value = 0 + } + + QGCRadioButton { + id: geoRTLRadio + anchors.topMargin: _margins / 2 + anchors.left: circleGeo.left + anchors.top: geoReportRadio.bottom + text: qsTr("RTL or Land") + checked: _fenceAction.value == 1 + + onClicked: _fenceAction.value = 1 + } + + QGCLabel { + id: fenceRadiusLabel + anchors.left: circleGeo.left + anchors.baseline: fenceRadiusField.baseline + text: qsTr("Max radius:") + } + + FactTextField { + id: fenceRadiusField + anchors.topMargin: _margins + anchors.left: fenceAltMaxField.left + anchors.top: geoRTLRadio.bottom + fact: _fenceRadius + showUnits: true + } + + QGCLabel { + id: fenceAltMaxLabel + anchors.left: circleGeo.left + anchors.baseline: fenceAltMaxField.baseline + text: qsTr("Max altitude:") + } + + FactTextField { + id: fenceAltMaxField + anchors.topMargin: _margins / 2 + anchors.leftMargin: _margins + anchors.left: fenceAltMaxLabel.right + anchors.top: fenceRadiusField.bottom + fact: _fenceAltMax + showUnits: true + } } // Rectangle - GeoFence Settings } // Column - GeoFence Settings } diff --git a/src/AutoPilotPlugins/APM/APMSensorsComponent.qml b/src/AutoPilotPlugins/APM/APMSensorsComponent.qml index b032bca..37b49cd 100644 --- a/src/AutoPilotPlugins/APM/APMSensorsComponent.qml +++ b/src/AutoPilotPlugins/APM/APMSensorsComponent.qml @@ -89,7 +89,7 @@ SetupPage { function showOrientationsDialog(calType) { var dialogTitle - var dialogButtons = StandardButton.Ok + var buttons = StandardButton.Ok _showSimpleAccelCalOption = false _orientationDialogCalType = calType @@ -98,13 +98,13 @@ SetupPage { _orientationsDialogShowCompass = true _orientationDialogHelp = orientationHelpCal dialogTitle = qsTr("Calibrate Compass") - dialogButtons |= StandardButton.Cancel + buttons |= StandardButton.Cancel break case _calTypeAccel: _orientationsDialogShowCompass = false _orientationDialogHelp = orientationHelpCal dialogTitle = qsTr("Calibrate Accelerometer") - dialogButtons |= StandardButton.Cancel + buttons |= StandardButton.Cancel break case _calTypeSet: _orientationsDialogShowCompass = true @@ -113,7 +113,7 @@ SetupPage { break } - orientationsDialogComponent.createObject(mainWindow, { title: dialogTitle, buttons: dialogButtons }).open() + mainWindow.showComponentDialog(orientationsDialogComponent, dialogTitle, mainWindow.showDialogDefaultWidth, buttons) } function showSimpleAccelCalOption() { @@ -161,16 +161,21 @@ SetupPage { onWaitingForCancelChanged: { if (controller.waitingForCancel) { - waitForCancelDialogComponent.createObject(mainWindow).open() + mainWindow.showComponentDialog(waitForCancelDialogComponent, qsTr("Calibration Cancel"), mainWindow.showDialogDefaultWidth, 0) } } onCalibrationComplete: { switch (calType) { case APMSensorsComponentController.CalTypeAccel: + mainWindow.showComponentDialog(postCalibrationComponent, qsTr("Accelerometer calibration complete"), mainWindow.showDialogDefaultWidth, StandardButton.Ok) + break + case APMSensorsComponentController.CalTypeOffboardCompass: + mainWindow.showComponentDialog(postCalibrationComponent, qsTr("Compass calibration complete"), mainWindow.showDialogDefaultWidth, StandardButton.Ok) + break case APMSensorsComponentController.CalTypeOnboardCompass: _singleCompassSettingsComponentShowPriority = true - postOnboardCompassCalibrationComponent.createObject(mainWindow).open() + mainWindow.showComponentDialog(postOnboardCompassCalibrationComponent, qsTr("Calibration complete"), mainWindow.showDialogDefaultWidth, StandardButton.Ok) break } } @@ -185,17 +190,15 @@ SetupPage { Component { id: waitForCancelDialogComponent - QGCSimpleMessageDialog { - title: qsTr("Calibration Cancel") - text: qsTr("Waiting for Vehicle to response to Cancel. This may take a few seconds.") - buttons: 0 + QGCViewMessage { + message: qsTr("Waiting for Vehicle to response to Cancel. This may take a few seconds.") Connections { target: controller onWaitingForCancelChanged: { if (!controller.waitingForCancel) { - close() + hideDialog() } } } @@ -268,14 +271,12 @@ SetupPage { Component { id: postOnboardCompassCalibrationComponent - QGCPopupDialog { - id: postOnboardCompassCalibrationDialog - title: qsTr("Calibration complete") - buttons: StandardButton.Ok - + QGCViewDialog { Column { - width: 40 * ScreenTools.defaultFontPixelWidth - spacing: ScreenTools.defaultFontPixelHeight + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.left: parent.left + anchors.right: parent.right + spacing: ScreenTools.defaultFontPixelHeight Repeater { model: 3 @@ -297,7 +298,7 @@ SetupPage { text: qsTr("Reboot Vehicle") onClicked: { controller.vehicle.rebootVehicle() - postOnboardCompassCalibrationDialog.close() + hideDialog() } } } @@ -307,13 +308,12 @@ SetupPage { Component { id: postCalibrationComponent - QGCPopupDialog { - id: postCalibrationDialog - title: qsTr("Calibration complete") - + QGCViewDialog { Column { - width: 40 * ScreenTools.defaultFontPixelWidth - spacing: ScreenTools.defaultFontPixelHeight + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.left: parent.left + anchors.right: parent.right + spacing: ScreenTools.defaultFontPixelHeight QGCLabel { anchors.left: parent.left @@ -326,7 +326,7 @@ SetupPage { text: qsTr("Reboot Vehicle") onClicked: { controller.vehicle.rebootVehicle() - postCalibrationDialog.close() + hideDialog() } } } @@ -412,7 +412,9 @@ SetupPage { Component { id: orientationsDialogComponent - QGCPopupDialog { + QGCViewDialog { + id: orientationsDialog + function compassMask () { var mask = 0 mask |= (0 + (sensorParams.rgCompassPrio[0].rawValue !== 0)) << 0 @@ -421,228 +423,315 @@ SetupPage { return mask } - onAccepted: { + function accept() { if (_orientationDialogCalType == _calTypeAccel) { controller.calibrateAccel(_doSimpleAccelCal) } else if (_orientationDialogCalType == _calTypeCompass) { if (!northCalibrationCheckBox.checked) { controller.calibrateCompass() } else { - var lat = parseFloat(northCalLat.text) - var lon = parseFloat(northCalLon.text) - if (useMapPositionCheckbox.checked) { - lat = _mapPosition.latitude - lon = _mapPosition.longitude - } - if (useGcsPositionCheckbox.checked) { - lat = _gcsPosition.latitude - lon = _gcsPosition.longitude - } - if (isNaN(lat) || isNaN(lon)) { - return - } - controller.calibrateCompassNorth(lat, lon, compassMask()) + var lat = parseFloat(northCalLat.text) + var lon = parseFloat(northCalLon.text) + if (useMapPositionCheckbox.checked) { + lat = _mapPosition.latitude + lon = _mapPosition.longitude + } + if (useGcsPositionCheckbox.checked) { + lat = _gcsPosition.latitude + lon = _gcsPosition.longitude + } + if (isNaN(lat) || isNaN(lon)) { + return + } + controller.calibrateCompassNorth(lat, lon, compassMask()) } } + orientationsDialog.hideDialog() } - Column { - width: 40 * ScreenTools.defaultFontPixelWidth - spacing: ScreenTools.defaultFontPixelHeight - - QGCLabel { - width: parent.width - wrapMode: Text.WordWrap - text: _orientationDialogHelp - } + QGCFlickable { + anchors.fill: parent + contentHeight: columnLayout.height + clip: true Column { - QGCLabel { text: qsTr("Autopilot Rotation:") } - - FactComboBox { - width: rotationColumnWidth - indexModel: false - fact: boardRot - } - } - - Column { - - visible: _orientationDialogCalType == _calTypeAccel - spacing: ScreenTools.defaultFontPixelHeight - - QGCLabel { - width: parent.width - wrapMode: Text.WordWrap - text: qsTr("Simple accelerometer calibration is less precise but allows calibrating without rotating the vehicle. Check this if you have a large/heavy vehicle.") - } - - QGCCheckBox { - text: "Simple Accelerometer Calibration" - onClicked: _doSimpleAccelCal = this.checked - } - } - - Repeater { - model: _orientationsDialogShowCompass ? 3 : 0 - delegate: singleCompassSettingsComponent - } - - QGCLabel { - id: magneticDeclinationLabel - width: parent.width - visible: globals.activeVehicle.sub && _orientationsDialogShowCompass - text: qsTr("Magnetic Declination") - } - - Column { - visible: magneticDeclinationLabel.visible + id: columnLayout anchors.margins: ScreenTools.defaultFontPixelWidth anchors.left: parent.left anchors.right: parent.right + anchors.top: parent.top spacing: ScreenTools.defaultFontPixelHeight - QGCCheckBox { - id: manualMagneticDeclinationCheckBox - text: qsTr("Manual Magnetic Declination") - property Fact autoDecFact: controller.getParameterFact(-1, "COMPASS_AUTODEC") - property int manual: 0 - property int automatic: 1 - - checked: autoDecFact.rawValue === manual - onClicked: autoDecFact.value = (checked ? manual : automatic) - } - - FactTextField { - fact: sensorParams.declinationFact - enabled: manualMagneticDeclinationCheckBox.checked - } - } - - Item { height: ScreenTools.defaultFontPixelHeight; width: 10 } // spacer - - QGCLabel { - id: northCalibrationLabel - width: parent.width - visible: _orientationsDialogShowCompass - wrapMode: Text.WordWrap - text: qsTr("Fast compass calibration given vehicle position and yaw. This ") + - qsTr("results in zero diagonal and off-diagonal elements, so is only ") + - qsTr("suitable for vehicles where the field is close to spherical. It is ") + - qsTr("useful for large vehicles where moving the vehicle to calibrate it ") + - qsTr("is difficult. Point the vehicle North before using it.") - } - - Column { - visible: northCalibrationLabel.visible - anchors.margins: ScreenTools.defaultFontPixelWidth - anchors.left: parent.left - anchors.right: parent.right - spacing: ScreenTools.defaultFontPixelHeight - - QGCCheckBox { - id: northCalibrationCheckBox - visible: northCalibrationLabel.visible - text: qsTr("Fast Calibration") - } - - QGCLabel { - id: northCalibrationManualPosition - width: parent.width - visible: northCalibrationCheckBox.checked && !globals.activeVehicle.coordinate.isValid - wrapMode: Text.WordWrap - text: qsTr("Vehicle has no Valid positon, please provide it") - } - - QGCCheckBox { - visible: northCalibrationManualPosition.visible && _gcsPosition.isValid - id: useGcsPositionCheckbox - text: qsTr("Use GCS position instead") - checked: _gcsPosition.isValid - } - QGCCheckBox { - visible: northCalibrationManualPosition.visible && !_gcsPosition.isValid - id: useMapPositionCheckbox - text: qsTr("Use current map position instead") - } - QGCLabel { width: parent.width - visible: useMapPositionCheckbox.checked wrapMode: Text.WordWrap - text: qsTr(`Lat: ${_mapPosition.latitude.toFixed(4)} Lon: ${_mapPosition.longitude.toFixed(4)}`) + text: _orientationDialogHelp } - FactTextField { - id: northCalLat - visible: !useGcsPositionCheckbox.checked && !useMapPositionCheckbox.checked && northCalibrationCheckBox.checked - text: "0.00" - textColor: isNaN(parseFloat(text)) ? qgcPal.warningText: qgcPal.textFieldText - enabled: !useGcsPositionCheckbox.checked - } - FactTextField { - id: northCalLon - visible: !useGcsPositionCheckbox.checked && !useMapPositionCheckbox.checked && northCalibrationCheckBox.checked - text: "0.00" - textColor: isNaN(parseFloat(text)) ? qgcPal.warningText: qgcPal.textFieldText - enabled: !useGcsPositionCheckbox.checked + Column { + QGCLabel { text: qsTr("Autopilot Rotation:") } + + FactComboBox { + width: rotationColumnWidth + indexModel: false + fact: boardRot + } } - } - } - } - } + Column { + + visible: _orientationDialogCalType == _calTypeAccel + spacing: ScreenTools.defaultFontPixelHeight + + QGCLabel { + width: parent.width + wrapMode: Text.WordWrap + text: qsTr("Simple accelerometer calibration is less precise but allows calibrating without rotating the vehicle. Check this if you have a large/heavy vehicle.") + } + + QGCCheckBox { + text: "Simple Accelerometer Calibration" + onClicked: _doSimpleAccelCal = this.checked + } + } + + Repeater { + model: _orientationsDialogShowCompass ? 3 : 0 + delegate: singleCompassSettingsComponent + } + + QGCLabel { + id: magneticDeclinationLabel + width: parent.width + visible: globals.activeVehicle.sub && _orientationsDialogShowCompass + text: qsTr("Magnetic Declination") + } + + Column { + visible: magneticDeclinationLabel.visible + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.left: parent.left + anchors.right: parent.right + spacing: ScreenTools.defaultFontPixelHeight + + QGCCheckBox { + id: manualMagneticDeclinationCheckBox + text: qsTr("Manual Magnetic Declination") + property Fact autoDecFact: controller.getParameterFact(-1, "COMPASS_AUTODEC") + property int manual: 0 + property int automatic: 1 + + checked: autoDecFact.rawValue === manual + onClicked: autoDecFact.value = (checked ? manual : automatic) + } + + FactTextField { + fact: sensorParams.declinationFact + enabled: manualMagneticDeclinationCheckBox.checked + } + } + + Item { height: ScreenTools.defaultFontPixelHeight; width: 10 } // spacer + + QGCLabel { + id: northCalibrationLabel + width: parent.width + visible: _orientationsDialogShowCompass + wrapMode: Text.WordWrap + text: qsTr("Fast compass calibration given vehicle position and yaw. This ") + + qsTr("results in zero diagonal and off-diagonal elements, so is only ") + + qsTr("suitable for vehicles where the field is close to spherical. It is ") + + qsTr("useful for large vehicles where moving the vehicle to calibrate it ") + + qsTr("is difficult. Point the vehicle North before using it.") + } + + Column { + visible: northCalibrationLabel.visible + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.left: parent.left + anchors.right: parent.right + spacing: ScreenTools.defaultFontPixelHeight + + QGCCheckBox { + id: northCalibrationCheckBox + visible: northCalibrationLabel.visible + text: qsTr("Fast Calibration") + } + + QGCLabel { + id: northCalibrationManualPosition + width: parent.width + visible: northCalibrationCheckBox.checked && !globals.activeVehicle.coordinate.isValid + wrapMode: Text.WordWrap + text: qsTr("Vehicle has no Valid positon, please provide it") + } + + QGCCheckBox { + visible: northCalibrationManualPosition.visible && _gcsPosition.isValid + id: useGcsPositionCheckbox + text: qsTr("Use GCS position instead") + checked: _gcsPosition.isValid + } + QGCCheckBox { + visible: northCalibrationManualPosition.visible && !_gcsPosition.isValid + id: useMapPositionCheckbox + text: qsTr("Use current map position instead") + } + + QGCLabel { + width: parent.width + visible: useMapPositionCheckbox.checked + wrapMode: Text.WordWrap + text: qsTr(`Lat: ${_mapPosition.latitude.toFixed(4)} Lon: ${_mapPosition.longitude.toFixed(4)}`) + } + + FactTextField { + id: northCalLat + visible: !useGcsPositionCheckbox.checked && !useMapPositionCheckbox.checked && northCalibrationCheckBox.checked + text: "0.00" + textColor: isNaN(parseFloat(text)) ? qgcPal.warningText: qgcPal.textFieldText + enabled: !useGcsPositionCheckbox.checked + } + FactTextField { + id: northCalLon + visible: !useGcsPositionCheckbox.checked && !useMapPositionCheckbox.checked && northCalibrationCheckBox.checked + text: "0.00" + textColor: isNaN(parseFloat(text)) ? qgcPal.warningText: qgcPal.textFieldText + enabled: !useGcsPositionCheckbox.checked + } + + } + } // Column + } // QGCFlickable + } // QGCViewDialog + } // Component - orientationsDialogComponent Component { id: compassMotDialogComponent - QGCPopupDialog { - title: qsTr("Compass Motor Interference Calibration") - buttons: StandardButton.Cancel | StandardButton.Ok + QGCViewDialog { + id: compassMotDialog - onAccepted: controller.calibrateMotorInterference() + function accept() { + controller.calibrateMotorInterference() + compassMotDialog.hideDialog() + } - Column { - width: 40 * ScreenTools.defaultFontPixelWidth - spacing: ScreenTools.defaultFontPixelHeight + QGCFlickable { + anchors.fill: parent + contentHeight: columnLayout.height + clip: true - QGCLabel { - anchors.left: parent.left - anchors.right: parent.right - wrapMode: Text.WordWrap - text: qsTr("This is recommended for vehicles that have only an internal compass and on vehicles where there is significant interference on the compass from the motors, power wires, etc. ") + - qsTr("CompassMot only works well if you have a battery current monitor because the magnetic interference is linear with current drawn. ") + - qsTr("It is technically possible to set-up CompassMot using throttle but this is not recommended.") - } + Column { + id: columnLayout + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + spacing: ScreenTools.defaultFontPixelHeight - QGCLabel { - anchors.left: parent.left - anchors.right: parent.right - wrapMode: Text.WordWrap - text: qsTr("Disconnect your props, flip them over and rotate them one position around the frame. ") + - qsTr("In this configuration they should push the copter down into the ground when the throttle is raised.") - } + QGCLabel { + anchors.left: parent.left + anchors.right: parent.right + wrapMode: Text.WordWrap + text: qsTr("This is recommended for vehicles that have only an internal compass and on vehicles where there is significant interference on the compass from the motors, power wires, etc. ") + + qsTr("CompassMot only works well if you have a battery current monitor because the magnetic interference is linear with current drawn. ") + + qsTr("It is technically possible to set-up CompassMot using throttle but this is not recommended.") + } - QGCLabel { - anchors.left: parent.left - anchors.right: parent.right - wrapMode: Text.WordWrap - text: qsTr("Secure the copter (perhaps with tape) so that it does not move.") - } + QGCLabel { + anchors.left: parent.left + anchors.right: parent.right + wrapMode: Text.WordWrap + text: qsTr("Disconnect your props, flip them over and rotate them one position around the frame. ") + + qsTr("In this configuration they should push the copter down into the ground when the throttle is raised.") + } - QGCLabel { - anchors.left: parent.left - anchors.right: parent.right - wrapMode: Text.WordWrap - text: qsTr("Turn on your transmitter and keep throttle at zero.") - } + QGCLabel { + anchors.left: parent.left + anchors.right: parent.right + wrapMode: Text.WordWrap + text: qsTr("Secure the copter (perhaps with tape) so that it does not move.") + } - QGCLabel { - anchors.left: parent.left - anchors.right: parent.right - wrapMode: Text.WordWrap - text: qsTr("Click Ok to start CompassMot calibration.") - } + QGCLabel { + anchors.left: parent.left + anchors.right: parent.right + wrapMode: Text.WordWrap + text: qsTr("Turn on your transmitter and keep throttle at zero.") + } + + QGCLabel { + anchors.left: parent.left + anchors.right: parent.right + wrapMode: Text.WordWrap + text: qsTr("Click Ok to start CompassMot calibration.") + } + } // Column + } // QGCFlickable + } // QGCViewDialog + } // Component - compassMotDialogComponent + + Component { + id: levelHorizonDialogComponent + + QGCViewDialog { + id: levelHorizonDialog + + function accept() { + controller.levelHorizon() + levelHorizonDialog.hideDialog() + } + + QGCLabel { + anchors.left: parent.left + anchors.right: parent.right + wrapMode: Text.WordWrap + text: qsTr("To level the horizon you need to place the vehicle in its level flight position and press Ok.") + } + } // QGCViewDialog + } // Component - levelHorizonDialogComponent + + Component { + id: calibratePressureDialogComponent + + QGCViewDialog { + id: calibratePressureDialog + + function accept() { + controller.calibratePressure() + calibratePressureDialog.hideDialog() + } + + QGCLabel { + anchors.left: parent.left + anchors.right: parent.right + wrapMode: Text.WordWrap + text: _helpText + + readonly property string _altText: globals.activeVehicle.sub ? qsTr("depth") : qsTr("altitude") + readonly property string _helpText: qsTr("Pressure calibration will set the %1 to zero at the current pressure reading. %2").arg(_altText).arg(_helpTextFW) + readonly property string _helpTextFW: globals.activeVehicle.fixedWing ? qsTr("To calibrate the airspeed sensor shield it from the wind. Do not touch the sensor or obstruct any holes during the calibration.") : "" + } + } // QGCViewDialog + } // Component - calibratePressureDialogComponent + + Component { + id: calibrateGyroDialogComponent + + QGCViewDialog { + id: calibrateGyroDialog + + function accept() { + controller.calibrateGyro() + calibrateGyroDialog.hideDialog() + } + + QGCLabel { + anchors.left: parent.left + anchors.right: parent.right + wrapMode: Text.WordWrap + text: qsTr("For Gyroscope calibration you will need to place your vehicle on a surface and leave it still.\n\nClick Ok to start calibration.") } } } @@ -697,10 +786,7 @@ SetupPage { if (controller.accelSetupNeeded) { mainWindow.showMessageDialog(_levelHorizonText, qsTr("Accelerometer must be calibrated prior to Level Horizon.")) } else { - mainWindow.showMessageDialog(_levelHorizonText, - qsTr("To level the horizon you need to place the vehicle in its level flight position and press Ok."), - StandardButton.Cancel | StandardButton.Ok, - function() { controller.levelHorizon() }) + mainWindow.showComponentDialog(levelHorizonDialogComponent, _levelHorizonText, mainWindow.showDialogDefaultWidth, StandardButton.Cancel | StandardButton.Ok) } } } @@ -709,30 +795,23 @@ SetupPage { width: _buttonWidth text: qsTr("Gyro") visible: globals.activeVehicle && (globals.activeVehicle.multiRotor | globals.activeVehicle.rover | globals.activeVehicle.sub) - onClicked: mainWindow.showMessageDialog(qsTr("Calibrate Gyro"), - qsTr("For Gyroscope calibration you will need to place your vehicle on a surface and leave it still.\n\nClick Ok to start calibration."), - StandardButton.Cancel | StandardButton.Ok, - function() { controller.calibrateGyro() }) + onClicked: mainWindow.showComponentDialog(calibrateGyroDialogComponent, qsTr("Calibrate Gyro"), mainWindow.showDialogDefaultWidth, StandardButton.Cancel | StandardButton.Ok) } QGCButton { width: _buttonWidth text: _calibratePressureText - onClicked: mainWindow.showMessageDialog(_calibratePressureText, - qsTr("Pressure calibration will set the %1 to zero at the current pressure reading. %2").arg(_altText).arg(_helpTextFW), - StandardButton.Cancel | StandardButton.Ok, - function() { controller.calibratePressure() }) + onClicked: mainWindow.showComponentDialog(calibratePressureDialogComponent, _calibratePressureText, mainWindow.showDialogDefaultWidth, StandardButton.Cancel | StandardButton.Ok) - readonly property string _altText: globals.activeVehicle.sub ? qsTr("depth") : qsTr("altitude") - readonly property string _helpTextFW: globals.activeVehicle.fixedWing ? qsTr("To calibrate the airspeed sensor shield it from the wind. Do not touch the sensor or obstruct any holes during the calibration.") : "" - readonly property string _calibratePressureText: globals.activeVehicle.fixedWing ? qsTr("Baro/Airspeed") : qsTr("Pressure") + readonly property string _calibratePressureText: globals.activeVehicle.fixedWing ? qsTr("Baro/Airspeed") : qsTr("Pressure") } QGCButton { width: _buttonWidth text: qsTr("CompassMot") visible: globals.activeVehicle ? globals.activeVehicle.supportsMotorInterference : false - onClicked: compassMotDialogComponent.createObject(mainWindow).open() + + onClicked: mainWindow.showComponentDialog(compassMotDialogComponent, qsTr("CompassMot - Compass Motor Interference Calibration"), mainWindow.showDialogFullWidth, StandardButton.Cancel | StandardButton.Ok) } QGCButton { diff --git a/src/AutoPilotPlugins/APM/APMSensorsComponentController.cc b/src/AutoPilotPlugins/APM/APMSensorsComponentController.cc index 944843a..91a5190 100644 --- a/src/AutoPilotPlugins/APM/APMSensorsComponentController.cc +++ b/src/AutoPilotPlugins/APM/APMSensorsComponentController.cc @@ -58,6 +58,9 @@ APMSensorsComponentController::APMSensorsComponentController(void) , _waitingForCancel(false) , _restoreCompassCalFitness(false) { + _compassCal.setVehicle(_vehicle); + connect(&_compassCal, &APMCompassCal::vehicleTextMessage, this, &APMSensorsComponentController::_handleUASTextMessage); + APMAutoPilotPlugin * apmPlugin = qobject_cast(_vehicle->autopilotPlugin()); // Find the sensors component @@ -271,6 +274,9 @@ void APMSensorsComponentController::_mavCommandResult(int vehicleId, int compone 0, // no delayed start 0); // no auto-reboot + } else { + // Onboard mag cal is not supported + _compassCal.startCalibration(); } } else if (command == MAV_CMD_DO_START_MAG_CAL && result != MAV_RESULT_ACCEPTED) { _restorePreviousCompassCalFitness(); @@ -446,7 +452,11 @@ void APMSensorsComponentController::cancelCalibration(void) { _cancelButton->setEnabled(false); - if (_calTypeInProgress == CalTypeOnboardCompass) { + if (_calTypeInProgress == CalTypeOffboardCompass) { + _waitingForCancel = true; + emit waitingForCancelChanged(); + _compassCal.cancelCalibration(); + } else if (_calTypeInProgress == CalTypeOnboardCompass) { _vehicle->sendMavCommand(_vehicle->defaultComponentId(), MAV_CMD_DO_CANCEL_MAG_CAL, true /* showError */); _stopCalibration(StopCalibrationCancelled); } else { @@ -514,9 +524,6 @@ void APMSensorsComponentController::_handleCommandAck(mavlink_message_t& message if (commandAck.command == MAV_CMD_PREFLIGHT_CALIBRATION) { switch (commandAck.result) { - case MAV_RESULT_IN_PROGRESS: - _appendStatusLog(tr("In progress")); - break; case MAV_RESULT_ACCEPTED: _appendStatusLog(tr("Successfully completed")); _stopCalibration(StopCalibrationSuccessShowLog); diff --git a/src/AutoPilotPlugins/APM/APMSensorsComponentController.h b/src/AutoPilotPlugins/APM/APMSensorsComponentController.h index bca5fc4..2fe31a9 100644 --- a/src/AutoPilotPlugins/APM/APMSensorsComponentController.h +++ b/src/AutoPilotPlugins/APM/APMSensorsComponentController.h @@ -15,6 +15,7 @@ #include "FactPanelController.h" #include "QGCLoggingCategory.h" #include "APMSensorsComponent.h" +#include "APMCompassCal.h" Q_DECLARE_LOGGING_CATEGORY(APMSensorsComponentControllerLog) Q_DECLARE_LOGGING_CATEGORY(APMSensorsComponentControllerVerboseLog) @@ -96,6 +97,7 @@ public: CalTypeAccel, CalTypeGyro, CalTypeOnboardCompass, + CalTypeOffboardCompass, CalTypeLevelHorizon, CalTypeCompassMot, CalTypePressure, @@ -159,6 +161,7 @@ private: void _updateAndEmitShowOrientationCalArea(bool show); + APMCompassCal _compassCal; APMSensorsComponent* _sensorsComponent; QQuickItem* _statusLog; diff --git a/src/AutoPilotPlugins/APM/APMSubFrameComponent.qml b/src/AutoPilotPlugins/APM/APMSubFrameComponent.qml index 30d061b..6cacc18 100644 --- a/src/AutoPilotPlugins/APM/APMSubFrameComponent.qml +++ b/src/AutoPilotPlugins/APM/APMSubFrameComponent.qml @@ -8,10 +8,9 @@ ****************************************************************************/ -import QtQuick 2.3 -import QtQuick.Controls 1.2 -import QtQuick.Dialogs 1.2 -import QtQuick.Layouts 1.2 +import QtQuick 2.3 +import QtQuick.Controls 1.2 +import QtQuick.Dialogs 1.2 import QGroundControl 1.0 import QGroundControl.FactSystem 1.0 @@ -184,7 +183,7 @@ SetupPage { setFrameConfig(frameModelSelected.paramValue) return } - confirmFrameComponent.createObject(mainWindow).open() + mainWindow.showComponentDialog(confirmFrameComponent, qsTr("Frame selection"), mainWindow.showDialogDefaultWidth, StandardButton.Close) } } } @@ -197,43 +196,61 @@ SetupPage { Component { id: confirmFrameComponent - QGCPopupDialog { - id: confirmFrameDialog - title: qsTr("Frame selection") - buttons: StandardButton.Close + QGCViewDialog { + QGCLabel { + id: applyParamsText + anchors.left: parent.left + anchors.margins: _margins + anchors.right: parent.right + anchors.top: parent.top + wrapMode: Text.WordWrap + text: { + if (frameModelSelected.paramFileName != undefined) { + return qsTr("Would you like to load the default parameters for the frame ?") + } - ColumnLayout { - QGCLabel { - id: applyParamsText - width: firstButton.width - wrapMode: Text.WordWrap - text: frameModelSelected.paramFileName != undefined ? - qsTr("Would you like to load the default parameters for the frame?") : - qsTr("Would you like to set the desired frame?") + return qsTr("Would you like to set the desired frame ?") } + } + + Flow { + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.margins: _margins + anchors.right: parent.right + anchors.top: applyParamsText.bottom + spacing: _margins + layoutDirection: Qt.Vertical QGCButton { - id: firstButton - Layout.fillWidth: true - text: qsTr("Yes, Load default parameter set for %1").arg(frameModelSelected.name) - visible: frameModelSelected.paramFileName != undefined + width: parent.width + text: qsTr("Yes, Load default parameter set for %1").arg(frameModelSelected.name) + wrapMode: Text.WordWrap + horizontalAlignment: Text.AlignHCenter + visible: frameModelSelected.paramFileName != undefined onClicked: { setFrameConfig(frameModelSelected.paramValue) loadFrameDefaultParameters(frameModelSelected.paramFileName) - confirmFrameDialog.close() + hideDialog() } } QGCButton { - Layout.fillWidth: true - text: frameModelSelected.paramFileName != undefined ? - qsTr("No, set frame only") : - qsTr("Confirm frame %1").arg(frameModelSelected.name) + width: parent.width + wrapMode: Text.WordWrap + horizontalAlignment: Text.AlignHCenter + text: { + if (frameModelSelected.paramFileName != undefined) { + return qsTr("No, set frame only") + } + + return qsTr("Confirm frame %1").arg(frameModelSelected.name) + } onClicked: { setFrameConfig(frameModelSelected.paramValue) - confirmFrameDialog.close() + hideDialog() } } } diff --git a/src/AutoPilotPlugins/APM/CMakeLists.txt b/src/AutoPilotPlugins/APM/CMakeLists.txt index 8cd4709..565e541 100644 --- a/src/AutoPilotPlugins/APM/CMakeLists.txt +++ b/src/AutoPilotPlugins/APM/CMakeLists.txt @@ -14,7 +14,6 @@ SOURCES APMPowerComponent.qml APMPowerComponentSummary.qml APMRadioComponentSummary.qml - APMRemoteSupportComponent.qml APMSafetyComponent.qml APMSafetyComponentCopter.qml APMSafetyComponentPlane.qml @@ -33,4 +32,4 @@ SOURCES APMTuningComponentCopter.qml APMTuningComponentSub.qml -) +) \ No newline at end of file diff --git a/src/AutoPilotPlugins/APM/Images/ForwardingSupportIcon.svg b/src/AutoPilotPlugins/APM/Images/ForwardingSupportIcon.svg deleted file mode 100644 index cb7d99e..0000000 --- a/src/AutoPilotPlugins/APM/Images/ForwardingSupportIcon.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/AutoPilotPlugins/APM/Images/ForwardingSupportIconGreen.svg b/src/AutoPilotPlugins/APM/Images/ForwardingSupportIconGreen.svg deleted file mode 100644 index cf2c52a..0000000 --- a/src/AutoPilotPlugins/APM/Images/ForwardingSupportIconGreen.svg +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/AutoPilotPlugins/CMakeLists.txt b/src/AutoPilotPlugins/CMakeLists.txt index ab812c2..ee84562 100644 --- a/src/AutoPilotPlugins/CMakeLists.txt +++ b/src/AutoPilotPlugins/CMakeLists.txt @@ -8,6 +8,7 @@ add_library(AutoPilotPlugins APM/APMAirframeComponentController.cc APM/APMAutoPilotPlugin.cc APM/APMCameraComponent.cc + APM/APMCompassCal.cc APM/APMFlightModesComponent.cc APM/APMFlightModesComponentController.cc APM/APMFollowComponent.cc @@ -17,7 +18,6 @@ add_library(AutoPilotPlugins APM/APMMotorComponent.cc APM/APMPowerComponent.cc APM/APMRadioComponent.cc - APM/APMRemoteSupportComponent.cc APM/APMSafetyComponent.cc APM/APMSensorsComponent.cc APM/APMSensorsComponentController.cc @@ -50,6 +50,8 @@ add_library(AutoPilotPlugins PX4/PowerComponentController.cc PX4/PowerComponentController.h PX4/PowerComponent.h + PX4/PX4AdvancedFlightModesController.cc + PX4/PX4AdvancedFlightModesController.h PX4/PX4AirframeLoader.cc PX4/PX4AirframeLoader.h PX4/PX4AutoPilotPlugin.cc diff --git a/src/AutoPilotPlugins/Common/RadioComponent.qml b/src/AutoPilotPlugins/Common/RadioComponent.qml index b429e81..4f1f39d 100644 --- a/src/AutoPilotPlugins/Common/RadioComponent.qml +++ b/src/AutoPilotPlugins/Common/RadioComponent.qml @@ -31,6 +31,8 @@ SetupPage { width: availableWidth height: Math.max(leftColumn.height, rightColumn.height) + readonly property string dialogTitle: qsTr("Radio") + function setupPageCompleted() { controller.start() updateChannelCount() @@ -53,28 +55,59 @@ SetupPage { onThrottleReversedCalFailure: mainWindow.showMessageDialog(qsTr("Throttle channel reversed"), qsTr("Calibration failed. The throttle channel on your transmitter is reversed. You must correct this on your transmitter in order to complete calibration.")) } + Component { + id: copyTrimsDialogComponent + QGCViewMessage { + message: qsTr("Center your sticks and move throttle all the way down, then press Ok to copy trims. After pressing Ok, reset the trims on your radio back to zero.") + function accept() { + hideDialog() + controller.copyTrims() + } + } + } + + Component { + id: zeroTrimsDialogComponent + QGCViewMessage { + message: qsTr("Before calibrating you should zero all your trims and subtrims. Click Ok to start Calibration.\n\n%1").arg( + (QGroundControl.multiVehicleManager.activeVehicle.px4Firmware ? "" : qsTr("Please ensure all motor power is disconnected AND all props are removed from the vehicle."))) + function accept() { + hideDialog() + controller.nextButtonClicked() + } + } + } + + Component { + id: channelCountDialogComponent + QGCViewMessage { + message: controller.channelCount == 0 ? qsTr("Please turn on transmitter.") : qsTr("%1 channels or more are needed to fly.").arg(controller.minChannelCount) + } + } + Component { id: spektrumBindDialogComponent + QGCViewDialog { - QGCPopupDialog { - title: qsTr("Spektrum Bind") - buttons: StandardButton.Ok | StandardButton.Cancel + function accept() { + controller.spektrumBindMode(radioGroup.checkedButton.bindMode) + hideDialog() + } - onAccepted: { controller.spektrumBindMode(radioGroup.checkedButton.bindMode) } + function reject() { + hideDialog() + } ButtonGroup { id: radioGroup } - ColumnLayout { - spacing: ScreenTools.defaultFontPixelHeight / 2 + Column { + anchors.fill: parent + spacing: 5 QGCLabel { + width: parent.width wrapMode: Text.WordWrap - text: qsTr("Click Ok to place your Spektrum receiver in the bind mode.") - } - - QGCLabel { - wrapMode: Text.WordWrap - text: qsTr("Select the specific receiver type below:") + text: qsTr("Click Ok to place your Spektrum receiver in the bind mode. Select the specific receiver type below:") } QGCRadioButton { @@ -97,7 +130,7 @@ SetupPage { } } } - } + } // Component - spektrumBindDialogComponent // Live channel monitor control component Component { @@ -313,19 +346,7 @@ SetupPage { onClicked: { if (text === qsTr("Calibrate")) { - if (controller.channelCount < controller.minChannelCount) { - mainWindow.showMessageDialog(qsTr("Radio Not Ready"), - controller.channelCount == 0 ? qsTr("Please turn on transmitter.") : - (controller.channelCount < controller.minChannelCount ? - qsTr("%1 channels or more are needed to fly.").arg(controller.minChannelCount) : - qsTr("Ready to calibrate."))) - } else { - mainWindow.showMessageDialog(qsTr("Zero Trims"), - qsTr("Before calibrating you should zero all your trims and subtrims. Click Ok to start Calibration.\n\n%1").arg( - (QGroundControl.multiVehicleManager.activeVehicle.px4Firmware ? "" : qsTr("Please ensure all motor power is disconnected AND all props are removed from the vehicle."))), - StandardButton.Ok, - function() { controller.nextButtonClicked() }) - } + mainWindow.showComponentDialog(zeroTrimsDialogComponent, dialogTitle, mainWindow.showDialogDefaultWidth, StandardButton.Ok | StandardButton.Cancel) } else { controller.nextButtonClicked() } @@ -359,8 +380,8 @@ SetupPage { Repeater { model: QGroundControl.multiVehicleManager.activeVehicle.px4Firmware ? (QGroundControl.multiVehicleManager.activeVehicle.multiRotor ? - [ "RC_MAP_AUX1", "RC_MAP_AUX2", "RC_MAP_PARAM1", "RC_MAP_PARAM2", "RC_MAP_PARAM3"] : - [ "RC_MAP_FLAPS", "RC_MAP_AUX1", "RC_MAP_AUX2", "RC_MAP_PARAM1", "RC_MAP_PARAM2", "RC_MAP_PARAM3"]) : + [ "RC_MAP_AUX1", "RC_MAP_AUX2", "RC_MAP_PARAM1", "RC_MAP_PARAM2", "RC_MAP_PARAM3"] : + [ "RC_MAP_FLAPS", "RC_MAP_AUX1", "RC_MAP_AUX2", "RC_MAP_PARAM1", "RC_MAP_PARAM2", "RC_MAP_PARAM3"]) : 0 RowLayout { @@ -385,15 +406,12 @@ SetupPage { QGCButton { id: bindButton text: qsTr("Spektrum Bind") - onClicked: spektrumBindDialogComponent.createObject(mainWindow).open() + onClicked: mainWindow.showComponentDialog(spektrumBindDialogComponent, dialogTitle, mainWindow.showDialogDefaultWidth, StandardButton.Ok | StandardButton.Cancel) } QGCButton { text: qsTr("Copy Trims") - onClicked: mainWindow.showMessageDialog(qsTr("Copy Trims"), - qsTr("Center your sticks and move throttle all the way down, then press Ok to copy trims. After pressing Ok, reset the trims on your radio back to zero."), - StandardButton.Ok | StandardButton.Cancel, - function() { controller.copyTrims() }) + onClicked: mainWindow.showComponentDialog(copyTrimsDialogComponent, dialogTitle, mainWindow.showDialogDefaultWidth, StandardButton.Ok | StandardButton.Cancel) } } } // Column - Left Column diff --git a/src/AutoPilotPlugins/PX4/ActuatorComponent.qml b/src/AutoPilotPlugins/PX4/ActuatorComponent.qml index 6bd85ef..68cc175 100644 --- a/src/AutoPilotPlugins/PX4/ActuatorComponent.qml +++ b/src/AutoPilotPlugins/PX4/ActuatorComponent.qml @@ -31,23 +31,10 @@ SetupPage { implicitWidth: _leftColumnWidth // mixer ui - RowLayout { - width: _leftColumnWidth - visible: actuators.mixer.groups.count > 0 - QGCLabel { - text: qsTr("Geometry") + (actuators.mixer.title ? ": " + actuators.mixer.title : "") - font.pointSize: ScreenTools.mediumFontPointSize - Layout.fillWidth: true - } - QGCLabel { - text: "?" - font.pointSize: ScreenTools.mediumFontPointSize - visible: actuators.mixer.helpUrl - textFormat: Text.RichText - onLinkActivated: { - Qt.openUrlExternally(link); - } - } + QGCLabel { + text: qsTr("Geometry") + font.pointSize: ScreenTools.mediumFontPointSize + visible: actuators.mixer.groups.count > 0 } Rectangle { @@ -299,7 +286,7 @@ SetupPage { model: actionGroup.actions QGCMenuItem { text: object.label - onTriggered: object.trigger() + onTriggered: object.trigger() } onObjectAdded: actionMenu.insertItem(index, object) onObjectRemoved: actionMenu.removeItem(object) @@ -367,7 +354,6 @@ SetupPage { QGCButton { text: qsTr("Identify & Assign Motors") visible: !actuators.motorAssignmentActive && selActuatorOutput.actuatorOutput.groupsVisible - enabled: actuators.motorAssignmentEnabled onClicked: { var success = actuators.initMotorAssignment() if (success) { diff --git a/src/AutoPilotPlugins/PX4/AirframeComponent.qml b/src/AutoPilotPlugins/PX4/AirframeComponent.qml index d325475..a99e1a3 100644 --- a/src/AutoPilotPlugins/PX4/AirframeComponent.qml +++ b/src/AutoPilotPlugins/PX4/AirframeComponent.qml @@ -97,6 +97,27 @@ SetupPage { } } + Component { + id: applyRestartDialogComponent + + QGCViewDialog { + id: applyRestartDialog + + function accept() { + controller.changeAutostart() + applyRestartDialog.hideDialog() + } + + QGCLabel { + anchors.fill: parent + wrapMode: Text.WordWrap + text: qsTr("Clicking 'Apply' will save the changes you have made to your airframe configuration.

\ +All vehicle parameters other than Radio Calibration will be reset.

\ +Your vehicle will also be restarted in order to complete the process.") + } + } + } + Item { id: helpApplyRow anchors.left: parent.left @@ -118,13 +139,8 @@ SetupPage { id: applyButton anchors.right: parent.right text: qsTr("Apply and Restart") - onClicked: mainWindow.showMessageDialog(qsTr("Apply and Restart"), - qsTr("Clicking 'Apply' will save the changes you have made to your airframe configuration.

\ - All vehicle parameters other than Radio Calibration will be reset.

\ - Your vehicle will also be restarted in order to complete the process."), - StandardButton.Apply | StandardButton.Cancel, - function() { controller.changeAutostart() }) + onClicked: mainWindow.showComponentDialog(applyRestartDialogComponent, qsTr("Apply and Restart"), mainWindow.showDialogDefaultWidth, StandardButton.Apply | StandardButton.Cancel) } } diff --git a/src/AutoPilotPlugins/PX4/AirframeFactMetaData.xml b/src/AutoPilotPlugins/PX4/AirframeFactMetaData.xml index b48dbc4..e890a4d 100644 --- a/src/AutoPilotPlugins/PX4/AirframeFactMetaData.xml +++ b/src/AutoPilotPlugins/PX4/AirframeFactMetaData.xml @@ -6,10 +6,10 @@ Airship Airship - starboard thruster - port thruster - tail thruster - thrust tilt + starboard thruster + port thruster + thrust tilt + tail thruster @@ -18,23 +18,25 @@ ThunderFly s.r.o., Roman Dvorak <dvorakroman@thunderfly.cz> Autogyro https://github.com/ThunderFly-aerospace/Auto-G2/ - throttle - rotor_head_L - rotor_head_R - elevator - rudder - rudder (second, optional) - wheel + rotor_head_L + rotor_head_R + elevator + rudder + rudder (second, optional) + throttle + wheel + feed-through of RC AUX1 channel for prerotator (optional) + feed-through of RC AUX2 channel for release device (optional) Autogyro ThunderFly s.r.o., Roman Dvorak <dvorakroman@thunderfly.cz> Autogyro https://github.com/ThunderFly-aerospace/TF-G2/ - throttle - rotor_head_L - rotor_head_R - rudder + rotor_head_L + rotor_head_R + rudder + throttle @@ -45,17 +47,46 @@ https://github.com/ThunderFly-aerospace/TF-B1/ + + + Copter + Emmanuel Roussel + Coaxial Helicopter + Left swashplate servomotor, pitch axis + Right swashplate servomotor, roll axis + Upper rotor (CCW) + Lower rotor (CW) + + Copter William Peale <develop707@gmail.com> Dodecarotor cox + motor 1 + motor 2 + motor 3 + motor 4 + motor 5 + motor 6 + motor 7 + motor 8 + motor 9 + motor 10 + motor 11 + motor 12 - + Copter + Bart Slinger <bartslinger@gmail.com> Helicopter + main motor + front swashplate servo + right swashplate servo + left swashplate servo + tail-rotor servo @@ -63,6 +94,15 @@ Copter Lorenz Meier <lorenz@px4.io> Hexarotor + + motor1 + motor2 + motor3 + motor4 + motor5 + motor6 + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX3 channel @@ -70,12 +110,15 @@ Copter Lorenz Meier <lorenz@px4.io> Hexarotor Coaxial - front right top, CW - front right bottom, CCW - back top, CW - back bottom, CCW - front left top, CW - front left bottom, CCW + front right top, CW + front right bottom, CCW + back top, CW + back bottom, CCW + front left top, CW + front left bottom, CCW + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX3 channel @@ -83,11 +126,48 @@ Copter Lorenz Meier <lorenz@px4.io> Hexarotor x + motor 1 + motor 2 + motor 3 + motor 4 + motor 5 + motor 6 + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX3 channel Copter Hyon Lim <lim@uvify.com> Hexarotor x + motor 1 + motor 2 + motor 3 + motor 4 + motor 5 + motor 6 + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + + + Copter + Silvan Fuhrer + Hexarotor x + + + + + Copter + Simon Wilks <simon@uaventure.com> + Octo Coax Wide + motor 1 + motor 2 + motor 3 + motor 4 + motor 5 + motor 6 + motor 7 + motor 8 @@ -95,6 +175,17 @@ Copter Lorenz Meier <lorenz@px4.io> Octorotor + + motor 1 + motor 2 + motor 3 + motor 4 + motor 5 + motor 6 + motor 7 + motor 8 + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX3 channel @@ -102,14 +193,14 @@ Copter Lorenz Meier <lorenz@px4.io> Octorotor Coaxial - motor 1 - motor 2 - motor 3 - motor 4 - motor 5 - motor 6 - motor 7 - motor 8 + motor 1 + motor 2 + motor 3 + motor 4 + motor 5 + motor 6 + motor 7 + motor 8 @@ -117,6 +208,17 @@ Copter Lorenz Meier <lorenz@px4.io> Octorotor x + motor 1 + motor 2 + motor 3 + motor 4 + motor 5 + motor 6 + motor 7 + motor 8 + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX3 channel @@ -124,6 +226,16 @@ Copter Lorenz Meier <lorenz@px4.io> Quadrotor + + motor 1 + motor 2 + motor 3 + motor 4 + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX3 channel + feed-through of RC FLAPS channel @@ -131,11 +243,95 @@ Copter Blankered Quadrotor H + motor 1 + motor 2 + motor 3 + motor 4 + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel Copter Beat Kueng <beat-kueng@gmx.net> Quadrotor H + motor 1 + motor 2 + motor 3 + motor 4 + + + + + Copter + Lorenz Meier <lorenz@px4.io> + Quadrotor Wide + motor 1 + motor 2 + motor 3 + motor 4 + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX3 channel + feed-through of RC FLAPS channel + + + Copter + Lorenz Meier <lorenz@px4.io> + Quadrotor Wide + motor 1 + motor 2 + motor 3 + motor 4 + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX3 channel + feed-through of RC FLAPS channel + + + Copter + Lorenz Meier <lorenz@px4.io> + Quadrotor Wide + motor 1 + motor 2 + motor 3 + motor 4 + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX3 channel + feed-through of RC FLAPS channel + + + Copter + Simon Wilks <simon@uaventure.com> + Quadrotor Wide + motor 1 + motor 2 + motor 3 + motor 4 + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX3 channel + feed-through of RC FLAPS channel + + + + + Copter + Lorenz Meier <lorenz@px4.io> + Quadrotor asymmetric + https://docs.px4.io/master/en/frames_multicopter/spedix_s250_pixracer.html + motor1 (front right: CCW) + motor2 (back left: CCW) + motor3 (front left: CW) + motor4 (back right: CW) + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel @@ -143,6 +339,36 @@ Copter Lorenz Meier <lorenz@px4.io> Quadrotor x + motor 1 + motor 2 + motor 3 + motor 4 + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX3 channel + feed-through of RC FLAPS channel + + + Copter + James Goppert <james.goppert@gmail.com> + Quadrotor x + + + Copter + Lorenz Meier <lorenz@px4.io> + Quadrotor x + + + Copter + Lorenz Meier <lorenz@px4.io> + Quadrotor x + + + Copter + Lorenz Meier <lorenz@px4.io> + Quadrotor x Copter @@ -154,22 +380,36 @@ Lorenz Meier <lorenz@px4.io> Quadrotor x - + Copter Quadrotor x + motor 1 + motor 2 + motor 3 + motor 4 Copter Iain Galloway <iain.galloway@nxp.com> Quadrotor x + motor 1 + motor 2 + motor 3 + motor 4 - + Copter - Farhang Naderi <farhang.nba@gmail.com> + Silvan Fuhrer Quadrotor x - + Copter + Andreas Antener <andreas@uaventure.com> + Quadrotor x + + + Copter + Lorenz Meier <lorenz@px4.io> Quadrotor x @@ -181,27 +421,63 @@ Copter Beat Kueng <beat-kueng@gmx.net> Quadrotor x - https://docs.px4.io/main/en/frames_multicopter/holybro_qav250_pixhawk4_mini.html + https://docs.px4.io/master/en/frames_multicopter/holybro_qav250_pixhawk4_mini.html Copter Beat Kueng <beat@px4.io> Quadrotor x + + Copter + James Goppert <james.goppert@gmail.com> + Quadrotor x + Copter Quadrotor x + motor 1 + motor 2 + motor 3 + motor 4 Copter Hyon Lim <lim@uvify.com> Quadrotor x + motor 1 + motor 2 + motor 3 + motor 4 + + + Copter + Hyon Lim <lim@uvify.com> + Quadrotor x + motor 1 + motor 2 + motor 3 + motor 4 Copter Hyon Lim <lim@uvify.com> Quadrotor x + motor 1 + motor 2 + motor 3 + motor 4 + + + Copter + Anton Matosov <anton.matosov@gmail.com> + Quadrotor x + + + Copter + Henry Zhang <zhanghui629@gmail.com> + Quadrotor x Copter @@ -219,7 +495,7 @@ Quadrotor x - + Copter Lorenz Meier <lorenz@px4.io> @@ -231,20 +507,158 @@ Simulation - - + + Copter + Ricardo Marques <marques.ricardo17@gmail.com> + Tilt-Quad + http://www.alivaero.com/the-project.html + motor 1 + motor 2 + motor 3 + motor 4 + Outer servo motor for rotor 2 arm + Outer servo motor for rotor 4 arm + Inner servo motor for rotor 2 arm + Inner servo motor for rotor 4 arm + + + + + Copter + Trent Lukaczyk <aerialhedgehog@gmail.com> Tricopter Y+ - motor 1 - motor 2 - motor 3 - yaw servo + motor 1 + motor 2 + motor 3 + yaw servo + + + + + Copter + Trent Lukaczyk <aerialhedgehog@gmail.com> + Tricopter Y- + motor 1 + motor 2 + motor 3 + yaw servo - + Plane + Flying Wing + left aileron + right aileron + throttle + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX3 channel + + + Plane + Simon Wilks <simon@uaventure.com> + Flying Wing + left aileron + right aileron + throttle + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX3 channel + + + Plane + Simon Wilks <simon@uaventure.com> + Flying Wing + https://docs.px4.io/master/en/frames_plane/wing_wing_z84.html + left aileron + right aileron + throttle + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX3 channel + + + Plane + Julian Oes <julian@px4.io> + Flying Wing + left aileron + right aileron + throttle + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX3 channel + + + Plane + Lorenz Meier <lorenz@px4.io> + Flying Wing + https://docs.px4.io/master/en/frames_plane/wing_wing_z84.html + left aileron + right aileron + throttle + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX3 channel + + + Plane + Simon Wilks <simon@uaventure.com> + Flying Wing + right aileron + left aileron + throttle + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX3 channel + + + Plane + Simon Wilks <simon@uaventure.com> + Flying Wing + left aileron + right aileron + throttle + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX3 channel + + + Plane + Simon Wilks <simon@uaventure.com> + Flying Wing + http://www.sparkletech.hk/ + left aileron + right aileron + throttle + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX3 channel + + + Plane + Jan Liphardt <JTLiphardt@gmail.com> + Flying Wing + + left aileron + right aileron + throttle + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX3 channel + + + Plane + Lorenz Meier <lorenz@px4.io> + Flying Wing + left aileron + right aileron + throttle + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX3 channel @@ -252,17 +666,49 @@ Plane Andreas Antener <andreas@uaventure.com> Plane A-Tail - throttle - aileron right - aileron left - v-tail right - v-tail left - wheel - flaps right - flaps left + aileron right + aileron left + v-tail right + v-tail left + throttle + wheel + flaps right + flaps left + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX3 channel - + + + Plane + Friedrich Beckmann <friedrich.beckmann@hs-augsburg.de> + Plane V-Tail + aileron right + aileron left + v-tail right + v-tail left + throttle + wheel + flaps right + flaps left + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX3 channel + + + + + Plane + Lorenz Meier <lorenz@px4.io> + Simulation + aileron + elevator + rudder + throttle + flaps + gear + Plane Romain Chiappinelli <romain.chiap@gmail.com> @@ -270,30 +716,59 @@ - + Plane + Lorenz Meier <lorenz@px4.io> Standard Plane + aileron + elevator + throttle + rudder + flaps + gear + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX3 channel + + + Plane + Andreas Antener <andreas@uaventure.com> + Standard Plane + aileron + aileron + elevator + rudder + throttle + wheel + flaps + feed-through of RC AUX1 channel + feed-through of RC AUX2 channel + feed-through of RC AUX3 channel - + Rover Rover - throttle - steering + steering + throttle - + Rover + Timothy Scott Rover https://www.aionrobotics.com/r1 + Speed of left wheels + Speed of right wheels Rover Katrin Moritz Rover - Speed of left wheels - Steering servo + Steering servo + Speed of left wheels + Speed of right wheels @@ -313,25 +788,14 @@ Underwater Robot Thies Lennart Alff <thies.lennart.alff@tuhh.de> Vectored 6 DOF UUV - motor 1 CCW, bow starboard horizontal, , propeller CCW - motor 2 CCW, bow port horizontal, propeller CCW - motor 3 CCW, stern starboard horizontal, propeller CW - motor 4 CCW, stern port horizontal, propeller CW - motor 5 CCW, bow starboard vertical, propeller CCW - motor 6 CCW, bow port vertical, propeller CW - motor 7 CCW, stern starboard vertical, propeller CW - motor 8 CCW, stern port vertical, propeller CCW - - - - - VTOL - Romain Chiappinelli <romain.chiap@gmail.com> - Simulation - motor right - motor left - elevon right - elevon left + motor 1 CCW, bow starboard horizontal, , propeller CCW + motor 2 CCW, bow port horizontal, propeller CCW + motor 3 CCW, stern starboard horizontal, propeller CW + motor 4 CCW, stern port horizontal, propeller CW + motor 5 CCW, bow starboard vertical, propeller CCW + motor 6 CCW, bow port vertical, propeller CW + motor 7 CCW, stern starboard vertical, propeller CW + motor 8 CCW, stern port vertical, propeller CCW @@ -340,52 +804,197 @@ Roman Bapst <roman@auterion.com> Standard VTOL - + VTOL + + Standard VTOL + motor 1 + motor 2 + motor 3 + motor 4 + Aileron 1 + Aileron 2 + Elevator + Rudder + Throttle + + + VTOL + Simon Wilks <simon@uaventure.com> + Standard VTOL + motor 1 + motor 2 + motor 3 + motor 4 + Aileron 1 + Aileron 2 + Elevator + Rudder + Throttle + + + VTOL + Simon Wilks <simon@uaventure.com> + Standard VTOL + motor 1 + motor 2 + motor 3 + motor 4 + Right elevon + Left elevon + Motor + + + VTOL + Sander Smeets <sander@droneslab.com> + Standard VTOL + + + VTOL + Sander Smeets <sander@droneslab.com> + Standard VTOL + + + VTOL + Andreas Antener <andreas@uaventure.com> Standard VTOL VTOL Sander Smeets <sander@droneslab.com> Standard VTOL - motor 1 - motor 2 - motor 3 - motor 4 - Right elevon - Left elevon - Pusher motor - Pusher reverse channel + motor 1 + motor 2 + motor 3 + motor 4 + Right elevon + Left elevon + Pusher motor + Pusher reverse channel VTOL Silvan Fuhrer <silvan@auterion.com> Standard VTOL - motor 1 - motor 2 - motor 3 - motor 4 - Pusher motor - Ailerons - A-tail left - A-tail right + Ailerons + A-tail left + Pusher motor + A-tail right + motor 1 + motor 2 + motor 3 + motor 4 - - + + VTOL - VTOL Tailsitter + Roman Bapst <roman@px4.io> + VTOL Duo Tailsitter + motor right + motor left + elevon right + elevon left + + + VTOL + Roman Bapst <roman@px4.io> + VTOL Duo Tailsitter + motor right + motor left + elevon right + elevon left + + + + + VTOL + VTOL Octoplane + motor 1 + motor 2 + motor 3 + motor 4 + motor 5 + motor 6 + motor 7 + motor 8 + Aileron 1 + Aileron 2 + Elevator + Rudder + Throttle + + + + + VTOL + Roman Bapst <roman@px4.io> + VTOL Quad Tailsitter + + + VTOL + Roman Bapst <roman@px4.io> + VTOL Quad Tailsitter + motor 1 + motor 2 + motor 4 + motor 5 + elevon left + elevon right + canard surface + rudder + + VTOL + Roman Bapst <roman@uaventure.com> + VTOL Tiltrotor + Front right motor bottom + Front right motor top + Back motor bottom + Back motor top + Front left motor bottom + Front left motor top + Tilt servo + Elevon 1 + Elevon 2 + Gear + + + VTOL + Samay Siga <samay_s@icloud.com> + VTOL Tiltrotor + + + VTOL + Andreas Antener <andreas@uaventure.com> + VTOL Tiltrotor + Motor right + Motor left + Motor back + empty + Tilt servo right + Tilt servo left + Elevon right + Elevon left + VTOL VTOL Tiltrotor - - - VTOL - VTOL Tiltrotor + motor 1 + motor 2 + motor 3 + motor 4 + Motor tilt front left + Motor tilt front right + Motor tilt rear left + Motor tilt rear right + Aileron left + Aileron right + Elevator + Rudder diff --git a/src/AutoPilotPlugins/PX4/CMakeLists.txt b/src/AutoPilotPlugins/PX4/CMakeLists.txt index c532b7b..9b012a5 100644 --- a/src/AutoPilotPlugins/PX4/CMakeLists.txt +++ b/src/AutoPilotPlugins/PX4/CMakeLists.txt @@ -8,6 +8,7 @@ add_custom_target(PX4AutoPilotPluginQml FlightModesComponentSummary.qml PowerComponent.qml PowerComponentSummary.qml + PX4AdvancedFlightModes.qml PX4FlightModes.qml PX4RadioComponentSummary.qml PX4SimpleFlightModes.qml diff --git a/src/AutoPilotPlugins/PX4/FlightModesComponent.cc b/src/AutoPilotPlugins/PX4/FlightModesComponent.cc index 5d226b0..5af70c6 100644 --- a/src/AutoPilotPlugins/PX4/FlightModesComponent.cc +++ b/src/AutoPilotPlugins/PX4/FlightModesComponent.cc @@ -51,7 +51,8 @@ bool FlightModesComponent::setupComplete(void) const return true; } - if (_vehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, "RC_MAP_FLTMODE") && _vehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, "RC_MAP_FLTMODE")->rawValue().toInt() != 0) { + if (_vehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, "RC_MAP_MODE_SW")->rawValue().toInt() != 0 || + (_vehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, "RC_MAP_FLTMODE") && _vehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, "RC_MAP_FLTMODE")->rawValue().toInt() != 0)) { return true; } diff --git a/src/AutoPilotPlugins/PX4/FlightModesComponentSummary.qml b/src/AutoPilotPlugins/PX4/FlightModesComponentSummary.qml index 3a8be31..be4223a 100644 --- a/src/AutoPilotPlugins/PX4/FlightModesComponentSummary.qml +++ b/src/AutoPilotPlugins/PX4/FlightModesComponentSummary.qml @@ -14,19 +14,53 @@ Item { property Fact _nullFact property Fact _rcMapFltmode: controller.parameterExists(-1, "RC_MAP_FLTMODE") ? controller.getParameterFact(-1, "RC_MAP_FLTMODE") : _nullFact + property Fact _rcMapModeSw: controller.getParameterFact(-1, "RC_MAP_MODE_SW") + property bool _simpleMode: _rcMapFltmode.value > 0 || _rcMapModeSw.value === 0 - Column { - anchors.fill: parent - VehicleSummaryRow { - labelText: qsTr("Mode switch") - valueText: _rcMapFltmode.value === 0 ? qsTr("Setup required") : _rcMapFltmode.enumStringValue - } - Repeater { - model: 6 - VehicleSummaryRow { - labelText: qsTr("Flight Mode %1 ").arg(index + 1) - valueText: controller.getParameterFact(-1, "COM_FLTMODE" + (index + 1)).enumStringValue - } - } + Loader { + anchors.fill: parent + sourceComponent: _simpleMode ? simple : advanced + } + + Component { + id: simple + Column { + VehicleSummaryRow { + labelText: qsTr("Mode switch") + valueText: _rcMapFltmode.value === 0 ? qsTr("Setup required") : _rcMapFltmode.enumStringValue + } + Repeater { + model: 6 + VehicleSummaryRow { + labelText: qsTr("Flight Mode %1 ").arg(index + 1) + valueText: controller.getParameterFact(-1, "COM_FLTMODE" + (index + 1)).enumStringValue + } + } + } + } + + Component { + id: advanced + Column { + property Fact posCtlSwFact: controller.getParameterFact(-1, "RC_MAP_POSCTL_SW") + property Fact loiterSwFact: controller.getParameterFact(-1, "RC_MAP_LOITER_SW") + property Fact returnSwFact: controller.getParameterFact(-1, "RC_MAP_RETURN_SW") + VehicleSummaryRow { + labelText: qsTr("Mode switch") + valueText: _rcMapModeSw.value === 0 ? qsTr("Setup required") : _rcMapModeSw.valueString + } + VehicleSummaryRow { + labelText: qsTr("Position Ctl switch") + valueText: posCtlSwFact.value === 0 ? qsTr("Disabled") : posCtlSwFact.valueString + } + VehicleSummaryRow { + labelText: qsTr("Loiter switch") + valueText: loiterSwFact.value === 0 ? qsTr("Disabled") : loiterSwFact.valueString + } + VehicleSummaryRow { + labelText: qsTr("Return switch") + valueText: returnSwFact.value === 0 ? qsTr("Disabled") : returnSwFact.valueString + } + } } } diff --git a/src/AutoPilotPlugins/PX4/PX4AdvancedFlightModes.qml b/src/AutoPilotPlugins/PX4/PX4AdvancedFlightModes.qml new file mode 100644 index 0000000..38dd2b9 --- /dev/null +++ b/src/AutoPilotPlugins/PX4/PX4AdvancedFlightModes.qml @@ -0,0 +1,384 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + + +import QtQuick 2.3 +import QtQuick.Controls 1.2 +import QtQuick.Controls.Styles 1.4 +import QtQuick.Dialogs 1.2 +import QtQuick.Layouts 1.2 + +import QGroundControl.FactSystem 1.0 +import QGroundControl.FactControls 1.0 +import QGroundControl.Palette 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.Controllers 1.0 +import QGroundControl.ScreenTools 1.0 + +/// PX4 Advanced Flight Mode configuration +Item { + id: root + + readonly property bool _shortText: ScreenTools.isTinyScreen + + // User visible strings + + readonly property string title: qsTr("FLIGHT MODES") + + property string topHelpText: ScreenTools.isTinyScreen ? + qsTr("Assign Flight Modes to radio control channels and adjust the thresholds for triggering them.") : + (qsTr("Assign Flight Modes to radio control channels and adjust the thresholds for triggering them. ") + + qsTr("You can assign multiple flight modes to a single channel. ") + + qsTr("Turn your radio control on to test switch settings. ") + + qsTr("The following channels: ") + controller.reservedChannels + + qsTr(" are not available for Flight Modes since they are already in use for other functions.")) + + readonly property string fwManualModeName: qsTr("Manual/Main") + readonly property string mrManualModeName: qsTr("Stabilized/Main") + readonly property string fwManualModeDescription: qsTr("The pilot has full control of the aircraft, no assistance is provided. ") + + qsTr("The Main mode switch must always be assigned to a channel in order to fly") + readonly property string mrManualModeDescription: qsTr("The pilot has full control of the aircraft, only attitude is stabilized. ") + + qsTr("The Main mode switch must always be assigned to a channel in order to fly") + + readonly property string assistModeName: qsTr("Assist") + readonly property string assistModeDescription: qsTr("If Position Control is placed on a separate channel from the Main mode channel, an additional 'Assist' mode is added to the Main switch. ") + + qsTr("In order for the Attitude Control/Position Control switch to be active, the Main switch must be in Assist mode.") + + readonly property string autoModeName: qsTr("Auto") + readonly property string autoModeDescription: qsTr("If Loiter is placed on a separate channel from the Main mode channel, an additional 'Auto' mode is added to the Main switch. ") + + qsTr("In order for the Mission/Loiter switch to be active, the Main switch must be in Auto mode.") + + readonly property string fwAcroModeName: qsTr("Stabilized") + readonly property string mrAcroModeName: qsTr("Acro") + readonly property string fwAcroModeDescription: qsTr("Roll/pitch angles and rudder deflection are controlled. ") + readonly property string mrAcroModeDescription: qsTr("The angular rates are controlled, but not the attitude. ") + + readonly property string altCtlModeName: qsTr("Altitude") + readonly property string fwAltCtlModeDescription: qsTr("Roll stick controls banking, pitch stick altitude ") + + qsTr("Throttle stick controls speed. ") + + qsTr("With no stick inputs the plane holds heading, but drifts off in wind. ") + readonly property string mrAltCtlModeDescription: qsTr("Same as Stablized mode except that Throttle controls climb/sink rate. Centered Throttle holds altitude steady. ") + + readonly property string posCtlModeName: qsTr("Position Control") + readonly property string fwPosCtlModeDescription: qsTr("Roll stick controls banking, pitch stick controls altitude. ") + + qsTr("Throttle stick controls speed.") + + qsTr("With no stick inputs the plane flies a straight line, even in wind. ") + readonly property string mrPosCtlModeDescription: qsTr("Roll and Pitch sticks control sideways and forward speed ") + + qsTr("Throttle stick controls climb / sink rade. ") + + readonly property string missionModeName: qsTr("Mission") + readonly property string missionModeDescription: qsTr("The aircraft obeys the programmed mission sent by QGroundControl. ") + + readonly property string loiterModeName: qsTr("Hold") + readonly property string fwLoiterModeDescription: qsTr("The aircraft flies in a circle around the current position at the current altitude. ") + readonly property string mrLoiterModeDescription: qsTr("The multirotor hovers at the current position and altitude. ") + + readonly property string returnModeName: qsTr("Return") + readonly property string returnModeDescription: qsTr("The vehicle returns to the launch position, loiters and then lands. ") + + readonly property string offboardModeName: qsTr("Offboard") + readonly property string offboardModeDescription: qsTr("All flight control aspects are controlled by an offboard system.") + + readonly property real modeSpacing: ScreenTools.defaultFontPixelHeight / 3 + + PX4AdvancedFlightModesController { + id: controller + onModeRowsChanged: recalcModePositions() + } + + Timer { + interval: 200 + running: true + + onTriggered: { + recalcModePositions() + } + } + + function recalcModePositions() { + var spacing = ScreenTools.defaultFontPixelHeight / 2 + var nextY = manualMode.y + manualMode.height + spacing + + for (var index = 0; index < 9; index++) { + if (controller.assistModeRow == index) { + if (controller.assistModeVisible) { + assistMode.y = nextY + assistMode.z = 9 - index + nextY += assistMode.height + spacing + } + } else if (controller.autoModeRow == index) { + if (controller.autoModeVisible) { + autoMode.y = nextY + autoMode.z = 9 - index + nextY += autoMode.height + spacing + } + } else if (controller.acroModeRow == index) { + acroMode.y = nextY + acroMode.z = 9 - index + nextY += acroMode.height + spacing + } else if (controller.altCtlModeRow == index) { + altCtlMode.y = nextY + altCtlMode.z = 9 - index + nextY += altCtlMode.height + spacing + } else if (controller.posCtlModeRow == index) { + posCtlMode.y = nextY + posCtlMode.z = 9 - index + nextY += posCtlMode.height + spacing + } else if (controller.loiterModeRow == index) { + loiterMode.y = nextY + loiterMode.z = 9 - index + nextY += loiterMode.height + spacing + } else if (controller.missionModeRow == index) { + missionMode.y = nextY + missionMode.z = 9 - index + nextY += missionMode.height + spacing + } else if (controller.returnModeRow == index) { + returnMode.y = nextY + returnMode.z = 9 - index + nextY += returnMode.height + spacing + } else if (controller.offboardModeRow == index) { + offboardMode.y = nextY + offboardMode.z = 9 - index + nextY += offboardMode.height + spacing + } + } + + scrollItem.height = nextY + } + + Component { + id: joystickEnabledDialogComponent + + QGCViewMessage { + message: qsTr("Flight Mode Config is disabled since you have a Joystick enabled.") + } + } + + ScrollView { + id: scroll + anchors.fill: parent + horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff + + Item { + id: scrollItem + width: scroll.viewport.width + + Item { + id: helpApplyRow + width: parent.width + height: Math.max(helpText.contentHeight, applyButton.y + applyButton.height) + + QGCLabel { + id: helpText + anchors.rightMargin: ScreenTools.defaultFontPixelWidth + anchors.left: parent.left + anchors.right: buttonColumn.left + text: topHelpText + font.pointSize: ScreenTools.defaultFontPointSize + wrapMode: Text.WordWrap + } + + Column { + id: buttonColumn + anchors.rightMargin: ScreenTools.defaultFontPixelWidth + anchors.right: parent.right + spacing: ScreenTools.defaultFontPixelHeight / 4 + + QGCButton { + text: qsTr("Use Single Channel Mode Selection") + visible: controller.parameterExists(-1, "RC_MAP_FLTMODE") + onClicked: { + controller.getParameterFact(-1, "RC_MAP_MODE_SW").value = 0 + controller.getParameterFact(-1, "RC_MAP_FLTMODE").value = 5 + } + } + + QGCButton { + id: applyButton + text: qsTr("Generate Thresholds") + onClicked: controller.generateThresholds() + } + } + } + + Item { + id: lastSpacer + anchors.top: helpApplyRow.bottom + height: ScreenTools.defaultFontPixelHeight + width: 10 + } + + ModeSwitchDisplay { + id: manualMode + anchors.top: lastSpacer.bottom + flightModeName: controller.fixedWing ? fwManualModeName : mrManualModeName + flightModeDescription: controller.fixedWing ? fwManualModeDescription : mrManualModeDescription + rcValue: controller.manualModeRcValue + modeChannelIndex: controller.manualModeChannelIndex + modeChannelEnabled: true + modeSelected: controller.manualModeSelected + thresholdValue: controller.manualModeThreshold + thresholdDragEnabled: false + + onModeChannelIndexSelected: controller.manualModeChannelIndex = index + } + + ModeSwitchDisplay { + id: assistMode + visible: controller.assistModeVisible + flightModeName: assistModeName + flightModeDescription: assistModeDescription + rcValue: controller.assistModeRcValue + modeChannelIndex: controller.assistModeChannelIndex + modeChannelEnabled: false + modeSelected: controller.assistModeSelected + thresholdValue: controller.assistModeThreshold + thresholdDragEnabled: true + + onThresholdValueChanged: controller.assistModeThreshold = thresholdValue + + Behavior on y { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 1000 } } + } + + ModeSwitchDisplay { + id: autoMode + visible: controller.autoModeVisible + flightModeName: autoModeName + flightModeDescription: autoModeDescription + rcValue: controller.autoModeRcValue + modeChannelIndex: controller.autoModeChannelIndex + modeChannelEnabled: false + modeSelected: controller.autoModeSelected + thresholdValue: controller.autoModeThreshold + thresholdDragEnabled: true + + onThresholdValueChanged: controller.autoModeThreshold = thresholdValue + + Behavior on y { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 1000 } } + } + + ModeSwitchDisplay { + id: acroMode + flightModeName: controller.fixedWing ? fwAcroModeName : mrAcroModeName + flightModeDescription: controller.fixedWing ? fwAcroModeDescription : mrAcroModeDescription + rcValue: controller.acroModeRcValue + modeChannelIndex: controller.acroModeChannelIndex + modeChannelEnabled: true + modeSelected: controller.acroModeSelected + thresholdValue: controller.acroModeThreshold + thresholdDragEnabled: true + + onModeChannelIndexSelected: controller.acroModeChannelIndex = index + onThresholdValueChanged: controller.acroModeThreshold = thresholdValue + + Behavior on y { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 1000 } } + } + + ModeSwitchDisplay { + id: altCtlMode + flightModeName: altCtlModeName + flightModeDescription: controller.fixedWing ? fwAltCtlModeDescription : mrAltCtlModeDescription + rcValue: controller.altCtlModeRcValue + modeChannelIndex: controller.altCtlModeChannelIndex + modeChannelEnabled: false + modeSelected: controller.altCtlModeSelected + thresholdValue: controller.altCtlModeThreshold + thresholdDragEnabled: !controller.assistModeVisible + + onThresholdValueChanged: controller.altCtlModeThreshold = thresholdValue + + Behavior on y { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 1000 } } + } + + ModeSwitchDisplay { + id: posCtlMode + flightModeName: posCtlModeName + flightModeDescription: controller.fixedWing ? fwPosCtlModeDescription : mrPosCtlModeDescription + rcValue: controller.posCtlModeRcValue + modeChannelIndex: controller.posCtlModeChannelIndex + modeChannelEnabled: true + modeSelected: controller.posCtlModeSelected + thresholdValue: controller.posCtlModeThreshold + thresholdDragEnabled: true + + onModeChannelIndexSelected: controller.posCtlModeChannelIndex = index + onThresholdValueChanged: controller.posCtlModeThreshold = thresholdValue + + Behavior on y { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 1000 } } + } + + ModeSwitchDisplay { + id: missionMode + flightModeName: missionModeName + flightModeDescription: missionModeDescription + rcValue: controller.missionModeRcValue + modeChannelIndex: controller.missionModeChannelIndex + modeChannelEnabled: false + modeSelected: controller.missionModeSelected + thresholdValue: controller.missionModeThreshold + thresholdDragEnabled: !controller.autoModeVisible + + onThresholdValueChanged: controller.missionModeThreshold = thresholdValue + + Behavior on y { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 1000 } } + } + + ModeSwitchDisplay { + id: loiterMode + flightModeName: loiterModeName + flightModeDescription: controller.fixedWing ? fwLoiterModeDescription : mrLoiterModeDescription + rcValue: controller.loiterModeRcValue + modeChannelIndex: controller.loiterModeChannelIndex + modeChannelEnabled: true + modeSelected: controller.loiterModeSelected + thresholdValue: controller.loiterModeThreshold + thresholdDragEnabled: true + + onModeChannelIndexSelected: controller.loiterModeChannelIndex = index + onThresholdValueChanged: controller.loiterModeThreshold = thresholdValue + + Behavior on y { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 1000 } } + } + + ModeSwitchDisplay { + id: returnMode + flightModeName: returnModeName + flightModeDescription: returnModeDescription + rcValue: controller.returnModeRcValue + modeChannelIndex: controller.returnModeChannelIndex + modeChannelEnabled: true + modeSelected: controller.returnModeSelected + thresholdValue: controller.returnModeThreshold + thresholdDragEnabled: true + + onModeChannelIndexSelected: controller.returnModeChannelIndex = index + onThresholdValueChanged: controller.returnModeThreshold = thresholdValue + + Behavior on y { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 1000 } } + } + + ModeSwitchDisplay { + id: offboardMode + flightModeName: offboardModeName + flightModeDescription: offboardModeDescription + rcValue: controller.offboardModeRcValue + modeChannelIndex: controller.offboardModeChannelIndex + modeChannelEnabled: true + modeSelected: controller.offboardModeSelected + thresholdValue: controller.offboardModeThreshold + thresholdDragEnabled: true + + onModeChannelIndexSelected: controller.offboardModeChannelIndex = index + onThresholdValueChanged: controller.offboardModeThreshold = thresholdValue + + Behavior on y { PropertyAnimation { easing.type: Easing.InOutQuad; duration: 1000 } } + } + } // Item + } // Scroll View +} // Item diff --git a/src/AutoPilotPlugins/PX4/PX4AdvancedFlightModesController.cc b/src/AutoPilotPlugins/PX4/PX4AdvancedFlightModesController.cc new file mode 100644 index 0000000..20c461c --- /dev/null +++ b/src/AutoPilotPlugins/PX4/PX4AdvancedFlightModesController.cc @@ -0,0 +1,800 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + + +/// @file +/// @author Don Gagne + +#include "PX4AdvancedFlightModesController.h" +#include "QGCMAVLink.h" + +#include +#include + +PX4AdvancedFlightModesController::PX4AdvancedFlightModesController(void) : + _validConfiguration(false), + _channelCount(18), + _manualModeSelected(false), + _assistModeSelected(false), + _autoModeSelected(false), + _acroModeSelected(false), + _altCtlModeSelected(false), + _posCtlModeSelected(false), + _missionModeSelected(false), + _loiterModeSelected(false), + _returnModeSelected(false), + _offboardModeSelected(false) +{ + QStringList usedParams = QStringList({ + "RC_MAP_THROTTLE", "RC_MAP_YAW", "RC_MAP_PITCH", "RC_MAP_ROLL", "RC_MAP_FLAPS", "RC_MAP_AUX1", "RC_MAP_AUX2", + "RC_MAP_MODE_SW", "RC_MAP_RETURN_SW", "RC_MAP_LOITER_SW", "RC_MAP_POSCTL_SW", "RC_MAP_OFFB_SW", "RC_MAP_ACRO_SW"}); + + if (!_allParametersExists(FactSystem::defaultComponentId, usedParams)) { + return; + } + + _init(); + _validateConfiguration(); + + connect(_vehicle, &Vehicle::rcChannelsChanged, this, &PX4AdvancedFlightModesController::_rcChannelsChanged); +} + +void PX4AdvancedFlightModesController::_init(void) +{ + // FIXME: What about VTOL? That confuses the whole Flight Mode naming scheme + _fixedWing = _vehicle->fixedWing(); + + // We need to know min and max for channel in order to calculate percentage range + for (int channel=0; channel<_chanMax; channel++) { + QString rcMinParam, rcMaxParam, rcRevParam; + + rcMinParam = QString("RC%1_MIN").arg(channel+1); + rcMaxParam = QString("RC%1_MAX").arg(channel+1); + rcRevParam = QString("RC%1_REV").arg(channel+1); + + _rgRCMin[channel] = getParameterFact(FactSystem::defaultComponentId, rcMinParam)->rawValue().toInt(); + _rgRCMax[channel] = getParameterFact(FactSystem::defaultComponentId, rcMaxParam)->rawValue().toInt(); + + float floatReversed = getParameterFact(-1, rcRevParam)->rawValue().toFloat(); + _rgRCReversed[channel] = floatReversed == -1.0f; + + _rcValues[channel] = 0.0; + } + + // RC_CHAN_CNT parameter is set by Radio Cal to specify the number of radio channels. + if (parameterExists(FactSystem::defaultComponentId, "RC_CHAN_CNT")) { + _channelCount = getParameterFact(FactSystem::defaultComponentId, "RC_CHAN_CNT")->rawValue().toInt(); + } else { + _channelCount =_chanMax; + } + if (_channelCount <= 0 || _channelCount > _chanMax) { + // Parameter exists, but has not yet been set or is invalid. Use default + _channelCount = _chanMax; + } + + int modeChannel = getParameterFact(-1, "RC_MAP_MODE_SW")->rawValue().toInt(); + int posCtlChannel = getParameterFact(-1, "RC_MAP_POSCTL_SW")->rawValue().toInt(); + int loiterChannel = getParameterFact(-1, "RC_MAP_LOITER_SW")->rawValue().toInt(); + + if (posCtlChannel == 0) { + // PosCtl disabled so AltCtl must move back to main Mode switch + _assistModeVisible = false; + } else { + // Assist mode is visible if AltCtl/PosCtl are on separate channel from main Mode switch + _assistModeVisible = posCtlChannel != modeChannel; + } + + if (loiterChannel == 0) { + // Loiter disabled so Mission must move back to main Mode switch + _autoModeVisible = false; + } else { + // Auto mode is visible if Mission/Loiter are on separate channel from main Mode switch + _autoModeVisible = loiterChannel != modeChannel; + } + + // Setup the channel combobox model + QVector usedChannels; + + for (const char* const&attitudeParam : {"RC_MAP_THROTTLE", "RC_MAP_YAW", "RC_MAP_PITCH", "RC_MAP_ROLL", "RC_MAP_FLAPS", "RC_MAP_AUX1", "RC_MAP_AUX2"}) { + int channel = getParameterFact(-1, attitudeParam)->rawValue().toInt(); + if (channel != 0) { + usedChannels << channel; + } + } + + _channelListModel << "Disabled"; + _channelListModelChannel << 0; + for (int channel=1; channel<=_channelCount; channel++) { + if (!usedChannels.contains(channel)) { + _channelListModel << QString("Channel %1").arg(channel); + _channelListModelChannel << channel; + } + } + + // Setup reserved channels string for ui + + bool first = true; + foreach (int usedChannel, usedChannels) { + if (!first) { + _reservedChannels += ", "; + } + _reservedChannels += QString("%1").arg(usedChannel); + first = false; + } + + _recalcModeRows(); +} + +/// This will look for parameter settings which would cause the config to not run correctly. +/// It will set _validConfiguration and _configurationErrors as needed. +void PX4AdvancedFlightModesController::_validateConfiguration(void) +{ + _validConfiguration = true; + + // Make sure switches are valid and within channel range + + const QStringList switchParams = {"RC_MAP_MODE_SW", "RC_MAP_ACRO_SW", "RC_MAP_POSCTL_SW", "RC_MAP_LOITER_SW", "RC_MAP_RETURN_SW", "RC_MAP_OFFB_SW"}; + QList switchMappings; + + for(int i=0, end = switchParams.count(); i < end; i++) { + int map = getParameterFact(FactSystem::defaultComponentId, switchParams[i])->rawValue().toInt(); + switchMappings << map; + + if (map < 0 || map > _channelCount) { + _validConfiguration = false; + _configurationErrors += tr("%1 is set to %2. Mapping must between 0 and %3 (inclusive).\n").arg(switchParams[i]).arg(map).arg(_channelCount); + } + } + + // Make sure mode switches are not double-mapped + + const QStringList attitudeParams = {"RC_MAP_THROTTLE", "RC_MAP_YAW", "RC_MAP_PITCH", "RC_MAP_ROLL", "RC_MAP_FLAPS", "RC_MAP_AUX1", "RC_MAP_AUX2"}; + for (int i=0, end = attitudeParams.count(); i < end; i++) { + int map = getParameterFact(FactSystem::defaultComponentId, attitudeParams[i])->rawValue().toInt(); + if (map == 0) { + continue; + } + + for (int j=0; jrawValue().toFloat(); + if (threshold < 0.0f || threshold > 1.0f) { + _validConfiguration = false; + _configurationErrors += tr("%1 is set to %2. Threshold must between 0.0 and 1.0 (inclusive).\n").arg(thresholdParam).arg(threshold); + } + } +} + +/// Connected to Vehicle::rcChannelsChanged signal +void PX4AdvancedFlightModesController::_rcChannelsChanged(int channelCount, int pwmValues[Vehicle::cMaxRcChannels]) +{ + for (int channel=0; channel _rgRCMax[channel]) { + channelValue= _rgRCMax[channel]; + } + + float percentRange = (channelValue - _rgRCMin[channel]) / (float)(_rgRCMax[channel] - _rgRCMin[channel]); + if (_rgRCReversed[channel]) { + percentRange = 1.0 - percentRange; + } + + _rcValues[channel] = percentRange; + } + } + + _recalcModeSelections(); + + emit switchLiveRangeChanged(); +} + +double PX4AdvancedFlightModesController::_switchLiveRange(const QString& param) +{ + int channel = getParameterFact(-1, param)->rawValue().toInt(); + if (channel == 0) { + return 0.0; + } else { + return _rcValues[channel - 1]; + } +} + +double PX4AdvancedFlightModesController::manualModeRcValue(void) +{ + return _switchLiveRange("RC_MAP_MODE_SW"); +} + +double PX4AdvancedFlightModesController::assistModeRcValue(void) +{ + return manualModeRcValue(); +} + +double PX4AdvancedFlightModesController::autoModeRcValue(void) +{ + return manualModeRcValue(); +} + +double PX4AdvancedFlightModesController::acroModeRcValue(void) +{ + return _switchLiveRange("RC_MAP_ACRO_SW"); +} + +double PX4AdvancedFlightModesController::altCtlModeRcValue(void) +{ + int posCtlSwitchChannel = getParameterFact(-1, "RC_MAP_POSCTL_SW")->rawValue().toInt(); + + if (posCtlSwitchChannel == 0) { + return _switchLiveRange("RC_MAP_MODE_SW"); + } else { + return _switchLiveRange("RC_MAP_POSCTL_SW"); + } +} + +double PX4AdvancedFlightModesController::posCtlModeRcValue(void) +{ + return _switchLiveRange("RC_MAP_POSCTL_SW"); +} + +double PX4AdvancedFlightModesController::missionModeRcValue(void) +{ + int returnSwitchChannel = getParameterFact(-1, "RC_MAP_RETURN_SW")->rawValue().toInt(); + int loiterSwitchChannel = getParameterFact(-1, "RC_MAP_LOITER_SW")->rawValue().toInt(); + + const char* switchChannelParam = "RC_MAP_MODE_SW"; + + if (returnSwitchChannel == 0) { + if (loiterSwitchChannel != 0) { + switchChannelParam = "RC_MAP_LOITER_SW"; + } + } else { + if (loiterSwitchChannel == 0) { + switchChannelParam = "RC_MAP_RETURN_SW"; + } else { + switchChannelParam = "RC_MAP_LOITER_SW"; + } + } + + return _switchLiveRange(switchChannelParam); +} + +double PX4AdvancedFlightModesController::loiterModeRcValue(void) +{ + return _switchLiveRange("RC_MAP_LOITER_SW"); +} + +double PX4AdvancedFlightModesController::returnModeRcValue(void) +{ + return _switchLiveRange("RC_MAP_RETURN_SW"); +} + +double PX4AdvancedFlightModesController::offboardModeRcValue(void) +{ + return _switchLiveRange("RC_MAP_OFFB_SW"); +} + +void PX4AdvancedFlightModesController::_recalcModeSelections(void) +{ + _manualModeSelected = false; + _assistModeSelected = false; + _autoModeSelected = false; + _acroModeSelected = false; + _altCtlModeSelected = false; + _posCtlModeSelected = false; + _missionModeSelected = false; + _loiterModeSelected = false; + _returnModeSelected = false; + _offboardModeSelected = false; + + // Convert channels to 0-based, -1 signals not mapped + int modeSwitchChannel = getParameterFact(-1, "RC_MAP_MODE_SW")->rawValue().toInt() - 1; + int acroSwitchChannel = getParameterFact(-1, "RC_MAP_ACRO_SW")->rawValue().toInt() - 1; + int posCtlSwitchChannel = getParameterFact(-1, "RC_MAP_POSCTL_SW")->rawValue().toInt() - 1; + int loiterSwitchChannel = getParameterFact(-1, "RC_MAP_LOITER_SW")->rawValue().toInt() - 1; + int returnSwitchChannel = getParameterFact(-1, "RC_MAP_RETURN_SW")->rawValue().toInt() - 1; + int offboardSwitchChannel = getParameterFact(-1, "RC_MAP_OFFB_SW")->rawValue().toInt() - 1; + + double autoThreshold = getParameterFact(-1, "RC_AUTO_TH")->rawValue().toDouble(); + double assistThreshold = getParameterFact(-1, "RC_ASSIST_TH")->rawValue().toDouble(); + double acroThreshold = getParameterFact(-1, "RC_ACRO_TH")->rawValue().toDouble(); + double posCtlThreshold = getParameterFact(-1, "RC_POSCTL_TH")->rawValue().toDouble(); + double loiterThreshold = getParameterFact(-1, "RC_LOITER_TH")->rawValue().toDouble(); + double returnThreshold = getParameterFact(-1, "RC_RETURN_TH")->rawValue().toDouble(); + double offboardThreshold = getParameterFact(-1, "RC_OFFB_TH")->rawValue().toDouble(); + + if (modeSwitchChannel >= 0) { + if (offboardSwitchChannel >= 0 && _rcValues[offboardSwitchChannel] >= offboardThreshold) { + _offboardModeSelected = true; + } else if (returnSwitchChannel >= 0 && _rcValues[returnSwitchChannel] >= returnThreshold) { + _returnModeSelected = true; + } else { + if (_rcValues[modeSwitchChannel] >= autoThreshold) { + _autoModeSelected = true; + if (loiterSwitchChannel >= 0 && _rcValues[loiterSwitchChannel] >= loiterThreshold) { + _loiterModeSelected = true; + } else { + _missionModeSelected = true; + } + } else if (_rcValues[modeSwitchChannel] >= assistThreshold) { + _assistModeSelected = true; + if (posCtlSwitchChannel >= 0 && _rcValues[posCtlSwitchChannel] >= posCtlThreshold) { + _posCtlModeSelected = true; + } else { + _altCtlModeSelected = true; + } + } else if (acroSwitchChannel >= 0 && _rcValues[acroSwitchChannel] >= acroThreshold) { + _acroModeSelected = true; + } else { + _manualModeSelected = true; + } + } + } + + emit modesSelectedChanged(); +} + +void PX4AdvancedFlightModesController::_recalcModeRows(void) +{ + int modeSwitchChannel = getParameterFact(-1, "RC_MAP_MODE_SW")->rawValue().toInt(); + int acroSwitchChannel = getParameterFact(-1, "RC_MAP_ACRO_SW")->rawValue().toInt(); + int posCtlSwitchChannel = getParameterFact(-1, "RC_MAP_POSCTL_SW")->rawValue().toInt(); + int loiterSwitchChannel = getParameterFact(-1, "RC_MAP_LOITER_SW")->rawValue().toInt(); + int returnSwitchChannel = getParameterFact(-1, "RC_MAP_RETURN_SW")->rawValue().toInt(); + int offboardSwitchChannel = getParameterFact(-1, "RC_MAP_OFFB_SW")->rawValue().toInt(); + + if (modeSwitchChannel == 0) { + _acroModeRow = 0; + _assistModeRow = 1; + _autoModeRow = 2; + _altCtlModeRow = 3; + _posCtlModeRow = 4; + _loiterModeRow = 5; + _missionModeRow = 6; + _returnModeRow = 7; + _offboardModeRow = 8; + } else { + int row = 0; + + // First set is all switches on main mode channel + + if (acroSwitchChannel == modeSwitchChannel) { + _acroModeRow = row++; + } + _assistModeRow = row++; + if (posCtlSwitchChannel == modeSwitchChannel) { + _altCtlModeRow = row++; + _posCtlModeRow = row++; + } else if (posCtlSwitchChannel == 0) { + _altCtlModeRow = row++; + } + _autoModeRow = row++; + if (loiterSwitchChannel == modeSwitchChannel) { + _missionModeRow = row++; + _loiterModeRow = row++; + } else if (loiterSwitchChannel == 0) { + _missionModeRow = row++; + } + if (returnSwitchChannel == modeSwitchChannel) { + _returnModeRow = row++; + } + if (offboardSwitchChannel == modeSwitchChannel) { + _offboardModeRow = row++; + } + + // Now individual enabled switches not on main mode channel + + if (acroSwitchChannel != 0 && acroSwitchChannel != modeSwitchChannel) { + _acroModeRow = row++; + } + if (posCtlSwitchChannel != 0 && posCtlSwitchChannel != modeSwitchChannel) { + _altCtlModeRow = row++; + _posCtlModeRow = row++; + } + if (loiterSwitchChannel != 0 && loiterSwitchChannel != modeSwitchChannel) { + _missionModeRow = row++; + _loiterModeRow = row++; + } + if (returnSwitchChannel != 0 && returnSwitchChannel != modeSwitchChannel) { + _returnModeRow = row++; + } + if (offboardSwitchChannel != 0 && offboardSwitchChannel != modeSwitchChannel) { + _offboardModeRow = row++; + } + + // Now disabled switches + + if (acroSwitchChannel == 0) { + _acroModeRow = row++; + } + if (posCtlSwitchChannel == 0) { + _posCtlModeRow = row++; + } + if (loiterSwitchChannel == 0) { + _loiterModeRow = row++; + } + if (returnSwitchChannel == 0) { + _returnModeRow = row++; + } + if (offboardSwitchChannel == 0) { + _offboardModeRow = row++; + } + } + + emit modeRowsChanged(); +} + +double PX4AdvancedFlightModesController::manualModeThreshold(void) +{ + return 0.0; +} + +double PX4AdvancedFlightModesController::assistModeThreshold(void) +{ + return getParameterFact(-1, "RC_ASSIST_TH")->rawValue().toDouble(); +} + +double PX4AdvancedFlightModesController::autoModeThreshold(void) +{ + return getParameterFact(-1, "RC_AUTO_TH")->rawValue().toDouble(); +} + +double PX4AdvancedFlightModesController::acroModeThreshold(void) +{ + return getParameterFact(-1, "RC_ACRO_TH")->rawValue().toDouble(); +} + +double PX4AdvancedFlightModesController::altCtlModeThreshold(void) +{ + return _assistModeVisible ? 0.0 : getParameterFact(-1, "RC_ASSIST_TH")->rawValue().toDouble(); +} + +double PX4AdvancedFlightModesController::posCtlModeThreshold(void) +{ + return getParameterFact(-1, "RC_POSCTL_TH")->rawValue().toDouble(); +} + +double PX4AdvancedFlightModesController::missionModeThreshold(void) +{ + return _autoModeVisible ? 0.0 : getParameterFact(-1, "RC_AUTO_TH")->rawValue().toDouble(); +} + + +double PX4AdvancedFlightModesController::loiterModeThreshold(void) +{ + return getParameterFact(-1, "RC_LOITER_TH")->rawValue().toDouble(); +} + +double PX4AdvancedFlightModesController::returnModeThreshold(void) +{ + return getParameterFact(-1, "RC_RETURN_TH")->rawValue().toDouble(); +} + +double PX4AdvancedFlightModesController::offboardModeThreshold(void) +{ + return getParameterFact(-1, "RC_OFFB_TH")->rawValue().toDouble(); +} + +void PX4AdvancedFlightModesController::setAssistModeThreshold(double threshold) +{ + getParameterFact(-1, "RC_ASSIST_TH")->setRawValue(threshold); + _recalcModeSelections(); +} + +void PX4AdvancedFlightModesController::setAutoModeThreshold(double threshold) +{ + getParameterFact(-1, "RC_AUTO_TH")->setRawValue(threshold); + _recalcModeSelections(); +} + +void PX4AdvancedFlightModesController::setAcroModeThreshold(double threshold) +{ + getParameterFact(-1, "RC_ACRO_TH")->setRawValue(threshold); + _recalcModeSelections(); +} + +void PX4AdvancedFlightModesController::setAltCtlModeThreshold(double threshold) +{ + setAssistModeThreshold(threshold); +} + +void PX4AdvancedFlightModesController::setPosCtlModeThreshold(double threshold) +{ + getParameterFact(-1, "RC_POSCTL_TH")->setRawValue(threshold); + _recalcModeSelections(); +} + +void PX4AdvancedFlightModesController::setMissionModeThreshold(double threshold) +{ + setAutoModeThreshold(threshold); +} + +void PX4AdvancedFlightModesController::setLoiterModeThreshold(double threshold) +{ + getParameterFact(-1, "RC_LOITER_TH")->setRawValue(threshold); + _recalcModeSelections(); +} + +void PX4AdvancedFlightModesController::setReturnModeThreshold(double threshold) +{ + getParameterFact(-1, "RC_RETURN_TH")->setRawValue(threshold); + _recalcModeSelections(); +} + +void PX4AdvancedFlightModesController::setOffboardModeThreshold(double threshold) +{ + getParameterFact(-1, "RC_OFFB_TH")->setRawValue(threshold); + _recalcModeSelections(); +} + +int PX4AdvancedFlightModesController::_channelToChannelIndex(int channel) +{ + return _channelListModelChannel.lastIndexOf(channel); +} + +int PX4AdvancedFlightModesController::_channelToChannelIndex(const QString& channelParam) +{ + return _channelToChannelIndex(getParameterFact(-1, channelParam)->rawValue().toInt()); +} + +int PX4AdvancedFlightModesController::manualModeChannelIndex(void) +{ + return _channelToChannelIndex("RC_MAP_MODE_SW"); +} + +int PX4AdvancedFlightModesController::assistModeChannelIndex(void) +{ + return _channelToChannelIndex("RC_MAP_MODE_SW"); +} + +int PX4AdvancedFlightModesController::autoModeChannelIndex(void) +{ + return _channelToChannelIndex("RC_MAP_MODE_SW"); +} + +int PX4AdvancedFlightModesController::acroModeChannelIndex(void) +{ + return _channelToChannelIndex("RC_MAP_ACRO_SW"); +} + +int PX4AdvancedFlightModesController::altCtlModeChannelIndex(void) +{ + int posCtlSwitchChannel = getParameterFact(-1, "RC_MAP_POSCTL_SW")->rawValue().toInt(); + + if (posCtlSwitchChannel == 0) { + return _channelToChannelIndex("RC_MAP_MODE_SW"); + } else { + return _channelToChannelIndex(posCtlSwitchChannel); + } +} + +int PX4AdvancedFlightModesController::posCtlModeChannelIndex(void) +{ + return _channelToChannelIndex("RC_MAP_POSCTL_SW"); +} + +int PX4AdvancedFlightModesController::loiterModeChannelIndex(void) +{ + return _channelToChannelIndex("RC_MAP_LOITER_SW"); +} + +int PX4AdvancedFlightModesController::missionModeChannelIndex(void) +{ + int loiterSwitchChannel = getParameterFact(-1, "RC_MAP_LOITER_SW")->rawValue().toInt(); + + if (loiterSwitchChannel == 0) { + return _channelToChannelIndex("RC_MAP_MODE_SW"); + } else { + return _channelToChannelIndex(loiterSwitchChannel); + } +} + +int PX4AdvancedFlightModesController::returnModeChannelIndex(void) +{ + return _channelToChannelIndex("RC_MAP_RETURN_SW"); +} + +int PX4AdvancedFlightModesController::offboardModeChannelIndex(void) +{ + return _channelToChannelIndex("RC_MAP_OFFB_SW"); +} + +int PX4AdvancedFlightModesController::_channelIndexToChannel(int index) +{ + return _channelListModelChannel[index]; +} + +void PX4AdvancedFlightModesController::setManualModeChannelIndex(int index) +{ + getParameterFact(-1, "RC_MAP_MODE_SW")->setRawValue(_channelIndexToChannel(index)); + + _recalcModeSelections(); + _recalcModeRows(); + emit channelIndicesChanged(); + +} + +void PX4AdvancedFlightModesController::setAcroModeChannelIndex(int index) +{ + getParameterFact(-1, "RC_MAP_ACRO_SW")->setRawValue(_channelIndexToChannel(index)); + + _recalcModeSelections(); + _recalcModeRows(); +} + +void PX4AdvancedFlightModesController::setPosCtlModeChannelIndex(int index) +{ + int channel = _channelIndexToChannel(index); + + getParameterFact(-1, "RC_MAP_POSCTL_SW")->setRawValue(channel); + + if (channel == 0) { + // PosCtl disabled so AltCtl must move back to main Mode switch + _assistModeVisible = false; + } else { + // Assist mode is visible if AltCtl/PosCtl are on separate channel from main Mode switch + _assistModeVisible = channel != getParameterFact(-1, "RC_MAP_MODE_SW")->rawValue().toInt(); + } + + emit modesVisibleChanged(); + + _recalcModeSelections(); + _recalcModeRows(); + emit channelIndicesChanged(); + +} + +void PX4AdvancedFlightModesController::setLoiterModeChannelIndex(int index) +{ + int channel = _channelIndexToChannel(index); + + getParameterFact(-1, "RC_MAP_LOITER_SW")->setRawValue(channel); + + if (channel == 0) { + // Loiter disabled so Mission must move back to main Mode switch + _autoModeVisible = false; + } else { + // Auto mode is visible if Mission/Loiter are on separate channel from main Mode switch + _autoModeVisible = channel != getParameterFact(-1, "RC_MAP_MODE_SW")->rawValue().toInt(); + } + + emit modesVisibleChanged(); + + _recalcModeSelections(); + _recalcModeRows(); + emit channelIndicesChanged(); + +} + +void PX4AdvancedFlightModesController::setReturnModeChannelIndex(int index) +{ + getParameterFact(-1, "RC_MAP_RETURN_SW")->setRawValue(_channelIndexToChannel(index)); + _recalcModeSelections(); + _recalcModeRows(); + emit channelIndicesChanged(); + +} + +void PX4AdvancedFlightModesController::setOffboardModeChannelIndex(int index) +{ + getParameterFact(-1, "RC_MAP_OFFB_SW")->setRawValue(_channelIndexToChannel(index)); + _recalcModeSelections(); + _recalcModeRows(); + emit channelIndicesChanged(); + +} + +void PX4AdvancedFlightModesController::generateThresholds(void) +{ + // Reset all thresholds to 0.0 + + QStringList thresholdParams; + + thresholdParams << "RC_ASSIST_TH" << "RC_AUTO_TH" << "RC_ACRO_TH" << "RC_POSCTL_TH" << "RC_LOITER_TH" << "RC_RETURN_TH" << "RC_OFFB_TH"; + + foreach(const QString &thresholdParam, thresholdParams) { + getParameterFact(-1, thresholdParam)->setRawValue(0.0f); + } + + // Redistribute + + int modeChannel = getParameterFact(-1, "RC_MAP_MODE_SW")->rawValue().toInt(); + int acroChannel = getParameterFact(-1, "RC_MAP_ACRO_SW")->rawValue().toInt(); + int posCtlChannel = getParameterFact(-1, "RC_MAP_POSCTL_SW")->rawValue().toInt(); + int loiterChannel = getParameterFact(-1, "RC_MAP_LOITER_SW")->rawValue().toInt(); + int returnChannel = getParameterFact(-1, "RC_MAP_RETURN_SW")->rawValue().toInt(); + int offboardChannel = getParameterFact(-1, "RC_MAP_OFFB_SW")->rawValue().toInt(); + + if (modeChannel != 0) { + int positions = 3; // Manual/Assist/Auto always exist + + bool acroOnModeSwitch = modeChannel == acroChannel; + bool posCtlOnModeSwitch = modeChannel == posCtlChannel; + bool loiterOnModeSwitch = modeChannel == loiterChannel; + bool returnOnModeSwitch = modeChannel == returnChannel; + bool offboardOnModeSwitch = modeChannel == offboardChannel; + + positions += acroOnModeSwitch ? 1 : 0; + positions += posCtlOnModeSwitch ? 1 : 0; + positions += loiterOnModeSwitch ? 1 : 0; + positions += returnOnModeSwitch ? 1 : 0; + positions += offboardOnModeSwitch ? 1 : 0; + + float increment = 1.0f / positions; + float currentThreshold = 0.0f; + + if (acroOnModeSwitch) { + currentThreshold += increment; + getParameterFact(-1, "RC_ACRO_TH")->setRawValue(currentThreshold); + acroChannel = 0; + } + + currentThreshold += increment; + getParameterFact(-1, "RC_ASSIST_TH")->setRawValue(currentThreshold); + if (posCtlOnModeSwitch) { + currentThreshold += increment; + getParameterFact(-1, "RC_POSCTL_TH")->setRawValue(currentThreshold); + posCtlChannel = 0; + } + + currentThreshold += increment; + getParameterFact(-1, "RC_AUTO_TH")->setRawValue(currentThreshold); + if (loiterOnModeSwitch) { + currentThreshold += increment; + getParameterFact(-1, "RC_LOITER_TH")->setRawValue(currentThreshold); + loiterChannel = 0; + } + + if (returnOnModeSwitch) { + currentThreshold += increment; + getParameterFact(-1, "RC_RETURN_TH")->setRawValue(currentThreshold); + returnChannel = 0; + } + + if (offboardOnModeSwitch) { + currentThreshold += increment; + getParameterFact(-1, "RC_OFFB_TH")->setRawValue(currentThreshold); + offboardChannel = 0; + } + } + + if (acroChannel != 0) { + // If only two positions don't set threshold at midrange. Setting to 0.25 + // allows for this channel to work with either a two or three position switch + getParameterFact(-1, "RC_ACRO_TH")->setRawValue(0.25f); + } + + if (posCtlChannel != 0) { + getParameterFact(-1, "RC_POSCTL_TH")->setRawValue(0.25f); + } + + if (loiterChannel != 0) { + getParameterFact(-1, "RC_LOITER_TH")->setRawValue(0.25f); + } + + if (returnChannel != 0) { + getParameterFact(-1, "RC_RETURN_TH")->setRawValue(0.25f); + } + + if (offboardChannel != 0) { + getParameterFact(-1, "RC_OFFB_TH")->setRawValue(0.25f); + } + + emit thresholdsChanged(); +} diff --git a/src/AutoPilotPlugins/PX4/PX4AdvancedFlightModesController.h b/src/AutoPilotPlugins/PX4/PX4AdvancedFlightModesController.h new file mode 100644 index 0000000..2b89a3b --- /dev/null +++ b/src/AutoPilotPlugins/PX4/PX4AdvancedFlightModesController.h @@ -0,0 +1,226 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + + +/// @file +/// @author Don Gagne + +#ifndef PX4AdvancedFlightModesController_H +#define PX4AdvancedFlightModesController_H + +#include +#include +#include +#include + +#include "UASInterface.h" +#include "AutoPilotPlugin.h" +#include "FactPanelController.h" + +/// MVC Controller for FlightModesComponent.qml. +class PX4AdvancedFlightModesController : public FactPanelController +{ + Q_OBJECT + +public: + PX4AdvancedFlightModesController(void); + + Q_PROPERTY(bool validConfiguration MEMBER _validConfiguration CONSTANT) + Q_PROPERTY(QString configurationErrors MEMBER _configurationErrors CONSTANT) + + Q_PROPERTY(int channelCount MEMBER _channelCount CONSTANT) + Q_PROPERTY(bool fixedWing MEMBER _fixedWing CONSTANT) + + Q_PROPERTY(QString reservedChannels MEMBER _reservedChannels CONSTANT) + + Q_PROPERTY(int assistModeRow MEMBER _assistModeRow NOTIFY modeRowsChanged) + Q_PROPERTY(int autoModeRow MEMBER _autoModeRow NOTIFY modeRowsChanged) + Q_PROPERTY(int acroModeRow MEMBER _acroModeRow NOTIFY modeRowsChanged) + Q_PROPERTY(int altCtlModeRow MEMBER _altCtlModeRow NOTIFY modeRowsChanged) + Q_PROPERTY(int posCtlModeRow MEMBER _posCtlModeRow NOTIFY modeRowsChanged) + Q_PROPERTY(int loiterModeRow MEMBER _loiterModeRow NOTIFY modeRowsChanged) + Q_PROPERTY(int missionModeRow MEMBER _missionModeRow NOTIFY modeRowsChanged) + Q_PROPERTY(int returnModeRow MEMBER _returnModeRow NOTIFY modeRowsChanged) + Q_PROPERTY(int offboardModeRow MEMBER _offboardModeRow NOTIFY modeRowsChanged) + + Q_PROPERTY(int manualModeChannelIndex READ manualModeChannelIndex WRITE setManualModeChannelIndex NOTIFY channelIndicesChanged) + Q_PROPERTY(int assistModeChannelIndex READ assistModeChannelIndex NOTIFY channelIndicesChanged) + Q_PROPERTY(int autoModeChannelIndex READ autoModeChannelIndex NOTIFY channelIndicesChanged) + Q_PROPERTY(int acroModeChannelIndex READ acroModeChannelIndex WRITE setAcroModeChannelIndex NOTIFY channelIndicesChanged) + Q_PROPERTY(int altCtlModeChannelIndex READ altCtlModeChannelIndex NOTIFY channelIndicesChanged) + Q_PROPERTY(int posCtlModeChannelIndex READ posCtlModeChannelIndex WRITE setPosCtlModeChannelIndex NOTIFY channelIndicesChanged) + Q_PROPERTY(int loiterModeChannelIndex READ loiterModeChannelIndex WRITE setLoiterModeChannelIndex NOTIFY channelIndicesChanged) + Q_PROPERTY(int missionModeChannelIndex READ missionModeChannelIndex NOTIFY channelIndicesChanged) + Q_PROPERTY(int returnModeChannelIndex READ returnModeChannelIndex WRITE setReturnModeChannelIndex NOTIFY channelIndicesChanged) + Q_PROPERTY(int offboardModeChannelIndex READ offboardModeChannelIndex WRITE setOffboardModeChannelIndex NOTIFY channelIndicesChanged) + + Q_PROPERTY(double manualModeRcValue READ manualModeRcValue NOTIFY switchLiveRangeChanged) + Q_PROPERTY(double assistModeRcValue READ assistModeRcValue NOTIFY switchLiveRangeChanged) + Q_PROPERTY(double autoModeRcValue READ autoModeRcValue NOTIFY switchLiveRangeChanged) + Q_PROPERTY(double acroModeRcValue READ acroModeRcValue NOTIFY switchLiveRangeChanged) + Q_PROPERTY(double altCtlModeRcValue READ altCtlModeRcValue NOTIFY switchLiveRangeChanged) + Q_PROPERTY(double posCtlModeRcValue READ posCtlModeRcValue NOTIFY switchLiveRangeChanged) + Q_PROPERTY(double loiterModeRcValue READ loiterModeRcValue NOTIFY switchLiveRangeChanged) + Q_PROPERTY(double missionModeRcValue READ missionModeRcValue NOTIFY switchLiveRangeChanged) + Q_PROPERTY(double returnModeRcValue READ returnModeRcValue NOTIFY switchLiveRangeChanged) + Q_PROPERTY(double offboardModeRcValue READ offboardModeRcValue NOTIFY switchLiveRangeChanged) + + Q_PROPERTY(double manualModeThreshold READ manualModeThreshold NOTIFY thresholdsChanged) + Q_PROPERTY(double assistModeThreshold READ assistModeThreshold WRITE setAssistModeThreshold NOTIFY thresholdsChanged) + Q_PROPERTY(double autoModeThreshold READ autoModeThreshold WRITE setAutoModeThreshold NOTIFY thresholdsChanged) + Q_PROPERTY(double acroModeThreshold READ acroModeThreshold WRITE setAcroModeThreshold NOTIFY thresholdsChanged) + Q_PROPERTY(double altCtlModeThreshold READ altCtlModeThreshold WRITE setAltCtlModeThreshold NOTIFY thresholdsChanged) + Q_PROPERTY(double posCtlModeThreshold READ posCtlModeThreshold WRITE setPosCtlModeThreshold NOTIFY thresholdsChanged) + Q_PROPERTY(double loiterModeThreshold READ loiterModeThreshold WRITE setLoiterModeThreshold NOTIFY thresholdsChanged) + Q_PROPERTY(double missionModeThreshold READ missionModeThreshold WRITE setMissionModeThreshold NOTIFY thresholdsChanged) + Q_PROPERTY(double returnModeThreshold READ returnModeThreshold WRITE setReturnModeThreshold NOTIFY thresholdsChanged) + Q_PROPERTY(double offboardModeThreshold READ offboardModeThreshold WRITE setOffboardModeThreshold NOTIFY thresholdsChanged) + + Q_PROPERTY(bool assistModeVisible MEMBER _assistModeVisible NOTIFY modesVisibleChanged) + Q_PROPERTY(bool autoModeVisible MEMBER _autoModeVisible NOTIFY modesVisibleChanged) + + Q_PROPERTY(bool manualModeSelected MEMBER _manualModeSelected NOTIFY modesSelectedChanged) + Q_PROPERTY(bool assistModeSelected MEMBER _assistModeSelected NOTIFY modesSelectedChanged) + Q_PROPERTY(bool autoModeSelected MEMBER _autoModeSelected NOTIFY modesSelectedChanged) + Q_PROPERTY(bool acroModeSelected MEMBER _acroModeSelected NOTIFY modesSelectedChanged) + Q_PROPERTY(bool altCtlModeSelected MEMBER _altCtlModeSelected NOTIFY modesSelectedChanged) + Q_PROPERTY(bool posCtlModeSelected MEMBER _posCtlModeSelected NOTIFY modesSelectedChanged) + Q_PROPERTY(bool missionModeSelected MEMBER _missionModeSelected NOTIFY modesSelectedChanged) + Q_PROPERTY(bool loiterModeSelected MEMBER _loiterModeSelected NOTIFY modesSelectedChanged) + Q_PROPERTY(bool returnModeSelected MEMBER _returnModeSelected NOTIFY modesSelectedChanged) + Q_PROPERTY(bool offboardModeSelected MEMBER _offboardModeSelected NOTIFY modesSelectedChanged) + + Q_PROPERTY(QStringList channelListModel MEMBER _channelListModel CONSTANT) + + Q_INVOKABLE void generateThresholds(void); + + int assistModeRow(void); + int autoModeRow(void); + int acroModeRow(void); + int altCtlModeRow(void); + int posCtlModeRow(void); + int loiterModeRow(void); + int missionModeRow(void); + int returnModeRow(void); + int offboardModeRow(void); + + int manualModeChannelIndex(void); + int assistModeChannelIndex(void); + int autoModeChannelIndex(void); + int acroModeChannelIndex(void); + int altCtlModeChannelIndex(void); + int posCtlModeChannelIndex(void); + int loiterModeChannelIndex(void); + int missionModeChannelIndex(void); + int returnModeChannelIndex(void); + int offboardModeChannelIndex(void); + + void setManualModeChannelIndex(int index); + void setAcroModeChannelIndex(int index); + void setPosCtlModeChannelIndex(int index); + void setLoiterModeChannelIndex(int index); + void setReturnModeChannelIndex(int index); + void setOffboardModeChannelIndex(int index); + + double manualModeRcValue(void); + double assistModeRcValue(void); + double autoModeRcValue(void); + double acroModeRcValue(void); + double altCtlModeRcValue(void); + double posCtlModeRcValue(void); + double missionModeRcValue(void); + double loiterModeRcValue(void); + double returnModeRcValue(void); + double offboardModeRcValue(void); + + double manualModeThreshold(void); + double assistModeThreshold(void); + double autoModeThreshold(void); + double acroModeThreshold(void); + double altCtlModeThreshold(void); + double posCtlModeThreshold(void); + double missionModeThreshold(void); + double loiterModeThreshold(void); + double returnModeThreshold(void); + double offboardModeThreshold(void); + + void setAssistModeThreshold(double threshold); + void setAutoModeThreshold(double threshold); + void setAcroModeThreshold(double threshold); + void setAltCtlModeThreshold(double threshold); + void setPosCtlModeThreshold(double threshold); + void setMissionModeThreshold(double threshold); + void setLoiterModeThreshold(double threshold); + void setReturnModeThreshold(double threshold); + void setOffboardModeThreshold(double threshold); + +signals: + void switchLiveRangeChanged(void); + void thresholdsChanged(void); + void modesSelectedChanged(void); + void modesVisibleChanged(void); + void channelIndicesChanged(void); + void modeRowsChanged(void); + +private slots: + void _rcChannelsChanged(int channelCount, int pwmValues[Vehicle::cMaxRcChannels]); + +private: + double _switchLiveRange(const QString& param); + void _init(void); + void _validateConfiguration(void); + void _recalcModeSelections(void); + void _recalcModeRows(void); + int _channelToChannelIndex(int channel); + int _channelToChannelIndex(const QString& channelParam); + int _channelIndexToChannel(int index); + + static const int _chanMax = 18; + + bool _fixedWing; + + double _rcValues[_chanMax]; + int _rgRCMin[_chanMax]; + int _rgRCMax[_chanMax]; + bool _rgRCReversed[_chanMax]; + + bool _validConfiguration; + QString _configurationErrors; + int _channelCount; + QString _reservedChannels; + + int _assistModeRow; + int _autoModeRow; + int _acroModeRow; + int _altCtlModeRow; + int _posCtlModeRow; + int _loiterModeRow; + int _missionModeRow; + int _returnModeRow; + int _offboardModeRow; + + bool _manualModeSelected; + bool _assistModeSelected; + bool _autoModeSelected; + bool _acroModeSelected; + bool _altCtlModeSelected; + bool _posCtlModeSelected; + bool _missionModeSelected; + bool _loiterModeSelected; + bool _returnModeSelected; + bool _offboardModeSelected; + + bool _assistModeVisible; + bool _autoModeVisible; + + QStringList _channelListModel; + QList _channelListModelChannel; +}; + +#endif diff --git a/src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.cc b/src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.cc index fd822b9..9ee27b8 100644 --- a/src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.cc +++ b/src/AutoPilotPlugins/PX4/PX4AutoPilotPlugin.cc @@ -10,6 +10,7 @@ #include "PX4AutoPilotPlugin.h" #include "PX4AirframeLoader.h" +#include "PX4AdvancedFlightModesController.h" #include "AirframeComponentController.h" #include "UAS.h" #include "FirmwarePlugin/PX4/PX4ParameterMetaData.h" // FIXME: Hack diff --git a/src/AutoPilotPlugins/PX4/PX4FlightBehavior.cc b/src/AutoPilotPlugins/PX4/PX4FlightBehavior.cc index 3cd44b3..50c6a19 100644 --- a/src/AutoPilotPlugins/PX4/PX4FlightBehavior.cc +++ b/src/AutoPilotPlugins/PX4/PX4FlightBehavior.cc @@ -64,12 +64,12 @@ QUrl PX4FlightBehavior::setupSource() const case MAV_TYPE_TRICOPTER: qmlFile = "qrc:/qml/PX4FlightBehaviorCopter.qml"; break; - case MAV_TYPE_VTOL_TAILSITTER_DUOROTOR: - case MAV_TYPE_VTOL_TAILSITTER_QUADROTOR: + case MAV_TYPE_VTOL_DUOROTOR: + case MAV_TYPE_VTOL_QUADROTOR: case MAV_TYPE_VTOL_TILTROTOR: - case MAV_TYPE_VTOL_FIXEDROTOR: - case MAV_TYPE_VTOL_TAILSITTER: - case MAV_TYPE_VTOL_TILTWING: + case MAV_TYPE_VTOL_RESERVED2: + case MAV_TYPE_VTOL_RESERVED3: + case MAV_TYPE_VTOL_RESERVED4: case MAV_TYPE_VTOL_RESERVED5: qmlFile = ""; break; diff --git a/src/AutoPilotPlugins/PX4/PX4FlightModes.qml b/src/AutoPilotPlugins/PX4/PX4FlightModes.qml index 854af1b..9b99247 100644 --- a/src/AutoPilotPlugins/PX4/PX4FlightModes.qml +++ b/src/AutoPilotPlugins/PX4/PX4FlightModes.qml @@ -30,11 +30,13 @@ SetupPage { Loader { width: availableWidth height: availableHeight - source: "qrc:/qml/PX4SimpleFlightModes.qml" + source: _simpleMode ? "qrc:/qml/PX4SimpleFlightModes.qml" : "qrc:/qml/PX4AdvancedFlightModes.qml" property Fact _nullFact property bool _rcMapFltmodeExists: controller.parameterExists(-1, "RC_MAP_FLTMODE") property Fact _rcMapFltmode: _rcMapFltmodeExists ? controller.getParameterFact(-1, "RC_MAP_FLTMODE") : _nullFact + property Fact _rcMapModeSw: controller.getParameterFact(-1, "RC_MAP_MODE_SW") + property bool _simpleMode: _rcMapFltmodeExists ? _rcMapFltmode.value > 0 || _rcMapModeSw.value === 0 : false FactPanelController { id: controller diff --git a/src/AutoPilotPlugins/PX4/PX4SimpleFlightModes.qml b/src/AutoPilotPlugins/PX4/PX4SimpleFlightModes.qml index 26e7901..99ce9e8 100644 --- a/src/AutoPilotPlugins/PX4/PX4SimpleFlightModes.qml +++ b/src/AutoPilotPlugins/PX4/PX4SimpleFlightModes.qml @@ -34,8 +34,8 @@ Item { _switchTHList.push("RC_TRANS_TH") } if (controller.vehicle.fixedWing) { - _switchNameList.push("RC_MAP_FLAPS") - _switchTHList.push("") + _switchFactList.push("RC_MAP_FLAPS") + _switchTHFactList.push("") } switchRepeater.model = _switchNameList } @@ -184,6 +184,14 @@ Item { } } // Column - Switch settings } // Row - Settings + + QGCButton { + text: qsTr("Use Multi Channel Mode Selection") + onClicked: { + controller.getParameterFact(-1, "RC_MAP_MODE_SW").value = 5 + controller.getParameterFact(-1, "RC_MAP_FLTMODE").value = 0 + } + } } } } diff --git a/src/AutoPilotPlugins/PX4/PX4TuningComponent.cc b/src/AutoPilotPlugins/PX4/PX4TuningComponent.cc index ec315d5..214b733 100644 --- a/src/AutoPilotPlugins/PX4/PX4TuningComponent.cc +++ b/src/AutoPilotPlugins/PX4/PX4TuningComponent.cc @@ -54,7 +54,7 @@ QUrl PX4TuningComponent::setupSource(void) const switch (_vehicle->vehicleType()) { case MAV_TYPE_FIXED_WING: - qmlFile = "qrc:/qml/PX4TuningComponentPlane.qml"; + qmlFile = ""; // TODO: "qrc:/qml/PX4TuningComponentPlane.qml"; break; case MAV_TYPE_QUADROTOR: case MAV_TYPE_COAXIAL: @@ -64,12 +64,12 @@ QUrl PX4TuningComponent::setupSource(void) const case MAV_TYPE_TRICOPTER: qmlFile = "qrc:/qml/PX4TuningComponentCopter.qml"; break; - case MAV_TYPE_VTOL_TAILSITTER_DUOROTOR: - case MAV_TYPE_VTOL_TAILSITTER_QUADROTOR: + case MAV_TYPE_VTOL_DUOROTOR: + case MAV_TYPE_VTOL_QUADROTOR: case MAV_TYPE_VTOL_TILTROTOR: - case MAV_TYPE_VTOL_FIXEDROTOR: - case MAV_TYPE_VTOL_TAILSITTER: - case MAV_TYPE_VTOL_TILTWING: + case MAV_TYPE_VTOL_RESERVED2: + case MAV_TYPE_VTOL_RESERVED3: + case MAV_TYPE_VTOL_RESERVED4: case MAV_TYPE_VTOL_RESERVED5: qmlFile = "qrc:/qml/PX4TuningComponentVTOL.qml"; break; diff --git a/src/AutoPilotPlugins/PX4/PX4TuningComponentPlaneAll.qml b/src/AutoPilotPlugins/PX4/PX4TuningComponentPlaneAll.qml index 4ea95bd..f815acb 100644 --- a/src/AutoPilotPlugins/PX4/PX4TuningComponentPlaneAll.qml +++ b/src/AutoPilotPlugins/PX4/PX4TuningComponentPlaneAll.qml @@ -28,16 +28,12 @@ Item { width: parent.width anchors.top: parent.top QGCTabButton { - text: qsTr("Rate Controller") - } - QGCTabButton { - text: qsTr("Attitude Controller") + text: qsTr("TECS") } } property var pages: [ - "PX4TuningComponentPlaneRate.qml", - "PX4TuningComponentPlaneAttitude.qml", + "PX4TuningComponentPlaneTECS.qml", ] Loader { diff --git a/src/AutoPilotPlugins/PX4/PX4TuningComponentPlaneAttitude.qml b/src/AutoPilotPlugins/PX4/PX4TuningComponentPlaneAttitude.qml deleted file mode 100644 index f73e15f..0000000 --- a/src/AutoPilotPlugins/PX4/PX4TuningComponentPlaneAttitude.qml +++ /dev/null @@ -1,71 +0,0 @@ -/**************************************************************************** - * - * (c) 2021 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -import QtQuick 2.3 -import QtQuick.Controls 1.2 -import QtQuick.Layouts 1.2 - -import QGroundControl 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.FactSystem 1.0 -import QGroundControl.FactControls 1.0 -import QGroundControl.ScreenTools 1.0 -import QGroundControl.Vehicle 1.0 - -ColumnLayout { - width: availableWidth - anchors.fill: parent - property alias autotuningEnabled: pidTuning.autotuningEnabled - - PIDTuning { - width: availableWidth - id: pidTuning - - property var roll: QtObject { - property string name: qsTr("Roll") - property var plot: [ - { name: "Response", value: globals.activeVehicle.roll.value }, - { name: "Setpoint", value: globals.activeVehicle.setpoint.roll.value } - ] - property var params: ListModel { - ListElement { - title: qsTr("Time constant (FW_R_TC)") - description: qsTr("The latency between a roll step input and the achieved setpoint (inverse to a P gain)") - param: "FW_R_TC" - min: 0.4 - max: 1.0 - step: 0.05 - } - } - } - property var pitch: QtObject { - property string name: qsTr("Pitch") - property var plot: [ - { name: "Response", value: globals.activeVehicle.pitch.value }, - { name: "Setpoint", value: globals.activeVehicle.setpoint.pitch.value } - ] - property var params: ListModel { - ListElement { - title: qsTr("Time Constant (FW_P_TC)") - description: qsTr("The latency between a pitch step input and the achieved setpoint (inverse to a P gain)") - param: "FW_P_TC" - min: 0.2 - max: 1.0 - step: 0.05 - } - } - } - title: "Attitude" - tuningMode: Vehicle.ModeRateAndAttitude - unit: "deg" - axis: [ roll, pitch ] - showAutoModeChange: true - showAutoTuning: true - } -} diff --git a/src/AutoPilotPlugins/PX4/PX4TuningComponentPlaneRate.qml b/src/AutoPilotPlugins/PX4/PX4TuningComponentPlaneRate.qml deleted file mode 100644 index f35e195..0000000 --- a/src/AutoPilotPlugins/PX4/PX4TuningComponentPlaneRate.qml +++ /dev/null @@ -1,173 +0,0 @@ -/**************************************************************************** - * - * (c) 2021 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -import QtQuick 2.3 -import QtQuick.Controls 1.2 -import QtQuick.Layouts 1.2 - -import QGroundControl 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.FactSystem 1.0 -import QGroundControl.FactControls 1.0 -import QGroundControl.ScreenTools 1.0 -import QGroundControl.Vehicle 1.0 - -ColumnLayout { - width: availableWidth - anchors.fill: parent - property alias autotuningEnabled: pidTuning.autotuningEnabled - - GridLayout { - columns: 2 - } - PIDTuning { - width: availableWidth - id: pidTuning - - property var roll: QtObject { - property string name: qsTr("Roll") - property var plot: [ - { name: "Response", value: globals.activeVehicle.rollRate.value }, - { name: "Setpoint", value: globals.activeVehicle.setpoint.rollRate.value } - ] - property var params: ListModel { - ListElement { - title: qsTr("Porportional gain (FW_RR_P)") - description: qsTr("Porportional gain.") - param: "FW_RR_P" - min: 0.0 - max: 1 - step: 0.005 - } - ListElement { - title: qsTr("Differential Gain (FW_RR_D)") - description: qsTr("Damping: increase to reduce overshoots and oscillations, but not higher than really needed.") - param: "FW_RR_D" - min: 0.0 - max: 1.0 - step: 0.005 - } - ListElement { - title: qsTr("Integral Gain (FW_RR_I)") - description: qsTr("Generally does not need much adjustment, reduce this when seeing slow oscillations.") - param: "FW_RR_I" - min: 0.0 - max: 0.5 - step: 0.005 - } - ListElement { - title: qsTr("Feedforward Gain (FW_RR_FF)") - description: qsTr("Feedforward gused to compensate for aerodynamic damping.") - param: "FW_RR_FF" - min: 0.0 - max: 10.0 - step: 0.05 - } - } - } - property var pitch: QtObject { - property string name: qsTr("Pitch") - property var plot: [ - { name: "Response", value: globals.activeVehicle.pitchRate.value }, - { name: "Setpoint", value: globals.activeVehicle.setpoint.pitchRate.value } - ] - property var params: ListModel { - ListElement { - title: qsTr("Porportional Gain (FW_PR_P)") - description: qsTr("Porportional Gain.") - param: "FW_PR_P" - min: 0.0 - max: 1 - step: 0.005 - } - ListElement { - title: qsTr("Differential Gain (FW_PR_D)") - description: qsTr("Damping: increase to reduce overshoots and oscillations, but not higher than really needed.") - param: "FW_PR_D" - min: 0.0 - max: 1.00 - step: 0.005 - } - ListElement { - title: qsTr("Integral Gain (FW_PR_I)") - description: qsTr("Generally does not need much adjustment, reduce this when seeing slow oscillations.") - param: "FW_PR_I" - min: 0.0 - max: 0.5 - step: 0.005 - } - ListElement { - title: qsTr("Feedforward Gain (FW_PR_FF)") - description: qsTr("Feedforward gused to compensate for aerodynamic damping.") - param: "FW_PR_FF" - min: 0.0 - max: 10.0 - step: 0.05 - } - } - } - property var yaw: QtObject { - property string name: qsTr("Yaw") - property var plot: [ - { name: "Response", value: globals.activeVehicle.yawRate.value }, - { name: "Setpoint", value: globals.activeVehicle.setpoint.yawRate.value } - ] - property var params: ListModel { - ListElement { - title: qsTr("Porportional Gain (FW_YR_P)") - description: qsTr("Porportional Gain.") - param: "FW_YR_P" - min: 0.0 - max: 1 - step: 0.005 - } - ListElement { - title: qsTr("Integral Gain (FW_YR_D)") - description: qsTr("Generally does not need much adjustment, reduce this when seeing slow oscillations.") - param: "FW_YR_D" - min: 0.0 - max: 1.0 - step: 0.005 - } - ListElement { - title: qsTr("Integral Gain (FW_YR_I)") - description: qsTr("Generally does not need much adjustment, reduce this when seeing slow oscillations.") - param: "FW_YR_I" - min: 0.0 - max: 50.0 - step: 0.5 - } - ListElement { - title: qsTr("Feedforward Gain (FW_YR_FF)") - description: qsTr("Feedforward gused to compensate for aerodynamic damping.") - param: "FW_YR_FF" - min: 0.0 - max: 10.0 - step: 0.05 - } - ListElement { - title: qsTr("Roll control to yaw feedforward (FW_RLL_TO_YAW_FF)") - description: qsTr("Used to counteract the adverse yaw effect for fixed wings.") - param: "FW_RLL_TO_YAW_FF" - min: 0.0 - max: 1.0 - step: 0.01 - } - } - } - title: "Rate" - tuningMode: Vehicle.ModeRateAndAttitude - unit: "deg/s" - axis: [ roll, pitch, yaw ] - chartDisplaySec: 3 - showAutoModeChange: true - showAutoTuning: true - } -} - diff --git a/src/AutoPilotPlugins/PX4/PowerComponent.cc b/src/AutoPilotPlugins/PX4/PowerComponent.cc index a2b5132..95d8297 100644 --- a/src/AutoPilotPlugins/PX4/PowerComponent.cc +++ b/src/AutoPilotPlugins/PX4/PowerComponent.cc @@ -42,21 +42,14 @@ bool PowerComponent::requiresSetup(void) const bool PowerComponent::setupComplete(void) const { - if (!_vehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, "BAT1_SOURCE") || - !_vehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, "BAT1_V_CHARGED") || - !_vehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, "BAT1_V_EMPTY") || - !_vehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, "BAT1_N_CELLS")) { - return true; - } - return _vehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, "BAT1_SOURCE")->rawValue().toInt() == -1 || - (_vehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, "BAT1_V_CHARGED")->rawValue().toFloat() != 0.0f && - _vehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, "BAT1_V_EMPTY")->rawValue().toFloat() != 0.0f && - _vehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, "BAT1_N_CELLS")->rawValue().toInt() != 0); + return _vehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, "BAT_V_CHARGED")->rawValue().toFloat() != 0.0f && + _vehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, "BAT_V_EMPTY")->rawValue().toFloat() != 0.0f && + _vehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, "BAT_N_CELLS")->rawValue().toInt() != 0; } QStringList PowerComponent::setupCompleteChangedTriggerList(void) const { - return {"BAT1_SOURCE", "BAT1_V_CHARGED", "BAT1_V_EMPTY", "BAT1_N_CELLS"}; + return {"BAT_V_CHARGED", "BAT_V_EMPTY", "BAT_N_CELLS"}; } QUrl PowerComponent::setupSource(void) const diff --git a/src/AutoPilotPlugins/PX4/PowerComponent.qml b/src/AutoPilotPlugins/PX4/PowerComponent.qml index 659600b..a5df76c 100644 --- a/src/AutoPilotPlugins/PX4/PowerComponent.qml +++ b/src/AutoPilotPlugins/PX4/PowerComponent.qml @@ -58,7 +58,7 @@ SetupPage { onOldFirmware: mainWindow.showMessageDialog(qsTr("ESC Calibration"), qsTr("%1 cannot perform ESC Calibration with this version of firmware. You will need to upgrade to a newer firmware.").arg(QGroundControl.appName)) onNewerFirmware: mainWindow.showMessageDialog(qsTr("ESC Calibration"), qsTr("%1 cannot perform ESC Calibration with this version of firmware. You will need to upgrade %1.").arg(QGroundControl.appName)) onDisconnectBattery: mainWindow.showMessageDialog(qsTr("ESC Calibration failed"), qsTr("You must disconnect the battery prior to performing ESC Calibration. Disconnect your battery and try again.")) - onConnectBattery: escCalibrationDlgComponent.createObject(mainWindow).open() + onConnectBattery: { var dialog = mainWindow.showPopupDialogFromComponent(escCalibrationDlgComponent); dialog.disableAcceptButton() } } ColumnLayout { @@ -327,7 +327,7 @@ SetupPage { QGCButton { text: qsTr("Calculate") visible: battVoltageDividerAvailable - onClicked: calcVoltageDividerDlgComponent.createObject(mainWindow, { batteryIndex: _batteryIndex }).open() + onClicked: mainWindow.showPopupDialogFromComponent(calcVoltageDividerDlgComponent, { batteryIndex: _batteryIndex }) } Item { width: 1; height: 1; Layout.columnSpan: 2; visible: battVoltageDividerAvailable } @@ -351,7 +351,7 @@ SetupPage { QGCButton { text: qsTr("Calculate") visible: battAmpsPerVoltAvailable - onClicked: calcAmpsPerVoltDlgComponent.createObject(mainWindow, { batteryIndex: _batteryIndex }).open() + onClicked: mainWindow.showPopupDialogFromComponent(calcAmpsPerVoltDlgComponent, { batteryIndex: _batteryIndex }) } Item { width: 1; height: 1; Layout.columnSpan: 2; visible: battAmpsPerVoltAvailable } @@ -412,17 +412,16 @@ SetupPage { id: calcVoltageDividerDlgComponent QGCPopupDialog { - title: qsTr("Calculate Voltage Divider") - buttons: StandardButton.Close - - property alias batteryIndex: batParams.batteryIndex + title: qsTr("Calculate Voltage Divider") + buttons: StandardButton.Close property var _controller: controller - property FactGroup _batteryFactGroup: controller.vehicle.getFactGroup("battery" + (batteryIndex - 1)) + property FactGroup _batteryFactGroup: controller.vehicle.getFactGroup("battery" + (dialogProperties.batteryIndex - 1)) BatteryParams { id: batParams controller: _controller + batteryIndex: dialogProperties.batteryIndex } ColumnLayout { @@ -439,7 +438,7 @@ SetupPage { columns: 2 QGCLabel { text: qsTr("Measured voltage:") } - QGCTextField { id: measuredVoltage; numericValuesOnly: true } + QGCTextField { id: measuredVoltage } QGCLabel { text: qsTr("Vehicle voltage:") } QGCLabel { text: _batteryFactGroup.voltage.valueString } @@ -462,25 +461,24 @@ SetupPage { } } } - } - } - } + } // Column + } // QGCViewDialog + } // Component - calcVoltageDividerDlgComponent Component { id: calcAmpsPerVoltDlgComponent QGCPopupDialog { - title: qsTr("Calculate Amps per Volt") - buttons: StandardButton.Close - - property alias batteryIndex: batParams.batteryIndex + title: qsTr("Calculate Amps per Volt") + buttons: StandardButton.Close property var _controller: controller - property FactGroup _batteryFactGroup: controller.vehicle.getFactGroup("battery" + (batteryIndex - 1)) + property FactGroup _batteryFactGroup: controller.vehicle.getFactGroup("battery" + (dialogProperties.batteryIndex - 1)) BatteryParams { id: batParams controller: _controller + batteryIndex: dialogProperties.batteryIndex } ColumnLayout { @@ -497,7 +495,7 @@ SetupPage { columns: 2 QGCLabel { text: qsTr("Measured current:") } - QGCTextField { id: measuredCurrent; numericValuesOnly: true } + QGCTextField { id: measuredCurrent } QGCLabel { text: qsTr("Vehicle current:") } QGCLabel { text: _batteryFactGroup.current.valueString } @@ -528,17 +526,16 @@ SetupPage { id: escCalibrationDlgComponent QGCPopupDialog { - id: escCalibrationDlg - title: qsTr("ESC Calibration") - buttons: StandardButton.Ok - acceptButtonEnabled: false + id: popupDialog + title: qsTr("ESC Calibration") + buttons: StandardButton.Ok Connections { target: controller onBatteryConnected: textLabel.text = qsTr("Performing calibration. This will take a few seconds..") - onCalibrationFailed: { escCalibrationDlg.acceptButtonEnabled = true; textLabel.text = _highlightPrefix + qsTr("ESC Calibration failed. ") + _highlightSuffix + errorMessage } - onCalibrationSuccess: { escCalibrationDlg.acceptButtonEnabled = true; textLabel.text = qsTr("Calibration complete. You can disconnect your battery now if you like.") } + onCalibrationFailed: { popupDialog.enableAcceptButton(); textLabel.text = _highlightPrefix + qsTr("ESC Calibration failed. ") + _highlightSuffix + errorMessage } + onCalibrationSuccess: { popupDialog.enableAcceptButton(); textLabel.text = qsTr("Calibration complete. You can disconnect your battery now if you like.") } } ColumnLayout { diff --git a/src/AutoPilotPlugins/PX4/PowerComponentSummary.qml b/src/AutoPilotPlugins/PX4/PowerComponentSummary.qml index f0674ce..e248c56 100644 --- a/src/AutoPilotPlugins/PX4/PowerComponentSummary.qml +++ b/src/AutoPilotPlugins/PX4/PowerComponentSummary.qml @@ -26,9 +26,9 @@ Item { QGCPalette { id: qgcPal; colorGroupEnabled: enabled } FactPanelController { id: controller; } - property Fact batVChargedFact: controller.getParameterFact(-1, "BAT1_V_CHARGED") - property Fact batVEmptyFact: controller.getParameterFact(-1, "BAT1_V_EMPTY") - property Fact batCellsFact: controller.getParameterFact(-1, "BAT1_N_CELLS") + property Fact batVChargedFact: controller.getParameterFact(-1, "BAT_V_CHARGED") + property Fact batVEmptyFact: controller.getParameterFact(-1, "BAT_V_EMPTY") + property Fact batCellsFact: controller.getParameterFact(-1, "BAT_N_CELLS") Column { anchors.fill: parent diff --git a/src/AutoPilotPlugins/PX4/SensorsSetup.qml b/src/AutoPilotPlugins/PX4/SensorsSetup.qml index 4340bba..2ca0765 100644 --- a/src/AutoPilotPlugins/PX4/SensorsSetup.qml +++ b/src/AutoPilotPlugins/PX4/SensorsSetup.qml @@ -11,7 +11,6 @@ import QtQuick 2.3 import QtQuick.Controls 1.2 import QtQuick.Controls.Styles 1.4 import QtQuick.Dialogs 1.2 -import QtQuick.Layouts 1.15 import QGroundControl 1.0 import QGroundControl.FactSystem 1.0 @@ -22,7 +21,7 @@ import QGroundControl.ScreenTools 1.0 import QGroundControl.Controllers 1.0 /// Page for sensor calibration. This control is used within the SensorsComponent control and can also be used -/// standalone for custom uis. When using standadalone you can use the various show* bools to show/hide what you want. +/// standalone for custom uis. When using standardalone you can use the various show* bools to show/hide what you want. Item { id: _root @@ -83,21 +82,10 @@ Item { "ROTATION_ROLL_270_YAW_135", "ROTATION_PITCH_90", "ROTATION_PITCH_270", - "ROTATION_PITCH_180_YAW_90", - "ROTATION_PITCH_180_YAW_270", - "ROTATION_ROLL_90_PITCH_90", - "ROTATION_ROLL_180_PITCH_90", - "ROTATION_ROLL_270_PITCH_90", - "ROTATION_ROLL_90_PITCH_180", - "ROTATION_ROLL_270_PITCH_180", - "ROTATION_ROLL_90_PITCH_270", + "ROTATION_ROLL_270_YAW_270", "ROTATION_ROLL_180_PITCH_270", - "ROTATION_ROLL_270_PITCH_270", - "ROTATION_ROLL_90_PITCH_180_YAW_90", - "ROTATION_ROLL_90_YAW_270", - "ROTATION_ROLL_90_PITCH_68_YAW_293", - "ROTATION_PITCH_315", - "ROTATION_ROLL_90_PITCH_315" + "ROTATION_PITCH_90_YAW_180", + "ROTATION_ROLL_90_PITCH_90" ] property Fact cal_mag0_id: controller.getParameterFact(-1, "CAL_MAG0_ID") @@ -209,12 +197,13 @@ Item { onMagCalComplete: { setOrientationsButton.visible = orientationsButtonVisible() setOrientationsDialogShowBoardOrientation = false - setOrientationsDialogComponent.createObject(mainWindow, { title: qsTr("Compass Calibration Complete"), showRebootVehicleButton: true }).open() + setOrientationsDialogShowReboot = true + mainWindow.showComponentDialog(setOrientationsDialogComponent, qsTr("Compass Calibration Complete"), mainWindow.showDialogDefaultWidth, StandardButton.Ok) } onWaitingForCancelChanged: { if (controller.waitingForCancel) { - waitForCancelDialogComponent.createObject(mainWindow).open() + mainWindow.showComponentDialog(waitForCancelDialogComponent, qsTr("Calibration Cancel"), mainWindow.showDialogDefaultWidth, 0) } } } @@ -229,17 +218,15 @@ Item { Component { id: waitForCancelDialogComponent - QGCSimpleMessageDialog { - title: qsTr("Calibration Cancel") - text: qsTr("Waiting for Vehicle to response to Cancel. This may take a few seconds.") - buttons: 0 + QGCViewMessage { + message: qsTr("Waiting for Vehicle to response to Cancel. This may take a few seconds.") Connections { target: controller onWaitingForCancelChanged: { if (!controller.waitingForCancel) { - close() + hideDialog() } } } @@ -249,10 +236,10 @@ Item { Component { id: preCalibrationDialogComponent - QGCPopupDialog { - buttons: StandardButton.Cancel | StandardButton.Ok + QGCViewDialog { + id: preCalibrationDialog - onAccepted: { + function accept() { if (preCalibrationDialogType == "gyro") { controller.calibrateGyro() } else if (preCalibrationDialogType == "accel") { @@ -264,120 +251,139 @@ Item { } else if (preCalibrationDialogType == "airspeed") { controller.calibrateAirspeed() } + preCalibrationDialog.hideDialog() } - ColumnLayout { - spacing: ScreenTools.defaultFontPixelHeight + Column { + anchors.fill: parent + spacing: ScreenTools.defaultFontPixelHeight QGCLabel { - Layout.minimumWidth: ScreenTools.defaultFontPixelWidth * 50 - Layout.preferredWidth: innerColumn.width - wrapMode: Text.WordWrap - text: preCalibrationDialogHelp + width: parent.width + wrapMode: Text.WordWrap + text: preCalibrationDialogHelp + } + + QGCLabel { + id: boardRotationHelp + width: parent.width + wrapMode: Text.WordWrap + visible: !_sensorsHaveFixedOrientation && (preCalibrationDialogType == "accel" || preCalibrationDialogType == "compass") + text: qsTr("Set autopilot orientation before calibrating.") } Column { - id: innerColumn - spacing: parent.spacing - - QGCLabel { - id: boardRotationHelp - wrapMode: Text.WordWrap - visible: !_sensorsHaveFixedOrientation && (preCalibrationDialogType == "accel" || preCalibrationDialogType == "compass") - text: qsTr("Set autopilot orientation before calibrating.") - } - - Column { - visible: boardRotationHelp.visible - QGCLabel { text: qsTr("Autopilot Orientation") } - - FactComboBox { - sizeToContents: true - model: rotations - fact: sens_board_rot - } - - QGCLabel { - wrapMode: Text.WordWrap - text: qsTr("ROTATION_NONE indicates component points in direction of flight.") - } - } - - QGCLabel { - wrapMode: Text.WordWrap - text: qsTr("Click Ok to start calibration.") - } - } - } - } - } - - property bool setOrientationsDialogShowBoardOrientation: true - - Component { - id: setOrientationsDialogComponent - - QGCPopupDialog { - buttons: StandardButton.Ok - - property bool showRebootVehicleButton: true - - ColumnLayout { - spacing: ScreenTools.defaultFontPixelHeight - - QGCLabel { - text: qsTr("Reboot the vehicle prior to flight.") - visible: showRebootVehicleButton - } - - QGCButton { - text: qsTr("Reboot Vehicle") - visible: showRebootVehicleButton - onClicked: { controller.vehicle.rebootVehicle(); close() } - } - - QGCLabel { - text: qsTr("Adjust orientations as needed.\n\nROTATION_NONE indicates component points in direction of flight.") - visible: _boardOrientationChangeAllowed || (_compassOrientationChangeAllowed && currentExternalMagCount() !== 0) - } - - Column { - visible: _boardOrientationChangeAllowed - - QGCLabel { - text: qsTr("Autopilot Orientation") - } + width: parent.width + visible: boardRotationHelp.visible + QGCLabel { text: qsTr("Autopilot Orientation") } FactComboBox { sizeToContents: true model: rotations fact: sens_board_rot } + + QGCLabel { + width: parent.width + wrapMode: Text.WordWrap + text: qsTr("ROTATION_NONE indicates component points in direction of flight.") + } } - Repeater { - model: _compassOrientationChangeAllowed ? currentMagParamCount() : 0 + QGCLabel { + width: parent.width + wrapMode: Text.WordWrap + text: qsTr("Click Ok to start calibration.") + } + } + } + } + + property bool setOrientationsDialogShowBoardOrientation: true + property bool setOrientationsDialogShowReboot: true + + Component { + id: setOrientationsDialogComponent + + QGCViewDialog { + id: setOrientationsDialog + + QGCFlickable { + anchors.fill: parent + contentHeight: columnLayout.height + clip: true + + Column { + id: columnLayout + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + spacing: ScreenTools.defaultFontPixelHeight + + QGCLabel { + width: parent.width + wrapMode: Text.WordWrap + text: qsTr("Reboot the vehicle prior to flight.") + visible: setOrientationsDialogShowReboot + } + + QGCButton { + text: qsTr("Reboot Vehicle") + visible: setOrientationsDialogShowReboot + onClicked: { + controller.vehicle.rebootVehicle() + hideDialog() + } + } + + QGCLabel { + width: parent.width + wrapMode: Text.WordWrap + text: qsTr("Adjust orientations as needed.\n\nROTATION_NONE indicates component points in direction of flight.") + visible: _boardOrientationChangeAllowed || (_compassOrientationChangeAllowed && currentExternalMagCount() !== 0) + + Component.onCompleted: console.log(_boardOrientationChangeAllowed, _compassOrientationChangeAllowed, currentExternalMagCount()) + } Column { - // id > = signals compass available, rot < 0 signals internal compass - visible: calMagIdFact.value > 0 && calMagRotFact.value >= 0 - - property Fact calMagIdFact: controller.getParameterFact(-1, _calMagIdParamFormat.replace("#", index)) - property Fact calMagRotFact: controller.getParameterFact(-1, _calMagRotParamFormat.replace("#", index)) + visible: _boardOrientationChangeAllowed QGCLabel { - text: qsTr("Mag %1 Orientation").arg(index) + text: qsTr("Autopilot Orientation") } FactComboBox { sizeToContents: true model: rotations - fact: parent.calMagRotFact + fact: sens_board_rot } } - } - } // Column - } // QGCPopupDialog + + Repeater { + model: _compassOrientationChangeAllowed ? currentMagParamCount() : 0 + + Column { + // id > = signals compass available, rot < 0 signals internal compass + visible: calMagIdFact.value > 0 && calMagRotFact.value >= 0 + + property Fact calMagIdFact: controller.getParameterFact(-1, _calMagIdParamFormat.replace("#", index)) + property Fact calMagRotFact: controller.getParameterFact(-1, _calMagRotParamFormat.replace("#", index)) + + QGCLabel { + text: qsTr("Mag %1 Orientation").arg(index) + } + + FactComboBox { + sizeToContents: true + model: rotations + fact: parent.calMagRotFact + } + } + } + } // Column + } // QGCFlickable + } // QGCViewDialog } // Component - setOrientationsDialogComponent QGCFlickable { @@ -401,7 +407,7 @@ Item { onClicked: { preCalibrationDialogType = "compass" preCalibrationDialogHelp = compassHelp - preCalibrationDialogComponent.createObject(mainWindow, { title: qsTr("Calibrate Compass") }).open() + mainWindow.showComponentDialog(preCalibrationDialogComponent, qsTr("Calibrate Compass"), mainWindow.showDialogDefaultWidth, StandardButton.Cancel | StandardButton.Ok) } } @@ -415,7 +421,7 @@ Item { onClicked: { preCalibrationDialogType = "gyro" preCalibrationDialogHelp = gyroHelp - preCalibrationDialogComponent.createObject(mainWindow, { title: qsTr("Calibrate Gyro") }).open() + mainWindow.showComponentDialog(preCalibrationDialogComponent, qsTr("Calibrate Gyro"), mainWindow.showDialogDefaultWidth, StandardButton.Cancel | StandardButton.Ok) } } @@ -429,7 +435,7 @@ Item { onClicked: { preCalibrationDialogType = "accel" preCalibrationDialogHelp = accelHelp - preCalibrationDialogComponent.createObject(mainWindow, { title: qsTr("Calibrate Accelerometer") }).open() + mainWindow.showComponentDialog(preCalibrationDialogComponent, qsTr("Calibrate Accelerometer"), mainWindow.showDialogDefaultWidth, StandardButton.Cancel | StandardButton.Ok) } } @@ -444,7 +450,7 @@ Item { onClicked: { preCalibrationDialogType = "level" preCalibrationDialogHelp = levelHelp - preCalibrationDialogComponent.createObject(mainWindow, { title: qsTr("Level Horizon") }).open() + mainWindow.showComponentDialog(preCalibrationDialogComponent, qsTr("Level Horizon"), mainWindow.showDialogDefaultWidth, StandardButton.Cancel | StandardButton.Ok) } } @@ -462,7 +468,7 @@ Item { onClicked: { preCalibrationDialogType = "airspeed" preCalibrationDialogHelp = airspeedHelp - preCalibrationDialogComponent.createObject(mainWindow, { title: qsTr("Calibrate Airspeed") }).open() + mainWindow.showComponentDialog(preCalibrationDialogComponent, qsTr("Calibrate Airspeed"), mainWindow.showDialogDefaultWidth, StandardButton.Cancel | StandardButton.Ok) } } @@ -490,8 +496,9 @@ Item { visible: orientationsButtonVisible() onClicked: { - setOrientationsDialogShowBoardOrientation = true - setOrientationsDialogComponent.createObject(mainWindow, { title: qsTr("Set Orientations"), showRebootVehicleButton: false }).open() + setOrientationsDialogShowBoardOrientation = true + setOrientationsDialogShowReboot = false + mainWindow.showComponentDialog(setOrientationsDialogComponent, qsTr("Set Orientations"), mainWindow.showDialogDefaultWidth, StandardButton.Ok) } } } // Column - Buttons diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b57b40f..cb7301c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -33,7 +33,6 @@ if(BUILD_TESTING) add_subdirectory(qgcunittest) add_qgc_test(ComponentInformationCacheTest) - add_qgc_test(ComponentInformationTranslationTest) add_qgc_test(CameraCalcTest) add_qgc_test(CameraSectionTest) add_qgc_test(CorridorScanComplexItemTest) @@ -85,8 +84,6 @@ add_library(qgc QGC.h QGCApplication.cc QGCApplication.h - QGCCachedFileDownload.cc - QGCCachedFileDownload.h QGCComboBox.cc QGCComboBox.h QGCConfig.h @@ -120,6 +117,7 @@ set_source_files_properties(QGCApplication.cc PROPERTIES COMPILE_DEFINITIONS APP add_subdirectory(ui) add_subdirectory(ADSB) +add_subdirectory(Airmap) add_subdirectory(AnalyzeView) add_subdirectory(api) add_subdirectory(Audio) @@ -164,13 +162,13 @@ target_link_libraries(qgc Qt5::Widgets ADSB + Airmap AnalyzeView api Audio AutoPilotPlugins Camera comm - compression FactSystem FirmwarePlugin FlightMap diff --git a/src/Camera/QGCCameraControl.cc b/src/Camera/QGCCameraControl.cc index ba3af30..6c7ef68 100644 --- a/src/Camera/QGCCameraControl.cc +++ b/src/Camera/QGCCameraControl.cc @@ -11,8 +11,6 @@ #include "VideoManager.h" #include "QGCMapEngine.h" #include "QGCCameraManager.h" -#include "FTPManager.h" -#include "QGCLZMA.h" #include #include @@ -728,10 +726,6 @@ QGCCameraControl::_mavCommandResult(int vehicleId, int component, int command, i qCDebug(CameraControlLog) << "Command failed for" << command; } switch(command) { - case MAV_CMD_RESET_CAMERA_SETTINGS: - _resetting = false; - qCDebug(CameraControlLog) << "Failed to reset camera settings"; - break; case MAV_CMD_IMAGE_START_CAPTURE: case MAV_CMD_IMAGE_STOP_CAPTURE: if(++_captureInfoRetries < 3) { @@ -813,24 +807,20 @@ QGCCameraControl::_loadCameraDefinitionFile(QByteArray& bytes) QString errorMsg; QDomDocument doc; if(!doc.setContent(bytes, false, &errorMsg, &errorLine)) { - qCCritical(CameraControlLog) << "Unable to parse camera definition file on line:" << errorLine; - qCCritical(CameraControlLog) << errorMsg; + qCritical() << "Unable to parse camera definition file on line:" << errorLine; + qCritical() << errorMsg; return false; } //-- Load camera constants QDomNodeList defElements = doc.elementsByTagName(kDefnition); if(!defElements.size() || !_loadConstants(defElements)) { - qCWarning(CameraControlLog) << "Unable to load camera constants from camera definition"; + qWarning() << "Unable to load camera constants from camera definition"; return false; } //-- Load camera parameters QDomNodeList paramElements = doc.elementsByTagName(kParameters); - if(!paramElements.size()) { - qCDebug(CameraControlLog) << "No parameters to load from camera"; - return false; - } - if(!_loadSettings(paramElements)) { - qCWarning(CameraControlLog) << "Unable to load camera parameters from camera definition"; + if(!paramElements.size() || !_loadSettings(paramElements)) { + qWarning() << "Unable to load camera parameters from camera definition"; return false; } //-- If this is new, cache it @@ -1960,28 +1950,8 @@ QGCCameraControl::_handleDefinitionFile(const QString &url) { //-- First check and see if we have it cached QFile xmlFile(_cacheFile); - - QString ftpPrefix(QStringLiteral("%1://").arg(FTPManager::mavlinkFTPScheme)); - if (!xmlFile.exists() && url.startsWith(ftpPrefix, Qt::CaseInsensitive)) { - qCDebug(CameraControlLog) << "No camera definition file cached, attempt ftp download"; - int ver = static_cast(_info.cam_definition_version); - QString ext = ""; - if (url.endsWith(".lzma", Qt::CaseInsensitive)) { ext = ".lzma"; } - if (url.endsWith(".xz", Qt::CaseInsensitive)) { ext = ".xz"; } - QString fileName = QString::asprintf("%s_%s_%03d.xml%s", - _vendor.toStdString().c_str(), - _modelName.toStdString().c_str(), - ver, - ext.toStdString().c_str()); - connect(_vehicle->ftpManager(), &FTPManager::downloadComplete, this, &QGCCameraControl::_ftpDownloadComplete); - _vehicle->ftpManager()->download(_compID, url, - qgcApp()->toolbox()->settingsManager()->appSettings()->parameterSavePath().toStdString().c_str(), - fileName); - return; - } - if (!xmlFile.exists()) { - qCDebug(CameraControlLog) << "No camera definition file cached, attempt http download"; + qCDebug(CameraControlLog) << "No camera definition file cached"; _httpRequest(url); return; } @@ -2050,40 +2020,6 @@ QGCCameraControl::_downloadFinished() //reply->deleteLater(); } -void QGCCameraControl::_ftpDownloadComplete(const QString& fileName, const QString& errorMsg) -{ - qCDebug(CameraControlLog) << "FTP Download completed: " << fileName << ", " << errorMsg; - - disconnect(_vehicle->ftpManager(), &FTPManager::downloadComplete, this, &QGCCameraControl::_ftpDownloadComplete); - - QString outputFileName = fileName; - - if (fileName.endsWith(".lzma", Qt::CaseInsensitive) || fileName.endsWith(".xz", Qt::CaseInsensitive)) { - outputFileName = fileName.left(fileName.lastIndexOf(".")); - if (QGCLZMA::inflateLZMAFile(fileName, outputFileName)) { - QFile(fileName).remove(); - } else { - qCWarning(CameraControlLog) << "Inflate of compressed xml failed" << fileName; - outputFileName.clear(); - } - } - - QFile xmlFile(outputFileName); - - if (!xmlFile.exists()) { - qCDebug(CameraControlLog) << "No camera definition file present after ftp download completed"; - return; - } - if (!xmlFile.open(QIODevice::ReadOnly)) { - qWarning() << "Could not read downloaded camera definition file: " << fileName; - return; - } - - _cached = true; - QByteArray bytes = xmlFile.readAll(); - emit dataReady(bytes); -} - //----------------------------------------------------------------------------- void QGCCameraControl::_dataReady(QByteArray data) diff --git a/src/Camera/QGCCameraControl.h b/src/Camera/QGCCameraControl.h index b9e13bf..b5a25bb 100644 --- a/src/Camera/QGCCameraControl.h +++ b/src/Camera/QGCCameraControl.h @@ -372,7 +372,6 @@ private: void _updateRanges (Fact* pFact); void _httpRequest (const QString& url); void _handleDefinitionFile (const QString& url); - void _ftpDownloadComplete (const QString& fileName, const QString& errorMsg); QStringList _loadExclusions (QDomNode option); QStringList _loadUpdates (QDomNode option); diff --git a/src/Camera/QGCCameraManager.cc b/src/Camera/QGCCameraManager.cc index ef36857..cfe72d6 100644 --- a/src/Camera/QGCCameraManager.cc +++ b/src/Camera/QGCCameraManager.cc @@ -109,6 +109,8 @@ QGCCameraManager::_mavlinkMessageReceived(const mavlink_message_t& message) void QGCCameraManager::_handleHeartbeat(const mavlink_message_t &message) { + mavlink_heartbeat_t heartbeat; + mavlink_msg_heartbeat_decode(&message, &heartbeat); //-- First time hearing from this one? QString sCompID = QString::number(message.compid); if(!_cameraInfoRequest.contains(sCompID)) { diff --git a/src/FactSystem/Fact.cc b/src/FactSystem/Fact.cc index 7b6b43e..502e047 100644 --- a/src/FactSystem/Fact.cc +++ b/src/FactSystem/Fact.cc @@ -278,7 +278,6 @@ void Fact::setEnumInfo(const QStringList& strings, const QVariantList& values) { if (_metaData) { _metaData->setEnumInfo(strings, values); - emit enumsChanged(); } else { qWarning() << kMissingMetadata << name(); } diff --git a/src/FactSystem/FactControls/FactComboBox.qml b/src/FactSystem/FactControls/FactComboBox.qml index 5b99f8a..db5d31d 100644 --- a/src/FactSystem/FactControls/FactComboBox.qml +++ b/src/FactSystem/FactControls/FactComboBox.qml @@ -14,17 +14,6 @@ QGCComboBox { currentIndex: fact ? (indexModel ? fact.value : fact.enumIndex) : 0 - onModelChanged: { - // When the model changes, the index gets reset to 0, so make sure to - // restore it correctly. - // Since enumIndex could trigger a model change, we use callLater() to - // avoid an event binding loop (the 2. call will for certain not trigger - // another model change) - Qt.callLater(function() { - currentIndex = fact ? (indexModel ? fact.value : fact.enumIndex) : 0 - }) - } - onActivated: { if (indexModel) { fact.value = index diff --git a/src/FactSystem/FactControls/FactTextField.qml b/src/FactSystem/FactControls/FactTextField.qml index d22500b..f4d30c5 100644 --- a/src/FactSystem/FactControls/FactTextField.qml +++ b/src/FactSystem/FactControls/FactTextField.qml @@ -11,11 +11,10 @@ import QGroundControl.ScreenTools 1.0 QGCTextField { id: _textField - text: fact ? fact.valueString : "" - unitsLabel: fact ? fact.units : "" - showUnits: true - showHelp: true - numericValuesOnly: fact && !fact.typeIsString + text: fact ? fact.valueString : "" + unitsLabel: fact ? fact.units : "" + showUnits: true + showHelp: true signal updated() @@ -23,6 +22,10 @@ QGCTextField { property string _validateString + inputMethodHints: ((fact && fact.typeIsString) || ScreenTools.isiOS) ? + Qt.ImhNone : // iOS numeric keyboard has no done button, we can't use it + Qt.ImhFormattedNumbersOnly // Forces use of virtual numeric keyboard + onEditingFinished: { var errorString = fact.validate(text, false /* convertOnly */) if (errorString === "") { @@ -30,17 +33,15 @@ QGCTextField { _textField.updated() } else { _validateString = text - validationErrorDialogComponent.createObject(mainWindow).open() + mainWindow.showComponentDialog(validationErrorDialogComponent, qsTr("Invalid Value"), mainWindow.showDialogDefaultWidth, StandardButton.Save | StandardButton.Cancel) } } - onHelpClicked: helpDialogComponent.createObject(mainWindow).open() + onHelpClicked: mainWindow.showComponentDialog(helpDialogComponent, qsTr("Value Details"), mainWindow.showDialogDefaultWidth, StandardButton.Save | StandardButton.Cancel) Component { id: validationErrorDialogComponent - ParameterEditorDialog { - title: qsTr("Invalid Value") validate: true validateValue: _validateString fact: _textField.fact @@ -49,10 +50,8 @@ QGCTextField { Component { id: helpDialogComponent - ParameterEditorDialog { - title: qsTr("Value Details") - fact: _textField.fact + fact: _textField.fact } } } diff --git a/src/FactSystem/FactControls/FactValueSlider.qml b/src/FactSystem/FactControls/FactValueSlider.qml index c39e0b9..8cba109 100644 --- a/src/FactSystem/FactControls/FactValueSlider.qml +++ b/src/FactSystem/FactControls/FactValueSlider.qml @@ -97,7 +97,7 @@ Rectangle { onClicked: { valueListView.focus = true if (_currentIndex === index) { - editDialogComponent.createObject(mainWindow, { title: qsTr("Value Details") }).open() + mainWindow.showComponentDialog(editDialogComponent, qsTr("Value Details"), mainWindow.showDialogDefaultWidth, StandardButton.Save | StandardButton.Cancel) } else { _currentIndex = index valueListView.positionViewAtIndex(_currentIndex, ListView.Center) diff --git a/src/FactSystem/FactMetaData.cc b/src/FactSystem/FactMetaData.cc index 123d51e..0369b00 100644 --- a/src/FactSystem/FactMetaData.cc +++ b/src/FactSystem/FactMetaData.cc @@ -45,7 +45,7 @@ const char* FactMetaData::_jsonMetaDataFactsName = "QGC.MetaData. const char* FactMetaData::_enumStringsJsonKey = "enumStrings"; const char* FactMetaData::_enumValuesJsonKey = "enumValues"; -// This is the newer json format for enums and bitmasks. They are used by the new COMPONENT_METADATA parameter metadata for example. +// This is the newer json format for enums and bitmasks. They are used by the new COMPONENT_INFORMATION parameter metadata for example. const char* FactMetaData::_enumValuesArrayJsonKey = "values"; const char* FactMetaData::_enumBitmaskArrayJsonKey = "bitmask"; const char* FactMetaData::_enumValuesArrayValueJsonKey = "value"; @@ -153,7 +153,9 @@ FactMetaData::FactMetaData(QObject* parent) , _rawDefaultValue (0) , _defaultValueAvailable(false) , _rawMax (_maxForType()) + , _maxIsDefaultForType (true) , _rawMin (_minForType()) + , _minIsDefaultForType (true) , _rawTranslator (_defaultTranslator) , _cookedTranslator (_defaultTranslator) , _vehicleRebootRequired(false) @@ -175,7 +177,9 @@ FactMetaData::FactMetaData(ValueType_t type, QObject* parent) , _rawDefaultValue (0) , _defaultValueAvailable(false) , _rawMax (_maxForType()) + , _maxIsDefaultForType (true) , _rawMin (_minForType()) + , _minIsDefaultForType (true) , _rawTranslator (_defaultTranslator) , _cookedTranslator (_defaultTranslator) , _vehicleRebootRequired(false) @@ -203,7 +207,9 @@ FactMetaData::FactMetaData(ValueType_t type, const QString name, QObject* parent , _rawDefaultValue (0) , _defaultValueAvailable(false) , _rawMax (_maxForType()) + , _maxIsDefaultForType (true) , _rawMin (_minForType()) + , _minIsDefaultForType (true) , _name (name) , _rawTranslator (_defaultTranslator) , _cookedTranslator (_defaultTranslator) @@ -232,7 +238,9 @@ const FactMetaData& FactMetaData::operator=(const FactMetaData& other) _group = other._group; _longDescription = other._longDescription; _rawMax = other._rawMax; + _maxIsDefaultForType = other._maxIsDefaultForType; _rawMin = other._rawMin; + _minIsDefaultForType = other._minIsDefaultForType; _name = other._name; _shortDescription = other._shortDescription; _type = other._type; @@ -284,6 +292,7 @@ void FactMetaData::setRawMin(const QVariant& rawMin) { if (isInRawMinLimit(rawMin)) { _rawMin = rawMin; + _minIsDefaultForType = false; } else { qWarning() << "Attempt to set min below allowable value for fact: " << name() << ", value attempted: " << rawMin @@ -296,10 +305,9 @@ void FactMetaData::setRawMax(const QVariant& rawMax) { if (isInRawMaxLimit(rawMax)) { _rawMax = rawMax; + _maxIsDefaultForType = false; } else { - qWarning() << "Attempt to set max above allowable value for fact: " << name() - << ", value attempted: " << rawMax - << ", type: " << type() << ", max for type: " << _maxForType(); + qWarning() << "Attempt to set max above allowable value"; _rawMax = _maxForType(); } } @@ -364,9 +372,9 @@ bool FactMetaData::isInRawMaxLimit(const QVariant& variantValue) const return true; } -QVariant FactMetaData::minForType(ValueType_t type) +QVariant FactMetaData::_minForType(void) const { - switch (type) { + switch (_type) { case valueTypeUint8: return QVariant(std::numeric_limits::min()); case valueTypeInt8: @@ -401,9 +409,9 @@ QVariant FactMetaData::minForType(ValueType_t type) return QVariant(); } -QVariant FactMetaData::maxForType(ValueType_t type) +QVariant FactMetaData::_maxForType(void) const { - switch (type) { + switch (_type) { case valueTypeUint8: return QVariant(std::numeric_limits::max()); case valueTypeInt8: @@ -1192,26 +1200,6 @@ QVariant FactMetaData::appSettingsWeightUnitsToGrams(const QVariant& weight) { } } -QVariant FactMetaData::metersSecondToAppSettingsSpeedUnits(const QVariant& metersSecond) -{ - const AppSettingsTranslation_s* pAppSettingsTranslation = _findAppSettingsUnitsTranslation("m/s", UnitSpeed); - if (pAppSettingsTranslation) { - return pAppSettingsTranslation->rawTranslator(metersSecond); - } else { - return metersSecond; - } -} - -QVariant FactMetaData::appSettingsSpeedUnitsToMetersSecond(const QVariant& speed) -{ - const AppSettingsTranslation_s* pAppSettingsTranslation = _findAppSettingsUnitsTranslation("m/s", UnitSpeed); - if (pAppSettingsTranslation) { - return pAppSettingsTranslation->cookedTranslator(speed); - } else { - return speed; - } -} - QString FactMetaData::appSettingsSpeedUnitsString() { const AppSettingsTranslation_s* pAppSettingsTranslation = _findAppSettingsUnitsTranslation("m/s", UnitSpeed); @@ -1349,7 +1337,7 @@ FactMetaData* FactMetaData::createFromJsonObject(const QJsonObject& json, QMapsetDecimalPlaces(json[_decimalPlacesJsonKey].toInt(kUnknownDecimalPlaces)); + metaData->setDecimalPlaces(json[_decimalPlacesJsonKey].toInt(0)); metaData->setShortDescription(json[_shortDescriptionJsonKey].toString()); metaData->setLongDescription(json[_longDescriptionJsonKey].toString()); diff --git a/src/FactSystem/FactMetaData.h b/src/FactSystem/FactMetaData.h index 0e2f981..6b12bc2 100644 --- a/src/FactSystem/FactMetaData.h +++ b/src/FactSystem/FactMetaData.h @@ -99,12 +99,6 @@ public: /// Returns the string for distance units which has configued by user static QString appSettingsAreaUnitsString(void); - /// Converts from meters/second to the user specified speed unit - static QVariant metersSecondToAppSettingsSpeedUnits(const QVariant& metersSecond); - - /// Converts from user specified speed unit to meters/second - static QVariant appSettingsSpeedUnitsToMetersSecond(const QVariant& speed); - /// Returns the string for speed units which has configued by user static QString appSettingsSpeedUnitsString(); @@ -124,10 +118,10 @@ public: QString longDescription (void) const { return _longDescription;} QVariant rawMax (void) const { return _rawMax; } QVariant cookedMax (void) const; - bool maxIsDefaultForType (void) const { return _rawMax == _maxForType(); } + bool maxIsDefaultForType (void) const { return _maxIsDefaultForType; } QVariant rawMin (void) const { return _rawMin; } QVariant cookedMin (void) const; - bool minIsDefaultForType (void) const { return _rawMin == _minForType(); } + bool minIsDefaultForType (void) const { return _minIsDefaultForType; } QString name (void) const { return _name; } QString shortDescription (void) const { return _shortDescription; } ValueType_t type (void) const { return _type; } @@ -212,14 +206,11 @@ public: static QString typeToString(ValueType_t type); static size_t typeToSize(ValueType_t type); - static QVariant minForType(ValueType_t type); - static QVariant maxForType(ValueType_t type); - static const char* qgcFileType; private: - QVariant _minForType (void) const { return minForType(_type); }; - QVariant _maxForType (void) const { return maxForType(_type); }; + QVariant _minForType (void) const; + QVariant _maxForType (void) const; void _setAppSettingsTranslators (void); /// Clamp a value to be within cookedMin and cookedMax @@ -323,7 +314,9 @@ private: QString _group; QString _longDescription; QVariant _rawMax; + bool _maxIsDefaultForType; QVariant _rawMin; + bool _minIsDefaultForType; QString _name; QString _shortDescription; QString _rawUnits; diff --git a/src/FactSystem/ParameterManager.cc b/src/FactSystem/ParameterManager.cc index 543cb4d..c229120 100644 --- a/src/FactSystem/ParameterManager.cc +++ b/src/FactSystem/ParameterManager.cc @@ -1,6 +1,6 @@ /**************************************************************************** * - * (c) 2009-2022 QGROUNDCONTROL PROJECT + * (c) 2009-2020 QGROUNDCONTROL PROJECT * * QGroundControl is licensed according to the terms in the file * COPYING.md in the root of the source code directory. @@ -17,7 +17,6 @@ #include "JsonHelper.h" #include "ComponentInformationManager.h" #include "CompInfoParam.h" -#include "FTPManager.h" #include #include @@ -66,6 +65,11 @@ const QHash _mavlinkCompIdHash { { MAV_COMP_ID_GPS2, "GPS2" } }; +const char* ParameterManager::_jsonParametersKey = "parameters"; +const char* ParameterManager::_jsonCompIdKey = "compId"; +const char* ParameterManager::_jsonParamNameKey = "name"; +const char* ParameterManager::_jsonParamValueKey = "value"; + ParameterManager::ParameterManager(Vehicle* vehicle) : QObject (vehicle) , _vehicle (vehicle) @@ -85,7 +89,6 @@ ParameterManager::ParameterManager(Vehicle* vehicle) , _disableAllRetries (false) , _indexBatchQueueActive (false) , _totalParamCount (0) - , _tryftp (vehicle->apmFirmware()) { if (_vehicle->isOfflineEditingVehicle()) { _loadOfflineEditingParams(); @@ -166,9 +169,6 @@ void ParameterManager::_updateProgressBar(void) void ParameterManager::mavlinkMessageReceived(mavlink_message_t message) { - if (_tryftp && message.compid == MAV_COMP_ID_AUTOPILOT1 && !_initialLoadComplete) - return; - if (message.msgid == MAVLINK_MSG_ID_PARAM_VALUE) { mavlink_param_value_t param_value; mavlink_msg_param_value_decode(&message, ¶m_value); @@ -443,63 +443,6 @@ void ParameterManager::_factRawValueUpdated(const QVariant& rawValue) _factRawValueUpdateWorker(fact->componentId(), fact->name(), fact->type(), rawValue); } -void ParameterManager::_ftpDownloadComplete(const QString& fileName, const QString& errorMsg) -{ - bool continueWithDefaultParameterdownload = true; - bool immediateRetry = false; - - disconnect(_vehicle->ftpManager(), &FTPManager::downloadComplete, this, &ParameterManager::_ftpDownloadComplete); - disconnect(_vehicle->ftpManager(), &FTPManager::commandProgress, this, &ParameterManager::_ftpDownloadProgress); - - if (errorMsg.isEmpty()) { - qCDebug(ParameterManagerLog) << "ParameterManager::_ftpDownloadComplete : Parameter file received:" << fileName; - if (_parseParamFile(fileName)) { - qCDebug(ParameterManagerLog) << "ParameterManager::_ftpDownloadComplete : Parsed!"; - return; - } else { - qCDebug(ParameterManagerLog) << "ParameterManager::_ftpDownloadComplete : Error in parameter file"; - /* This should not happen... */ - } - } else { - if (errorMsg.contains("File Not Found")) { - qCDebug(ParameterManagerLog) << "ParameterManager-ftp: No Parameterfile on vehicle - Start Conventional Parameter Download"; - if (_initialRequestRetryCount == 0) - immediateRetry = true; - } else if (_loadProgress > 0.0001 && _loadProgress < 0.01) { /* FTP supported but too slow */ - qCDebug(ParameterManagerLog) << "ParameterManager-ftp progress too slow - Start Conventional Parameter Download"; - } else if (_initialRequestRetryCount == 1) { - qCDebug(ParameterManagerLog) << "ParameterManager-ftp: Too many retries - Start Conventional Parameter Download"; - } else { - qCDebug(ParameterManagerLog) << "ParameterManager-ftp Retry: " << _initialRequestRetryCount; - continueWithDefaultParameterdownload = false; - } - } - - if (continueWithDefaultParameterdownload) { - _tryftp = false; - _initialRequestRetryCount = 0; - /* If we receive "File not Found" this indicates that the vehicle does not support - * the parameter download via ftp. If we received this without retry, then we - * can immediately response with the conventional parameter download request, because - * we have no indication of communication link congestion.*/ - if (immediateRetry) - _initialRequestTimeout(); - else - _initialRequestTimeoutTimer.start(); - } else - _initialRequestTimeoutTimer.start(); - -} - - -void ParameterManager::_ftpDownloadProgress(float progress) -{ - qCDebug(ParameterManagerVerbose1Log) << "ParameterManager::_ftpDownloadProgress: " << progress; - _setLoadProgress(static_cast(progress)); - if (progress > 0.001) - _initialRequestTimeoutTimer.stop(); -} - void ParameterManager::refreshAllParameters(uint8_t componentId) { WeakLinkInterfacePtr weakLink = _vehicle->vehicleLinkManager()->primaryLink(); @@ -522,42 +465,29 @@ void ParameterManager::refreshAllParameters(uint8_t componentId) _initialRequestTimeoutTimer.start(); } - if (_tryftp && (componentId == MAV_COMP_ID_ALL || componentId == MAV_COMP_ID_AUTOPILOT1)) { - FTPManager* ftpManager = _vehicle->ftpManager(); - connect(ftpManager, &FTPManager::downloadComplete, this, &ParameterManager::_ftpDownloadComplete); - _waitingParamTimeoutTimer.stop(); - if (ftpManager->download(MAV_COMP_ID_AUTOPILOT1, "@PARAM/param.pck", - QStandardPaths::writableLocation(QStandardPaths::TempLocation), - "", false /* No filesize check */)) { - connect(ftpManager, &FTPManager::commandProgress, this, &ParameterManager::_ftpDownloadProgress); - } else { - qCWarning(ParameterManagerLog) << "ParameterManager::refreshallParameters FTPManager::download returned failure"; - disconnect(ftpManager, &FTPManager::downloadComplete, this, &ParameterManager::_ftpDownloadComplete); + // Reset index wait lists + for (int cid: _paramCountMap.keys()) { + // Add/Update all indices to the wait list, parameter index is 0-based + if(componentId != MAV_COMP_ID_ALL && componentId != cid) + continue; + for (int waitingIndex = 0; waitingIndex < _paramCountMap[cid]; waitingIndex++) { + // This will add a new waiting index if needed and set the retry count for that index to 0 + _waitingReadParamIndexMap[cid][waitingIndex] = 0; } - } else { - // Reset index wait lists - for (int cid: _paramCountMap.keys()) { - // Add/Update all indices to the wait list, parameter index is 0-based - if(componentId != MAV_COMP_ID_ALL && componentId != cid) - continue; - for (int waitingIndex = 0; waitingIndex < _paramCountMap[cid]; waitingIndex++) { - // This will add a new waiting index if needed and set the retry count for that index to 0 - _waitingReadParamIndexMap[cid][waitingIndex] = 0; - } - } - MAVLinkProtocol* mavlink = qgcApp()->toolbox()->mavlinkProtocol(); - mavlink_message_t msg; - SharedLinkInterfacePtr sharedLink = weakLink.lock(); - - mavlink_msg_param_request_list_pack_chan(mavlink->getSystemId(), - mavlink->getComponentId(), - sharedLink->mavlinkChannel(), - &msg, - _vehicle->id(), - componentId); - _vehicle->sendMessageOnLinkThreadSafe(sharedLink.get(), msg); } + MAVLinkProtocol* mavlink = qgcApp()->toolbox()->mavlinkProtocol(); + mavlink_message_t msg; + SharedLinkInterfacePtr sharedLink = weakLink.lock(); + + mavlink_msg_param_request_list_pack_chan(mavlink->getSystemId(), + mavlink->getComponentId(), + sharedLink->mavlinkChannel(), + &msg, + _vehicle->id(), + componentId); + _vehicle->sendMessageOnLinkThreadSafe(sharedLink.get(), msg); + QString what = (componentId == MAV_COMP_ID_ALL) ? "MAV_COMP_ID_ALL" : QString::number(componentId); qCDebug(ParameterManagerLog) << _logVehiclePrefix(-1) << "Request to refresh all parameters for component ID:" << what; } @@ -1422,203 +1352,3 @@ bool ParameterManager::pendingWrites(void) return false; } - - -/* Parse the binary parameter file and inject the parameters in the qgc - * fact system. - * - * See: https://github.com/ArduPilot/ardupilot/tree/master/libraries/AP_Filesystem - * - */ -bool ParameterManager::_parseParamFile(const QString& filename) -{ - const quint16 magic_standard = 0x671B; - const quint16 magic_withdefaults = 0x671C; - quint32 no_of_parameters_found = 0; - const int componentId = MAV_COMP_ID_AUTOPILOT1; /* Only main autopilot for the moment */ - enum ap_var_type { - AP_PARAM_NONE = 0, - AP_PARAM_INT8, - AP_PARAM_INT16, - AP_PARAM_INT32, - AP_PARAM_FLOAT, - AP_PARAM_VECTOR3F, - AP_PARAM_GROUP - }; - - qCDebug(ParameterManagerLog) << "_parseParamFile: " << filename; - QFile file(filename); - if (!file.open(QIODevice::ReadOnly)) { - qCDebug(ParameterManagerLog) << "_parseParamFile: Error: Could not open downloaded parameter file."; - return false; - } - QDataStream in(&file); - in.setByteOrder(QDataStream::LittleEndian); - - quint16 magic, num_params, total_params; - in >> magic; - in >> num_params; - in >> total_params; - - if (in.status() != QDataStream::Ok) { - qCDebug(ParameterManagerLog) << "_parseParamFile: Error: Could not read Header"; - goto Error; - } - - qCDebug(ParameterManagerVerbose2Log) << "_parseParamFile: magic: 0x" << Qt::hex << magic; - qCDebug(ParameterManagerVerbose2Log) << "_parseParamFile: num_params:" << num_params - << " total_params:" << total_params; - - if ((magic != magic_standard) && (magic != magic_withdefaults)) { - qCDebug(ParameterManagerLog) << "_parseParamFile: Error: File does not start with Magic"; - goto Error; - } - if (num_params > total_params) { - qCDebug(ParameterManagerLog) << "_parseParamFile: Error: total_params > num_params"; - goto Error; - } - if (num_params != total_params) { - /* We requested all parameters, so this is an error here */ - qCDebug(ParameterManagerLog) << "_parseParamFile: Error: total_params != num_params"; - goto Error; - } - - while (in.status() == QDataStream::Ok) { - quint8 byte = 0; - quint8 flags = 0; - quint8 ptype = 0; - quint8 name_len = 0; - quint8 common_len = 0; - bool withdefault = false; - int no_read = 0; - char name_buffer[17]; - - while (byte == 0x0) { // Eat padding bytes - in >> byte; - if (in.status() != QDataStream::Ok) { - if (no_of_parameters_found == num_params) - goto Success; - else { - qCDebug(ParameterManagerLog) << "_parseParamFile: Error: unexpected EOF" - << "number of parameters expected:" << num_params - << "actual:" << no_of_parameters_found; - goto Error; - } - } - } - ptype = byte & 0x0F; - flags = (byte >> 4) & 0x0F; - withdefault = (flags & 0x01) == 0x01; - in >> byte; - if (in.status() != QDataStream::Ok) { - qCritical(ParameterManagerLog) << "_parseParamFile: Error: Unexpected EOF while reading flags"; - goto Error; - } - name_len = ((byte >> 4) & 0x0F) + 1; - common_len = byte & 0x0F; - if ((name_len + common_len) > 16) { - qCritical(ParameterManagerLog) << "_parseParamFile: Error: common_len + name_len > 16 " - << "name_len" << name_len - << "common_len" << common_len; - goto Error; - } - no_read = in.readRawData(&name_buffer[common_len], (int) name_len); - if (no_read != name_len) { - qCritical(ParameterManagerLog) << "_parseParamFile: Error: Unexpected EOF while reading parameterName" - << "Expected:" << name_len - << "Actual:" << no_read; - goto Error; - } - name_buffer[common_len + name_len] = '\0'; - QString parameterName(name_buffer); - qCDebug(ParameterManagerVerbose2Log) << "_parseParamFile: parameter" << parameterName - << "name_len" << name_len - << "common_len" << common_len - << "ptype" << ptype - << "flags" << flags; - - QVariant parameterValue = 0; - switch ((enum ap_var_type) ptype) { - qint8 data8; - qint16 data16; - qint32 data32; - float dfloat; - case AP_PARAM_INT8: - in >> data8; - parameterValue = data8; - if (withdefault) - in >> data8; - break; - case AP_PARAM_INT16: - in >> data16; - parameterValue = data16; - if (withdefault) - in >> data16; - break; - case AP_PARAM_INT32: - in >> data32; - parameterValue = data32; - if (withdefault) - in >> data32; - break; - case AP_PARAM_FLOAT: - in >> data32; - memcpy(&dfloat, &data32, 4); - parameterValue = dfloat; - if (withdefault) - in >> data32; - break; - default: - qCDebug(ParameterManagerLog) << "_parseParamFile: Error: type is out of range" << ptype; - goto Error; - break; - } - qCDebug(ParameterManagerVerbose2Log) << "paramValue" << parameterValue; - - if (++no_of_parameters_found > num_params){ - qCDebug(ParameterManagerLog) << "_parseParamFile: Error: more parameters in file than expected." - << "Expected:" << num_params - << "Actual:" << no_of_parameters_found; - goto Error; - } - - FactMetaData::ValueType_t factType = (ptype == AP_PARAM_INT8 ? FactMetaData::valueTypeInt8 : - ptype == AP_PARAM_INT16 ? FactMetaData::valueTypeInt16 : - ptype == AP_PARAM_INT32 ? FactMetaData::valueTypeInt32 : - FactMetaData::valueTypeFloat); - - Fact* fact = nullptr; - if (_mapCompId2FactMap.contains(componentId) && _mapCompId2FactMap[componentId].contains(parameterName)) { - fact = _mapCompId2FactMap[componentId][parameterName]; - } else { - qCDebug(ParameterManagerVerbose1Log) << _logVehiclePrefix(componentId) << "Adding new fact" << parameterName; - - fact = new Fact(componentId, parameterName, factType, this); - FactMetaData* factMetaData = _vehicle->compInfoManager()->compInfoParam(componentId)->factMetaDataForName(parameterName, fact->type()); - fact->setMetaData(factMetaData); - - _mapCompId2FactMap[componentId][parameterName] = fact; - - // We need to know when the fact value changes so we can update the vehicle - connect(fact, &Fact::_containerRawValueChanged, this, &ParameterManager::_factRawValueUpdated); - - emit factAdded(componentId, fact); - } - fact->_containerSetRawValue(parameterValue); - } -Success: - file.close(); - /* Create empty waiting lists as we have all parameters */ - _paramCountMap[componentId] = num_params; - _totalParamCount += num_params; - _waitingReadParamIndexMap[componentId] = QMap(); - _waitingReadParamNameMap[componentId] = QMap(); - _waitingWriteParamNameMap[componentId] = QMap(); - _checkInitialLoadComplete(); - _setLoadProgress(0.0); - return true; - -Error: - file.close(); - return false; -} diff --git a/src/FactSystem/ParameterManager.h b/src/FactSystem/ParameterManager.h index 01e9cda..fb06129 100644 --- a/src/FactSystem/ParameterManager.h +++ b/src/FactSystem/ParameterManager.h @@ -126,9 +126,6 @@ private: bool _fillIndexBatchQueue (bool waitingParamTimeout); void _updateProgressBar (void); void _checkInitialLoadComplete (void); - void _ftpDownloadComplete (const QString& fileName, const QString& errorMsg); - void _ftpDownloadProgress (float progress); - bool _parseParamFile (const QString& filename); static QVariant _stringToTypedVariant(const QString& string, FactMetaData::ValueType_t type, bool failOk = false); @@ -186,6 +183,8 @@ private: Fact _defaultFact; ///< Used to return default fact, when parameter not found - /* MavFTP */ - bool _tryftp; + static const char* _jsonParametersKey; + static const char* _jsonCompIdKey; + static const char* _jsonParamNameKey; + static const char* _jsonParamValueKey; }; diff --git a/src/FactSystem/ParameterManagerTest.cc b/src/FactSystem/ParameterManagerTest.cc index 61e0527..8b1b198 100644 --- a/src/FactSystem/ParameterManagerTest.cc +++ b/src/FactSystem/ParameterManagerTest.cc @@ -138,96 +138,3 @@ void ParameterManagerTest::_requestListMissingParamFail(void) // User should have been notified checkExpectedMessageBox(); } - -void ParameterManagerTest::_FTPnoFailure() -{ - Q_ASSERT(!_mockLink); - _mockLink = MockLink::startAPMArduPlaneMockLink(false, MockConfiguration::FailParamNoReponseToRequestList); - _mockLink->mockLinkFTP()->enableBinParamFile(true); - MultiVehicleManager* vehicleMgr = qgcApp()->toolbox()->multiVehicleManager(); - QVERIFY(vehicleMgr); - - // Wait for the Vehicle to get created - QSignalSpy spyVehicle(vehicleMgr, SIGNAL(activeVehicleAvailableChanged(bool))); - // When param load is complete we get the param ready signal - QSignalSpy spyParamsReady(vehicleMgr, SIGNAL(parameterReadyVehicleAvailableChanged(bool))); - QCOMPARE(spyVehicle.wait(5000), true); - QCOMPARE(spyVehicle.count(), 1); - QList arguments = spyVehicle.takeFirst(); - QCOMPARE(arguments.count(), 1); - QCOMPARE(arguments.at(0).toBool(), true); - Vehicle* vehicle = vehicleMgr->activeVehicle(); - QVERIFY(vehicle); - - spyParamsReady.wait(5000); - QCOMPARE(spyParamsReady.count(), 1); - arguments = spyParamsReady.takeFirst(); - QCOMPARE(arguments.count(), 1); - QCOMPARE(arguments.at(0).toBool(), true); - - // Request all parameters again and check the progress bar. The initial parameterdownload - // is so fast that I cannot connect to the loadprogress early enough. - QSignalSpy spyProgress(vehicle->parameterManager(), SIGNAL(loadProgressChanged(float))); - vehicle->parameterManager()->refreshAllParameters(); - spyParamsReady.wait(5000); - QVERIFY(spyProgress.count() > 1); - arguments = spyProgress.takeFirst(); - QCOMPARE(arguments.count(), 1); - QVERIFY(arguments.at(0).toFloat() > 0.0f); - // Progress should have been set back to 0 - arguments = spyProgress.takeLast(); - QCOMPARE(arguments.count(), 1); - QCOMPARE(arguments.at(0).toFloat(), 0.0f); -} - -void ParameterManagerTest::_FTPChangeParam() -{ - Q_ASSERT(!_mockLink); - _mockLink = MockLink::startAPMArduPlaneMockLink(false, MockConfiguration::FailParamNoReponseToRequestList); - _mockLink->mockLinkFTP()->enableBinParamFile(true); - MultiVehicleManager* vehicleMgr = qgcApp()->toolbox()->multiVehicleManager(); - QVERIFY(vehicleMgr); - - // Wait for the Vehicle to get created - QSignalSpy spyVehicle(vehicleMgr, SIGNAL(activeVehicleAvailableChanged(bool))); - // When param load is complete we get the param ready signal - QSignalSpy spyParamsReady(vehicleMgr, SIGNAL(parameterReadyVehicleAvailableChanged(bool))); - QCOMPARE(spyVehicle.wait(5000), true); - QCOMPARE(spyVehicle.count(), 1); - QList arguments = spyVehicle.takeFirst(); - QCOMPARE(arguments.count(), 1); - QCOMPARE(arguments.at(0).toBool(), true); - Vehicle* vehicle = vehicleMgr->activeVehicle(); - QVERIFY(vehicle); - - if (spyParamsReady.count() == 0) - spyParamsReady.wait(5000); - QCOMPARE(spyParamsReady.count(), 1); - arguments = spyParamsReady.takeFirst(); - QCOMPARE(arguments.count(), 1); - QCOMPARE(arguments.at(0).toBool(), true); - - // Now try to change a parameter and check the progress - QSignalSpy spyProgress(vehicle->parameterManager(), SIGNAL(loadProgressChanged(float))); - Fact* fact = vehicle->parameterManager()->getParameter(MAV_COMP_ID_AUTOPILOT1, "THR_MIN"); - QVERIFY(fact); - float value = fact->rawValue().toFloat(); - QCOMPARE(value, 0.0); - float testvalue = 0.87f; - QVariant sendv = testvalue; - fact->setRawValue(sendv); // This should trigger a parameter upload to the vehicle - /* That should set the progress to 0.5 and then back to 0 */ - spyProgress.wait(1000); - if (spyProgress.count() < 2) - spyProgress.wait(1000); - QCOMPARE(spyProgress.count(), 2); - arguments = spyProgress.takeFirst(); - QCOMPARE(arguments.count(), 1); - QVERIFY(arguments.at(0).toFloat() > 0.4f); - - // Progress should have been set back to 0 - Q_ASSERT(!spyProgress.empty()); - arguments = spyProgress.takeLast(); - QCOMPARE(arguments.count(), 1); - QCOMPARE(arguments.at(0).toFloat(), 0.0f); -} diff --git a/src/FactSystem/ParameterManagerTest.h b/src/FactSystem/ParameterManagerTest.h index 49b8608..1a388ff 100644 --- a/src/FactSystem/ParameterManagerTest.h +++ b/src/FactSystem/ParameterManagerTest.h @@ -25,9 +25,6 @@ private slots: void _requestListNoResponse(void); void _requestListMissingParamSuccess(void); void _requestListMissingParamFail(void); - void _FTPnoFailure(void); - void _FTPChangeParam(void); - private: void _noFailureWorker(MockConfiguration::FailureMode_t failureMode); diff --git a/src/FirmwarePlugin/APM/APMFirmwarePlugin.cc b/src/FirmwarePlugin/APM/APMFirmwarePlugin.cc index 4e0fdef..b1af785 100644 --- a/src/FirmwarePlugin/APM/APMFirmwarePlugin.cc +++ b/src/FirmwarePlugin/APM/APMFirmwarePlugin.cc @@ -77,7 +77,7 @@ AutoPilotPlugin* APMFirmwarePlugin::autopilotPlugin(Vehicle* vehicle) bool APMFirmwarePlugin::isCapable(const Vehicle* vehicle, FirmwareCapabilities capabilities) { - uint32_t available = SetFlightModeCapability | PauseVehicleCapability | GuidedModeCapability | ROIModeCapability; + uint32_t available = SetFlightModeCapability | PauseVehicleCapability | GuidedModeCapability; if (vehicle->multiRotor()) { available |= TakeoffVehicleCapability; } else if (vehicle->vtol()) { @@ -471,12 +471,12 @@ void APMFirmwarePlugin::initializeVehicle(Vehicle* vehicle) case MAV_TYPE_HELICOPTER: vehicle->setFirmwareVersion(3, 6, 0); break; - case MAV_TYPE_VTOL_TAILSITTER_DUOROTOR: - case MAV_TYPE_VTOL_TAILSITTER_QUADROTOR: + case MAV_TYPE_VTOL_DUOROTOR: + case MAV_TYPE_VTOL_QUADROTOR: case MAV_TYPE_VTOL_TILTROTOR: - case MAV_TYPE_VTOL_FIXEDROTOR: - case MAV_TYPE_VTOL_TAILSITTER: - case MAV_TYPE_VTOL_TILTWING: + case MAV_TYPE_VTOL_RESERVED2: + case MAV_TYPE_VTOL_RESERVED3: + case MAV_TYPE_VTOL_RESERVED4: case MAV_TYPE_VTOL_RESERVED5: case MAV_TYPE_FIXED_WING: vehicle->setFirmwareVersion(3, 9, 0); @@ -630,26 +630,6 @@ QString APMFirmwarePlugin::getHobbsMeter(Vehicle* vehicle) return timeStr; } -bool APMFirmwarePlugin::hasGripper(const Vehicle* vehicle) const -{ - if(vehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, "GRIP_ENABLE")) { - bool _hasGripper = (vehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, QStringLiteral("GRIP_ENABLE"))->rawValue().toInt()) == 1 ? true : false; - return _hasGripper; - } - return false; -} - -const QVariantList& APMFirmwarePlugin::toolIndicators(const Vehicle* vehicle) -{ - if (_toolIndicatorList.size() == 0) { - // First call the base class to get the standard QGC list - _toolIndicatorList = FirmwarePlugin::toolIndicators(vehicle); - // Then add the forwarding support indicator - _toolIndicatorList.append(QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/APMSupportForwardingIndicator.qml"))); - } - return _toolIndicatorList; -} - bool APMFirmwarePlugin::isGuidedMode(const Vehicle* vehicle) const { return vehicle->flightMode() == "Guided"; @@ -677,9 +657,6 @@ QString APMFirmwarePlugin::_internalParameterMetaDataFile(Vehicle* vehicle) case MAV_TYPE_TRICOPTER: case MAV_TYPE_COAXIAL: case MAV_TYPE_HELICOPTER: - if (vehicle->versionCompare(4, 2, 0) >= 0) { - return QStringLiteral(":/FirmwarePlugin/APM/APMParameterFactMetaData.Copter.4.2.xml"); - } if (vehicle->versionCompare(4, 1, 0) >= 0) { return QStringLiteral(":/FirmwarePlugin/APM/APMParameterFactMetaData.Copter.4.1.xml"); } @@ -694,17 +671,14 @@ QString APMFirmwarePlugin::_internalParameterMetaDataFile(Vehicle* vehicle) } return QStringLiteral(":/FirmwarePlugin/APM/APMParameterFactMetaData.Copter.3.5.xml"); - case MAV_TYPE_VTOL_TAILSITTER_DUOROTOR: - case MAV_TYPE_VTOL_TAILSITTER_QUADROTOR: + case MAV_TYPE_VTOL_DUOROTOR: + case MAV_TYPE_VTOL_QUADROTOR: case MAV_TYPE_VTOL_TILTROTOR: - case MAV_TYPE_VTOL_FIXEDROTOR: - case MAV_TYPE_VTOL_TAILSITTER: - case MAV_TYPE_VTOL_TILTWING: + case MAV_TYPE_VTOL_RESERVED2: + case MAV_TYPE_VTOL_RESERVED3: + case MAV_TYPE_VTOL_RESERVED4: case MAV_TYPE_VTOL_RESERVED5: case MAV_TYPE_FIXED_WING: - if (vehicle->versionCompare(4, 2, 0) >= 0) { - return QStringLiteral(":/FirmwarePlugin/APM/APMParameterFactMetaData.Plane.4.2.xml"); - } if (vehicle->versionCompare(4, 1, 0) >= 0) { return QStringLiteral(":/FirmwarePlugin/APM/APMParameterFactMetaData.Plane.4.1.xml"); } @@ -721,9 +695,6 @@ QString APMFirmwarePlugin::_internalParameterMetaDataFile(Vehicle* vehicle) case MAV_TYPE_GROUND_ROVER: case MAV_TYPE_SURFACE_BOAT: - if (vehicle->versionCompare(4, 2, 0) >= 0) { - return QStringLiteral(":/FirmwarePlugin/APM/APMParameterFactMetaData.Rover.4.2.xml"); - } if (vehicle->versionCompare(4, 1, 0) >= 0) { return QStringLiteral(":/FirmwarePlugin/APM/APMParameterFactMetaData.Rover.4.1.xml"); } @@ -773,29 +744,6 @@ void APMFirmwarePlugin::pauseVehicle(Vehicle* vehicle) _setFlightModeAndValidate(vehicle, pauseFlightMode()); } -typedef struct { - Vehicle* vehicle; -} MAV_CMD_DO_REPOSITION_HandlerData_t; - -static void _MAV_CMD_DO_REPOSITION_ResultHandler(void* resultHandlerData, int /*compId*/, const mavlink_command_ack_t& ack, Vehicle::MavCmdResultFailureCode_t /*failureCode*/) -{ - auto* data = (MAV_CMD_DO_REPOSITION_HandlerData_t*)resultHandlerData; - auto* vehicle = data->vehicle; - auto* instanceData = qobject_cast(vehicle->firmwarePluginInstanceData()); - - if (instanceData->MAV_CMD_DO_REPOSITION_supported || - instanceData->MAV_CMD_DO_REPOSITION_unsupported) { - // we never change out minds once set - goto out; - } - - instanceData->MAV_CMD_DO_REPOSITION_supported = (ack.result == MAV_RESULT_ACCEPTED); - instanceData->MAV_CMD_DO_REPOSITION_unsupported = (ack.result == MAV_RESULT_UNSUPPORTED); - -out: - delete data; -} - void APMFirmwarePlugin::guidedModeGotoLocation(Vehicle* vehicle, const QGeoCoordinate& gotoCoord) { if (qIsNaN(vehicle->altitudeRelative()->rawValue().toDouble())) { @@ -803,43 +751,6 @@ void APMFirmwarePlugin::guidedModeGotoLocation(Vehicle* vehicle, const QGeoCoord return; } - // attempt to use MAV_CMD_DO_REPOSITION to move vehicle. If that - // comes back as unsupported, try using the old system of sending - // through mission items with custom "current" field values. - auto* instanceData = qobject_cast(vehicle->firmwarePluginInstanceData()); - - // if we know it is supported or we don't know for sure it is - // unsupported then send the command: - if (instanceData) { - if (instanceData->MAV_CMD_DO_REPOSITION_supported || - !instanceData->MAV_CMD_DO_REPOSITION_unsupported) { - auto* result_handler_data = new MAV_CMD_DO_REPOSITION_HandlerData_t{ - vehicle - }; - - Vehicle::MavCmdAckHandlerInfo_t handlerInfo = {}; - handlerInfo.resultHandler = _MAV_CMD_DO_REPOSITION_ResultHandler; - handlerInfo.resultHandlerData = result_handler_data; - - vehicle->sendMavCommandIntWithHandler( - &handlerInfo, - vehicle->defaultComponentId(), - MAV_CMD_DO_REPOSITION, - MAV_FRAME_GLOBAL, - -1.0f, - MAV_DO_REPOSITION_FLAGS_CHANGE_MODE, - 0.0f, - NAN, - gotoCoord.latitude(), - gotoCoord.longitude(), - vehicle->altitudeAMSL()->rawValue().toFloat() - ); - } - if (instanceData->MAV_CMD_DO_REPOSITION_supported) { - // no need to fall back - return; - } - } setGuidedMode(vehicle, true); @@ -970,18 +881,9 @@ void APMFirmwarePlugin::startMission(Vehicle* vehicle) if (!vehicle->armed()) { // First switch to flight mode we can arm from - // In Ardupilot for vtols and airplanes we need to set the mode to auto and then arm, otherwise if arming in guided - // If the vehicle has tilt rotors, it will arm them in forward flight position, being dangerous. - if (vehicle->fixedWing()) { - if (!_setFlightModeAndValidate(vehicle, "Auto")) { - qgcApp()->showAppMessage(tr("Unable to start mission: Vehicle failed to change to Auto mode.")); - return; - } - } else { - if (!_setFlightModeAndValidate(vehicle, "Guided")) { - qgcApp()->showAppMessage(tr("Unable to start mission: Vehicle failed to change to Guided mode.")); - return; - } + if (!_setFlightModeAndValidate(vehicle, "Guided")) { + qgcApp()->showAppMessage(tr("Unable to start mission: Vehicle failed to change to Guided mode.")); + return; } if (!_armVehicleAndValidate(vehicle)) { @@ -990,8 +892,12 @@ void APMFirmwarePlugin::startMission(Vehicle* vehicle) } } - // For non aircraft vehicles, we would be in guided mode, so we need to send the mission start command - if (!vehicle->fixedWing()) { + if (vehicle->fixedWing()) { + if (!_setFlightModeAndValidate(vehicle, "Auto")) { + qgcApp()->showAppMessage(tr("Unable to start mission: Vehicle failed to change to Auto mode.")); + return; + } + } else { vehicle->sendMavCommand(vehicle->defaultComponentId(), MAV_CMD_MISSION_START, true /*show error */); } } @@ -1025,10 +931,9 @@ void APMFirmwarePlugin::_handleRCChannels(Vehicle* vehicle, mavlink_message_t* m mavlink_rc_channels_t channels; mavlink_msg_rc_channels_decode(message, &channels); - //-- Ardupilot uses 0-254 to indicate 0-100% where QGC expects 0-100 - // As per mavlink specs, 255 means invalid, we must leave it like that for indicators to hide if no rssi data - if(channels.rssi && channels.rssi != 255) { - channels.rssi = static_cast(static_cast(channels.rssi) / 254.0 * 100.0); + //-- Ardupilot uses 0-255 to indicate 0-100% where QGC expects 0-100 + if(channels.rssi) { + channels.rssi = static_cast(static_cast(channels.rssi) / 255.0 * 100.0); } MAVLinkProtocol* mavlink = qgcApp()->toolbox()->mavlinkProtocol(); mavlink_msg_rc_channels_encode_chan( @@ -1133,45 +1038,3 @@ QMutex& APMFirmwarePlugin::_reencodeMavlinkChannelMutex() static QMutex _mutex{}; return _mutex; } - -double APMFirmwarePlugin::maximumEquivalentAirspeed(Vehicle* vehicle) -{ - QString airspeedMax("ARSPD_FBW_MAX"); - - if (vehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, airspeedMax)) { - return vehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, airspeedMax)->rawValue().toDouble(); - } - - return FirmwarePlugin::maximumEquivalentAirspeed(vehicle); -} - -double APMFirmwarePlugin::minimumEquivalentAirspeed(Vehicle* vehicle) -{ - QString airspeedMin("ARSPD_FBW_MIN"); - - if (vehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, airspeedMin)) { - return vehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, airspeedMin)->rawValue().toDouble(); - } - - return FirmwarePlugin::minimumEquivalentAirspeed(vehicle); -} - -bool APMFirmwarePlugin::fixedWingAirSpeedLimitsAvailable(Vehicle* vehicle) -{ - return vehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, "ARSPD_FBW_MIN") && - vehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, "ARSPD_FBW_MAX"); -} - -void APMFirmwarePlugin::guidedModeChangeEquivalentAirspeedMetersSecond(Vehicle* vehicle, double airspeed_equiv) -{ - - vehicle->sendMavCommand( - vehicle->defaultComponentId(), - MAV_CMD_DO_CHANGE_SPEED, - true, // show error is fails - 0, // 0: airspeed, 1: groundspeed - static_cast(airspeed_equiv), // speed setpoint - -1, // throttle, no change - 0 // 0: absolute speed, 1: relative to current - ); // param 5-7 unused -} \ No newline at end of file diff --git a/src/FirmwarePlugin/APM/APMFirmwarePlugin.h b/src/FirmwarePlugin/APM/APMFirmwarePlugin.h index 1530de1..5afabd8 100644 --- a/src/FirmwarePlugin/APM/APMFirmwarePlugin.h +++ b/src/FirmwarePlugin/APM/APMFirmwarePlugin.h @@ -56,7 +56,6 @@ public: QStringList flightModes (Vehicle* vehicle) override; QString flightMode (uint8_t base_mode, uint32_t custom_mode) const override; bool setFlightMode (const QString& flightMode, uint8_t* base_mode, uint32_t* custom_mode) override; - bool MAV_CMD_DO_SET_MODE_is_supported() const override { return true; } bool isGuidedMode (const Vehicle* vehicle) const override; QString gotoFlightMode (void) const override { return QStringLiteral("Guided"); } QString rtlFlightMode (void) const override { return QString("RTL"); } @@ -78,12 +77,6 @@ public: QString brandImageIndoor (const Vehicle* vehicle) const override { Q_UNUSED(vehicle); return QStringLiteral("/qmlimages/APM/BrandImage"); } QString brandImageOutdoor (const Vehicle* vehicle) const override { Q_UNUSED(vehicle); return QStringLiteral("/qmlimages/APM/BrandImage"); } QString getHobbsMeter (Vehicle* vehicle) override; - bool hasGripper (const Vehicle* vehicle) const override; - const QVariantList& toolIndicators (const Vehicle* vehicle) override; - double maximumEquivalentAirspeed (Vehicle* vehicle) override; - double minimumEquivalentAirspeed (Vehicle* vehicle) override; - bool fixedWingAirSpeedLimitsAvailable(Vehicle* vehicle) override; - void guidedModeChangeEquivalentAirspeedMetersSecond(Vehicle* vehicle, double airspeed_equiv) override; protected: /// All access to singleton is through stack specific implementation @@ -115,7 +108,6 @@ private: // Any instance data here must be global to all vehicles // Vehicle specific data should go into APMFirmwarePluginInstanceData - QVariantList _toolIndicatorList; QList _supportedModes; QMap> _ardupilotComponentMap; @@ -141,7 +133,4 @@ public: QTime lastBatteryStatusTime; QTime lastHomePositionTime; - - bool MAV_CMD_DO_REPOSITION_supported = false; - bool MAV_CMD_DO_REPOSITION_unsupported = false; }; diff --git a/src/FirmwarePlugin/APM/APMFirmwarePluginFactory.cc b/src/FirmwarePlugin/APM/APMFirmwarePluginFactory.cc index d6b9f1f..c2338c1 100644 --- a/src/FirmwarePlugin/APM/APMFirmwarePluginFactory.cc +++ b/src/FirmwarePlugin/APM/APMFirmwarePluginFactory.cc @@ -46,12 +46,12 @@ FirmwarePlugin* APMFirmwarePluginFactory::firmwarePluginForAutopilot(MAV_AUTOPIL _arduCopterPluginInstance = new ArduCopterFirmwarePlugin; } return _arduCopterPluginInstance; - case MAV_TYPE_VTOL_TAILSITTER_DUOROTOR: - case MAV_TYPE_VTOL_TAILSITTER_QUADROTOR: + case MAV_TYPE_VTOL_DUOROTOR: + case MAV_TYPE_VTOL_QUADROTOR: case MAV_TYPE_VTOL_TILTROTOR: - case MAV_TYPE_VTOL_FIXEDROTOR: - case MAV_TYPE_VTOL_TAILSITTER: - case MAV_TYPE_VTOL_TILTWING: + case MAV_TYPE_VTOL_RESERVED2: + case MAV_TYPE_VTOL_RESERVED3: + case MAV_TYPE_VTOL_RESERVED4: case MAV_TYPE_VTOL_RESERVED5: case MAV_TYPE_FIXED_WING: if (!_arduPlanePluginInstance) { diff --git a/src/FirmwarePlugin/APM/APMParameterFactMetaData.Copter.3.5.xml b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Copter.3.5.xml new file mode 100644 index 0000000..e3b7002 --- /dev/null +++ b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Copter.3.5.xml @@ -0,0 +1,11623 @@ + + + + + + +-100 0 + + +True + + +True + +ArduPlane +AntennaTracker +Copter +Rover +ArduSub + + + +1 255 + + + +Mission Planner and DroidPlanner + AP Planner 2 + + + +0 10 +.5 +Hz + + +0:Roll,1:Pitch,2:Yaw + +None +Roll +Pitch +Yaw + + + +0.01 2.0 +0.01 + + + +Disabled +Warn only +Disarm +Enter surface mode + + + +0.1 +Volts + + +50 +mAh + + + +Disabled +Warn only +Disarm +Enter depth hold mode +Enter surface mode + + + + +Disabled +Warn only +Enter surface mode + + + + +Disabled +Warn only + + + + +Disabled +Warn only + + + +Pascal + + +Degrees Centigrade + + + +Disarm +Hold Position +Surface + + + + +Disabled +Warn Only +Disarm + + + +10 90 + + + +Disabled +Enabled + + + + +Never change yaw +Face next waypoint +Face next waypoint except RTL +Face along GPS course + + + +50 500 +10 +Centimeters/Second + + +50 500 +10 +cm/s/s + + +0 300 +1 +pwm + + +0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:CTUN,5:NTUN,6:RCIN,7:IMU,8:CMD,9:CURRENT,10:RCOUT,11:OPTFLOW,12:PID,13:COMPASS,14:INAV,15:CAMERA,17:MOTBATT,18:IMU_FAST,19:IMU_RAW + +Default +Default+RCIN +Default+IMU +Default+Motors +NearlyAll-AC315 +NearlyAll +All+FastATT +All+MotBatt +All+FastIMU +All+FastIMU+PID +All+FullIMU +Disabled + + + +1000 8000 +Centi-degrees + + +0 100 + +Very Soft +Soft +Medium +Crisp +Very Crisp + +10 + + + +Disabled + + + +0.6:Strict, 0.8:Default, 1.0:Relaxed + + + +Disabled +Warn only +Disarm + + + +0.1 1.0 + + +0.2 1.0 + + +0.1 0.8 + + +1 10 + + +30 400 + + +30 400 + + +0.5 4.0 + + +1000 2000 + + + +BlueROV1 +Vectored +Vectored_6DOF +Vectored_6DOF_90 +SimpleROV-3 +SimpleROV-4 +SimpleROV-5 +Custom + +True + + +50 490 +1 +Hz + + +1 10 + + +1 10 + + +0 3 +0.1 + + +0 3 +0.1 + + + +Disabled +Leveling +Leveling and Limited + + + + +Disabled +Very Low +Low +Medium +High +Very High + + + +0.1 6.0 +0.1 + + +0.02 1.00 +0.01 + + +0 4500 +10 +cm/s/s + + +0 4500 +10 +cm/s/s + + +1.000 8.000 + + +0.500 1.500 +0.05 + + +0.000 3.000 + + +0 1000 +Percent*10 + + +0.000 0.400 + + +1.000 100.000 +Hz + + +1.000 3.000 + + +0.500 2.000 + + + +Do Not Use in RTL and SURFACE +Use in RTL and SURFACE + + + + + + + +True + + +1 255 + + +1 255 + + + +Disabled +Enabled + + + +1 10 +1 + + +0 30 +1 +seconds + + +0:Roll,1:Pitch,2:Yaw,3:Steering,4:Landing + + +0 1 +0.01 + + +0 5 +0.01 + + +0 15 +0.1 +Degrees + + +0 1000 +1 +meters + + +0 100 +1 +meters + + + +Disabled +FBWMixing +DirectMixing + + + + +Disabled +Enabled + + + +0 30 +0.1 +m/s + + +0 30 +0.1 +m/s/s + + +0 127 +1 +0.1 seconds + + +-100 100 +1 +Percent + + +0 30 +0.1 +m/s + + +0 30 +0.1 +m/s + + +0 127 +1 +percent + + +0 10 +0.5 +seconds + + +0 100 +Percent + + + + +0 45 +1 +degrees + + +0:AUTO_ALWAYS,1:AUTO_LAND,2:AUTO_LOITER_TO_ALT,3:AUTO_LOITER_ALL,4:AUTO_WAYPOINTS,5:LOITER,6:RTL,7:CIRCLE,8:CRUISE,9:FBWB,10:GUIDED + + + +Default +L1Controller + + + + +Automatic + + + +-32767 32767 +1 +Meters + + +1 32767 +1 +Meters + + +0 32767 +1 +Meters + + +-32767 32767 +1 +Meters + + +-32767 32767 +1 +Meters + + + +None +GuidedMode +ReportOnly +GuidedModeThrPass +RTL_Mode + + + + + + + +0 32767 +1 +meters + + +0 32767 +1 +meters + + +0 32767 +1 +meters + + + +NoAutoEnable +AutoEnable +AutoEnableDisableFloorOnly + + + + +FenceReturnPoint +NearestRallyPoint + + + + +Disabled +Enabled + + + +5 100 +1 +m/s + + +5 100 +1 +m/s + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +0 10000 +meters + + +1 10 +0.1 +m/s + + +-100 100 +1 +Percent + + +0 100 +1 +Percent + + +0 100 +1 +Percent + + +0 127 +1 +Percent + + +0 100 +1 +Percent + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +925 2200 +1 + + +0 100 +1 +Percent + + + +Disabled +Enabled + + + + +CIRCLE/no change(if already in AUTO|GUIDED|LOITER) +CIRCLE +FBWA + + + +1 100 +0.5 +seconds + + + +Continue +ReturnToLaunch +Glide +Deploy Parachute + + + +1 300 +0.5 +seconds + + +0.1 +Volts + + +50 +mAh + + + +Disabled +Heartbeat +HeartbeatAndREMRSSI +HeartbeatAndAUTO + + + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL + + + +0 9000 +1 +centi-Degrees + + +0 9000 +1 +centi-Degrees + + +-9000 0 +1 +centi-Degrees + + +10 500 +1 +degrees/second + + +10 500 +1 +degrees/second + + + +Disabled +Enabled + + + +-100 100 +0.1 +Meters + + +10 360 +1 +degrees/second + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +UpUp +UpDown +DownUp +DownDown +UpUpSwap +UpDownSwap +DownUpSwap +DownDownSwap + + + + +Disabled +UpUp +UpDown +DownUp +DownDown +UpUpSwap +UpDownSwap +DownUpSwap +DownDownSwap + + + +0.5 1.2 + + + +Disabled +Enabled + + + +-1000 1000 +percent + + +-1000 1000 +percent + + + + +0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:CTUN,5:NTUN,6:MODE,7:IMU,8:CMD,9:CURRENT,10:COMPASS,11:TECS,12:CAMERA,13:RC,14:SONAR,15:ARM/DISARM,19:IMU_RAW + +Disabled +PX4/Pixhawk-Default + + + + + + + +cm/s + + +m/s + + +cm/s + + +centi-Degrees + + +centimeters + + +centimeters + + + +Disabled +Enabled + + + + + + +Disabled +UpUp +UpDown +DownUp +DownDown +UpUpSwap +UpDownSwap +DownUpSwap +DownDownSwap + + + +0 100 +Percent + + +0 100 +1 +m/s + + +0 100 +Percent + + +0 100 +1 +m/s + + + + + + + +Disabled +Channel1 +Channel2 +Channel3 +Channel4 +Channel5 +Channel6 +Channel7 +Channel8 + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +0 90 +0.1 +degrees + + + +Disable +Enable - go HOME then land +Enable - go directly to landing sequence + + + + +Disable +Enable + + + +10 127 +m/s/s + + +0:Disarm + + + + + +Disabled +Enabled + + + + +NotEnforced +Enforced + + + +0 100 +1 +Percent + + + + +True + + +True + +ArduPlane +AntennaTracker +Copter +Rover + + + +1 255 + + + +Mission Planner and DroidPlanner + AP Planner 2 + + + + +Disabled +Enabled + + + +0 10 +.5 +Hz + + +0.0 1000.0 +10 +Centimeters + + +0 500 +10 + + +0:Feedback from mid stick,1:High throttle cancels landing,2:Disarm on land detection + +None +Feedback from mid stick +High throttle cancels landing +Disarm on land detection + + + +0 30 +1 +seconds + + +0:Roll,1:Pitch,2:Yaw + +None +Roll +Pitch +Yaw + + + +0 8000 +1 +Centimeters + + +0.5 10.0 + +Disabled +Shallow +Steep + +.1 + + +0 2000 +50 +cm/s + + +0.01 2.0 +0.01 + + + +Disabled +Land +RTL + + + +0.1 +Volts + + +50 +mAh + + + +Disabled +Enabled always RTL +Enabled Continue with Mission in Auto Mode + + + +100 900 + + + +Disabled +Enabled + + + + +Disabled +Mode1 +Mode2 +Mode1+2 +Mode3 +Mode1+3 +Mode2+3 +Mode1+2+3 +Mode4 +Mode1+4 +Mode2+4 +Mode1+2+4 +Mode3+4 +Mode1+3+4 +Mode2+3+4 +Mode1+2+3+4 +Mode5 +Mode1+5 +Mode2+5 +Mode1+2+5 +Mode3+5 +Mode1+3+5 +Mode2+3+5 +Mode1+2+3+5 +Mode4+5 +Mode1+4+5 +Mode2+4+5 +Mode1+2+4+5 +Mode3+4+5 +Mode1+3+4+5 +Mode2+3+4+5 +Mode1+2+3+4+5 +Mode6 +Mode1+6 +Mode2+6 +Mode1+2+6 +Mode3+6 +Mode1+3+6 +Mode2+3+6 +Mode1+2+3+6 +Mode4+6 +Mode1+4+6 +Mode2+4+6 +Mode1+2+4+6 +Mode3+4+6 +Mode1+3+4+6 +Mode2+3+4+6 +Mode1+2+3+4+6 +Mode5+6 +Mode1+5+6 +Mode2+5+6 +Mode1+2+5+6 +Mode3+5+6 +Mode1+3+5+6 +Mode2+3+5+6 +Mode1+2+3+5+6 +Mode4+5+6 +Mode1+4+5+6 +Mode2+4+5+6 +Mode1+2+4+5+6 +Mode3+4+5+6 +Mode1+3+4+5+6 +Mode2+3+4+5+6 +Mode1+2+3+4+5+6 + + + +-1 1000 +1 +Centimeters + + +0 3000 +10 +Centimeters + + + +Never change yaw +Face next waypoint +Face next waypoint except RTL +Face along GPS course + + + +0 60000 +1000 +ms + + +30 200 +10 +cm/s + + +0 500 +10 +cm/s + + +50 500 +10 +Centimeters/Second + + +50 500 +10 +cm/s/s + + + +Disabled +Enabled always RTL +Enabled Continue with Mission in Auto Mode +Enabled always LAND + + + +925 1100 +1 +pwm + + +0 300 +1 +pwm + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +SmartRTL + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +SmartRTL + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +SmartRTL + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +SmartRTL + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +SmartRTL + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +SmartRTL + + + + + +0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:CTUN,5:NTUN,6:RCIN,7:IMU,8:CMD,9:CURRENT,10:RCOUT,11:OPTFLOW,12:PID,13:COMPASS,14:INAV,15:CAMERA,17:MOTBATT,18:IMU_FAST,19:IMU_RAW + +Default +Default+RCIN +Default+IMU +Default+Motors +NearlyAll-AC315 +NearlyAll +All+FastATT +All+MotBatt +All+FastIMU +All+FastIMU+PID +All+FullIMU +Disabled + + + + +Normal Start-up +Start-up in ESC Calibration mode if throttle high +Start-up in ESC Calibration mode regardless of throttle +Start-up and automatically calibrate ESCs +Disabled + + + + +None +Stab Roll/Pitch kP +Rate Roll/Pitch kP +Rate Roll/Pitch kI +Rate Roll/Pitch kD +Stab Yaw kP +Rate Yaw kP +Rate Yaw kD +Rate Yaw Filter +Motor Yaw Headroom +AltHold kP +Throttle Rate kP +Throttle Accel kP +Throttle Accel kI +Throttle Accel kD +Loiter Pos kP +Velocity XY kP +Velocity XY kI +WP Speed +Acro RollPitch kP +Acro Yaw kP +RC Feel +Heli Ext Gyro +Declination +Circle Rate +RangeFinder Gain +Rate Pitch kP +Rate Pitch kI +Rate Pitch kD +Rate Roll kP +Rate Roll kI +Rate Roll kD +Rate Pitch FF +Rate Roll FF +Rate Yaw FF + + + +0 32767 + + +0 32767 + + + +Plus +X +V +H +V-Tail +A-Tail +Y6B + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Object Avoidance +ArmDisarm + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Object Avoidance +ArmDisarm + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Object Avoidance +ArmDisarm + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Object Avoidance +ArmDisarm + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Object Avoidance +ArmDisarm + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Object Avoidance +ArmDisarm + + + +0 127 +Seconds + + +1000 8000 +Centi-degrees + + +0 100 + +Very Soft +Soft +Medium +Crisp +Very Crisp + +10 + + +4 12 +deg/sec + + +2000 4500 +Centi-degrees + + + +No repositioning +Repositioning + + + + +Land +AltHold +Land even in Stabilize + + + +0.6:Strict, 0.8:Default, 1.0:Relaxed + + + +Disabled +Enabled + + + +50 490 +1 +Hz + + +1 10 + + +1 10 + + +0 3 +0.1 + + +0 3 +0.1 + + + +Disabled +Leveling +Leveling and Limited + + + +-0.5 1.0 + +Disabled +Very Low +Low +Medium +High +Very High + + + +0.1 6.0 +0.1 + + +0.02 1.00 +0.01 + + +0 4500 +10 +cm/s/s + + +1.000 8.000 + + +0.500 1.500 +0.05 + + +0.000 3.000 + + +0 1000 +Percent*10 + + +0.000 0.400 + + +1.000 100.000 +Hz + + +1.000 3.000 + + +0.500 2.000 + + +0:Roll,1:Pitch,2:Yaw + +All +Roll Only +Pitch Only +Yaw Only +Roll and Pitch +Roll and Yaw +Pitch and Yaw + + + +0.05 0.10 + + +0.001 0.006 + + + +Stopped +Running + + + + +Do Not Use in RTL and Land +Use in RTL and Land + + + +0 5 + + + +Auto +Guided +RTL +Land +Brake +Throw + + + + +Upward Throw +Drop + + + + +Disabled +Enabled + + + +0:ADSBMavlinkProcessing + + +-0.5 1.0 + +Disabled +Very Low +Low +Medium +High +Very High + + + +0 1 + + + +NotEnforced +Enforced + + + + +Undefined +Quad +Hexa +Octa +OctaQuad +Y6 +Heli +Tri +SingleCopter +CoaxCopter + + + + + + + +True + +ArduPlane +AntennaTracker +Copter +Rover + + + +1 255 + + +1 255 + + +1 255 + + + +Disabled +Enabled + + + +0 20 +0.1 +seconds + + +0 20 +0.1 +seconds + + +0 100 +1 +degrees/second + + +0 20 +1 +seconds + + +-90 90 +0.000001 +degrees + + +-180 180 +0.000001 +degrees + + +0 10 +0.1 +seconds + + + +Position +OnOff +ContinuousRotation + + + + +Position +OnOff +ContinuousRotation + + + +0 50 +0.1 +degrees/second + + +0 50 +0.1 +degrees/second + + +0 2 +0.01 +seconds + + +0 2 +0.01 +seconds + + +-10 10 +0.1 +degrees + + +-10 10 +0.1 +degrees + + +0 360 +0.1 +degrees + + +0 100 +1 +meters + + + +Barometer +GPS +GPS vehicle only + + + +1 10 +1 +Hz + + +-90 0 +1 +Degrees + + +0 90 +1 +Degrees + + +0:ATTITUDE,1:GPS,2:RCIN,3:IMU,4:RCOUT,5:COMPASS + +Default +Disabled + + + +0.0 3.0 +0.01 + + +0.0 3.0 +0.01 + + +0 4000 +10 +Percent*10 + + +0.001 0.1 +0.001 + + +0.0 3.0 +0.01 + + +0.0 3.0 +0.01 + + +0 4000 +10 +Percent*10 + + +0.001 0.1 +0.001 + + +1 255 + + + + + + +True + + +0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:CTUN,5:NTUN,6:MODE,7:IMU,8:CMD,9:CURRENT,10:COMPASS,11:TECS,12:CAMERA,13:RC,14:SONAR,15:ARM/DISARM,19:IMU_RAW + +Disabled +APM2-Default +PX4/Pixhawk-Default + + + + + + + + +MANUAL +LEARNING +STEERING +HOLD +AUTO +RTL +GUIDED + + + +1 255 + + +1 255 + + + +Disabled +Enabled + + + +0 30 +1 +seconds + + +0:Steering,1:Throttle + +None +Steering +Throttle + + + + +Disabled +Enabled + + + + +Disabled +APM TriggerPin0 +APM TriggerPin1 +APM TriggerPin2 +APM TriggerPin3 +APM TriggerPin4 +APM TriggerPin5 +APM TriggerPin6 +APM TriggerPin7 +APM TriggerPin8 +Pixhawk TriggerPin50 +Pixhawk TriggerPin51 +Pixhawk TriggerPin52 +Pixhawk TriggerPin53 +Pixhawk TriggerPin54 +Pixhawk TriggerPin55 + + + +0 20 +0.1 +m/s/s + + +0 100 +0.1 +m/s + + +0 100 +1 +percent + + +0 100 +0.1 +meters + + +0 100 +1 +percent + + +0 100 +1 +m/s + + +0 360 +1 +degrees + + + +Nothing +LearnWaypoint + + + +0 100 +1 +Percent + + +0 100 +1 +Percent + + +0 100 +1 +Percent + + +0 100 +1 +Percent + + + +Disabled +SkidSteeringOutput + + + + +Disabled +SkidSteeringInput + + + + +Nothing +RTL +HOLD + + + +seconds + + + +Disabled +Enabled + + + +925 1100 +1 + + + +Disabled +Enabled + + + + +Disabled +HOLD +HoldAndDisarm + + + +0 1000 +1 +centimeters + + +-45 45 +1 +centimeters + + +0 100 +0.1 +seconds + + +1 100 +1 + + + + + + + +Manual +LEARNING +STEERING +HOLD +Auto +RTL +Guided + + + + +Manual +LEARNING +STEERING +HOLD +Auto +RTL +Guided + + + + +Manual +LEARNING +STEERING +HOLD +Auto +RTL +Guided + + + + +Manual +LEARNING +STEERING +HOLD +Auto +RTL +Guided + + + + +Manual +LEARNING +STEERING +HOLD +Auto +RTL +Guided + + + + +Manual +LEARNING +STEERING +HOLD +Auto +RTL +Guided + + + +0 1000 +0.1 +meters + + +0.2 10 +0.1 +gravities + + + +NotEnforced +Enforced + + + + + + +Disabled +Enabled + + + +1 100 + + +1 100000 + + +-1 16777215 + + + +NoInfo +Light +Small +Large +HighVortexlarge +Heavy +HighlyManuv +Rotocraft +RESERVED +Glider +LightAir +Parachute +UltraLight +RESERVED +UAV +Space +RESERVED +EmergencySurface +ServiceSurface +PointObstacle + + + + +NO_DATA +L15W23 +L25W28P5 +L25W34 +L35W33 +L35W38 +L45W39P5 +L45W45 +L55W45 +L55W52 +L65W59P5 +L65W67 +L75W72P5 +L75W80 +L85W80 +L85W90 + + + + +NoData +Left2m +Left4m +Left6m +Center +Right2m +Right4m +Right6m + + + + +NO_DATA +AppliedBySensor + + + + +Disabled +Rx-Only +Tx-Only +Rx and Tx Enabled + + + + + + + + + + + + + + + + + + + + + +meters + + +meters + + +millibar + + + + + + + + + + + + + + +seconds + + + + +0.0 1.0 +.01 + + + +Disabled +Enabled + + + +0.1 0.4 +.01 + + +0.1 0.4 +.01 + + +0 127 +1 +m/s + + +-0.1745 +0.1745 +0.01 +Radians + + +-0.1745 +0.1745 +0.01 +Radians + + +-0.1745 +0.1745 +0.01 +Radians + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw136 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 + + + +0.001 0.5 +.01 + + +0 10 +1 + + + +Disabled +Enable EKF2 +Enable EKF3 + + + + + + +Disabled +THR_MIN PWM when disarmed +0 PWM when disarmed + + + +0:All,1:Barometer,2:Compass,3:GPS lock,4:INS,5:Parameters,6:RC,7:Board voltage,8:Battery Level,9:Airspeed,10:Logging Available,11:Hardware safety switch,12:GPS Configuration + +None +All +Barometer +Compass +GPS Lock +INS(INertial Sensors - accels & gyros) +Parameters(unused) +RC Failsafe +Board voltage +Battery Level +Airspeed +LoggingAvailable +Hardware safety switch +GPS configuration + + + +0.25 3.0 +m/s/s + + +0.1 +Volts + + +0.1 +Volts + + + + + +None +I2C-MS4525D0 +Analog +I2C-MS5525 + + + + +Use +Don't Use + + + +0.1 + + +0.1 + + + + + + + + + +Disable +Enable + + + + + + +Bus0 +Bus1 + + + + + +500 18000 +100 +Centi-Degrees/Sec + + +0 72000 + +Disabled +Slow +Medium +Fast + +1000 +Centi-Degrees/Sec/Sec + + + +Disabled +Enabled + + + +0 180000 + +Disabled +Slow +Medium +Fast + +1000 +Centi-Degrees/Sec/Sec + + +0 180000 + +Disabled +Slow +Medium +Fast + +1000 +Centi-Degrees/Sec/Sec + + + +Disabled +Enabled + + + +3.000 12.000 + + +3.000 12.000 + + +3.000 6.000 + + +0.5 10.0 + + +0.08 0.30 +0.005 + + +0.01 0.5 +0.01 + + +0 1 +0.01 +Percent + + +0.0 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz + + +0.08 0.30 +0.005 + + +0.01 0.5 +0.01 + + +0 1 +0.01 +Percent + + +0.0 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz + + +0.10 0.50 +0.005 + + +0.010 0.05 +0.01 + + +0 1 +0.01 +Percent + + +0.000 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz + + +0.1 0.25 + + +0.5 0.9 + + +0.5 0.9 + + + + + +Disabled +Enabled + + + + +Remain in AVOID_ADSB +Resume previous flight mode +RTL +Resume if AUTO else Loiter + + + + + +seconds + + +seconds + + +meters + + +meters + + +meters + + +meters + + + + +0:StopAtFence,1:UseProximitySensor + +None +StopAtFence +UseProximitySensor +All + + + +0 4500 + + +3 30 +meters + + +1 10 +meters + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell + + + + +Disabled +A0 +A1 +Pixhawk/Pixracer/Navio2 +A5 +A10 +A13/Pixhawk2_PM2 +PX4-v1 + + + + +Disabled +A1 +A2 +Pixhawk/Pixracer/Navio2 +A11 +A12/Pixhawk2_PM2 +PX4-v1 + + + + + +Amps/Volt + + +Volts + + +50 +mAh + + +1 +Watts + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell + + + + +Disabled +A0 +A1 +Pixhawk/Pixracer/Navio2 +A5 +A10 +A13/Pixhawk2_PM2 +PX4-v1 + + + + +Disabled +A1 +A2 +Pixhawk/Pixracer/Navio2 +A11 +A12/Pixhawk2_PM2 +PX4-v1 + + + + + +Amps/Volt + + +Volts + + +50 +mAh + + +1 +Amps + + + + +0 120 +1 +Seconds + + + + + +None +Pozyx +Marvelmind + + + +-90 90 +0.000001 +degrees + + +-180 180 +0.000001 +degrees + + +0 10000 +1 +meters + + +-180 +180 +1 +degrees + + + + + +No PWMs +Two PWMs +Four PWMs +Six PWMs +Three PWMs and One Capture + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled + +True + + + +Disabled +50Hz +75Hz +100Hz +150Hz +200Hz +250Hz +300Hz + +True + + +-32768 32767 + + +0:Ch1,1:Ch2,2:Ch3,3:Ch4,4:Ch5,5:Ch6,6:Ch7,7:Ch8,8:Ch9,9:Ch10,10:Ch11,11:Ch12,12:Ch13,13:Ch14 + +Disabled +Enabled + +True + + +-1 80 +degreesC + + + +AUTO +PX4V1 +Pixhawk +Pixhawk2 +Pixracer +PixhawkMini +Pixhawk2Slim +VRBrain 5.1 +VRBrain 5.2 +VR Micro Brain 5.1 +VR Micro Brain 5.2 +VRBrain Core 1.0 +VRBrain 5.4 +Intel Aero FC +AUAV2.1 + +True + + + +Disabled +Enabled + +True + + + + + +Disabled +Enabled first channel +Enabled both channels + + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + +Disabled +Enabled + + + + + +1 250 + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +Enabled + + + + +Disabled +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +0 3600 + + + + + +Servo +Relay + + + +0 50 +deciseconds + + +1000 2000 +pwm + + +1000 2000 +pwm + + +0 1000 +meters + + + +Low +High + + + +0 10000 +milliseconds + + +0 180 +Degrees + + + +Disabled +PX4 AUX1 +PX4 AUX2 +PX4 AUX3 +PX4 AUX4(fast capture) +PX4 AUX5 +PX4 AUX6 + + + + +TriggerLow +TriggerHigh + + + + + + +Disabled +Enabled + + + + +First Relay +Second Relay +Third Relay +Fourth Relay +Servo + + + +1000 2000 +1 +pwm + + +1000 2000 +1 +pwm + + +0 32000 +1 +Meters + + +0 5000 +1 +Milliseconds + + + + +0 10000 +100 +cm + + +-90 90 +1 +deg/s + + + + +-400 400 +1 +milligauss + + +-400 400 +1 +milligauss + + +-400 400 +1 +milligauss + + +-3.142 3.142 +0.01 +Radians + + + +Disabled +Internal-Learning +EKF-Learning + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Use Throttle +Use Current + + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw136 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll90 + + + + +Internal +External +ForcedExternal + + + +-400 400 +1 +milligauss + + +-400 400 +1 +milligauss + + +-400 400 +1 +milligauss + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + + +FirstCompass +SecondCompass +ThirdCompass + + + +-400 400 +1 +milligauss + + +-400 400 +1 +milligauss + + +-400 400 +1 +milligauss + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + + + + + + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw136 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll90 + + + + +Internal +External +ForcedExternal + + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw136 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll90 + + + + +Internal +External +ForcedExternal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +4 32 + +Very Strict +Strict +Default +Relaxed + +0.1 + + +500 3000 +1 + + + + + +Disabled +Enabled + + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s + + +0.05 5.0 +0.05 +m/s + + +100 1000 +25 + + +0.1 10.0 +0.1 +m + + +100 1000 +25 + + +10 100 +5 +m + + +0 250 +10 +milliseconds + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + + + +0.1 10.0 +0.1 +m + + +100 1000 +25 + + +0 250 +10 +milliseconds + + +0.01 0.5 +0.01 +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s + + +100 1000 +25 + + +0.1 10.0 +0.1 +m + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s + + +0.05 1.0 +0.05 +rad/s + + +100 1000 +25 + + +0 127 +10 +milliseconds + + +0.0001 0.1 +0.0001 +rad/s + + +0.01 1.0 +0.01 +m/s/s + + +0.00001 0.001 +rad/s/s + + +0.000001 0.001 +1/s + + +0.00001 0.001 +m/s/s/s + + +0.01 1.0 +0.1 +m/s/s + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU + + +50 200 +% + + +0.5 50.0 +m + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU + + +0.05 1.0 +0.05 +rad + + +100 1000 +25 + + +10 50 +5 +cs + + +0.00001 0.01 +gauss/s + + +0.00001 0.01 +gauss/s + + +-1 70 +1 +% + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m + + +100 1000 +25 + + +0 127 +10 +milliseconds + + +2.0 6.0 +0.5 +m/s + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF + + + + + +Disabled +Enabled + + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s + + +0.05 5.0 +0.05 +m/s + + +100 1000 +25 + + +0.1 10.0 +0.1 +m + + +100 1000 +25 + + +10 100 +5 +m + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + + + +0.1 10.0 +0.1 +m + + +100 1000 +25 + + +0 250 +10 +milliseconds +True + + +0.01 0.5 +0.01 +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s + + +100 1000 +25 + + +0.1 10.0 +0.1 +m + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s + + +0.05 1.0 +0.05 +rad/s + + +100 1000 +25 + + +0 250 +10 +milliseconds +True + + +0.0001 0.1 +0.0001 +rad/s + + +0.01 1.0 +0.01 +m/s/s + + +0.00001 0.001 +rad/s/s + + +0.00001 0.001 +m/s/s/s + + +0.01 1.0 +0.1 +m/s/s + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU + + +50 200 +% + + +0.5 50.0 +m + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU + + +0.05 1.0 +0.05 +rad + + +100 1000 +25 + + +10 50 +5 +cs + + +0.00001 0.01 +gauss/s + + +0.00001 0.01 +gauss/s + + +-1 70 +1 +% + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m + + +100 1000 +25 + + +0 250 +10 +milliseconds +True + + +2.0 6.0 +0.5 +m/s + + +0.5 2.5 +0.1 +m/s/s + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF + + + + + +Disabled +Enabled + + + +0:Altitude,1:Circle,2:Polygon + +None +Altitude +Circle +Altitude and Circle +Polygon +Altitude and Polygon +Circle and Polygon +All + + + + +Report Only +RTL or Land + + + +10 1000 +1 +Meters + + +30 10000 +Meters + + +1 10 +Meters + + +1 20 + + +-100 100 +1 +Meters + + + + + +Disabled +Enabled + + + +-200 +200 +1 + + +-200 +200 +1 + + +-18000 +18000 +1 + + +m + + +m + + +m + + +0 127 + + + + +True +True +1 +pascals + + +True +True +1 +degrees celsius + + +0.1 +meters + + + +FirstBaro +2ndBaro +3rdBaro + + + + +Disabled +Bus0 +Bus1 + + + +1.0:Freshwater,1.024:Saltwater + + +True +True +1 +pascals + + +True +True +1 +pascals + + + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +QURT +ERB +MAV +NOVA + +True + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +QURT +ERB +MAV +NOVA + +True + + + +Portable +Stationary +Pedestrian +Automotive +Sea +Airborne1G +Airborne2G +Airborne4G + + + + +Disabled +UseBest +Blend + + + + +Any +FloatRTK +IntegerRTK + +True + + + +Disabled +Enabled +NoChange + + + +-100 90 +Degrees + + + +send to first GPS +send to 2nd GPS +send to all + + + + +None (0x0000) +All (0xFFFF) +External only (0xFF00) + + + + +Disabled +log every sample +log every 5 samples + +True + + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + + + + +Do not save config +Save config +Save only when needed + + + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + + + + +Disables automatic configuration +Enable automatic configuration + + + +50 200 + +10Hz +8Hz +5Hz + +milliseconds + + +50 200 + +10Hz +8Hz +5Hz + +milliseconds + + +m + + +m + + +m + + +m + + +m + + +m + + +0 250 +milliseconds + + +0 250 +milliseconds + + +0:Horiz Pos,1:Vert Pos,2:Speed + + +5.0 30.0 +seconds + + + + + +Disabled +Enabled + + + + +None +Servo +EPM + + + +1000 2000 +PWM + + +1000 2000 +PWM + + +1000 2000 +PWM + + +0 255 +seconds + + +0 255 + + + + +-180 180 +1 +Degrees + + +-180 180 +1 +Degrees + + +-180 180 +1 +Degrees + + + +Servo only +Servo with ExtGyro +DirectDrive VarPitch +DirectDrive FixedPitch + + + + +3-Servo CCPM +H1 Mechanical Mixing + + + +0 1000 +1 +PWM + + +-90 90 +1 +Degrees + + +-10 10 +0.1 + + + +NoFlybar +Flybar + + + +0 1000 +1 +PWM + + +0 1000 +1 +PWM + + +0 2000 + + +0 2000 + + + +Reversed +Normal + + + +-180 180 +1 +Degrees + + +-180 180 +1 +Degrees + + +-180 180 +1 +Degrees + + +-180 180 +1 +Degrees + + +-180 180 +1 +Degrees + + +-180 180 +1 +Degrees + + +-90 90 +1 +Degrees + + +-90 90 +1 +Degrees + + + +Longitudinal +Transverse + + + +0 1 + + +-10 10 +0.1 + + +-10 10 +0.1 + + +0 2000 + + +0 2000 + + + +Reversed +Normal + + + +1000 2000 +1 +PWM + + +1000 2000 +1 +PWM + + +1000 2000 +1 +PWM + + +1000 2000 +1 +PWM + + +1000 2000 +1 +PWM + + +1000 2000 +1 +PWM + + + +Disabled +Passthrough +Max collective +Mid collective +Min collective + + + +0 1000 +10 +PWM + + + +Ch8 Input +SetPoint +Throttle Curve + + + +0 500 +1 +pwm + + +0 60 +Seconds + + +0 60 +Seconds + + +0 1000 +10 + + +0 500 +10 + + +0 1000 +10 + + +0 1000 +10 + + +0 18000 +100 +Centi-Degrees + + +0 10 +1 + + +1 1000 +10 + + +0 500 +10 + + + + + +Disabled +Enabled + + + + +None +Chan1 +Chan2 +Chan3 +Chan4 +Chan5 +Chan6 +Chan7 +Chan8 +Chan9 +Chan10 +Chan11 +Chan12 +Chan13 +Chan14 +Chan15 +Chan16 + + + +0.1 5 +Seconds + + +1 10 +Seconds + + +100 100000 + + +1000 2000 + + +1000 2000 + + +1000 2000 + + +1000 2000 + + + +None +RPM1 +RPM2 + + + +0 100 + + + + +0 500 +1 +Percent*10 + + +0 500 +1 +Percent*10 + + +500 1000 +1 +Percent*10 + + +500 1000 +1 +Percent*10 + + + +Disabled +Very Low +Low +Medium +High +Very High + + + + + + + +rad/s + + +rad/s + + +rad/s + + +rad/s + + +rad/s + + +rad/s + + +rad/s + + +rad/s + + +rad/s + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s + + +-3.5 3.5 +m/s/s + + +-3.5 3.5 +m/s/s + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s + + +-3.5 3.5 +m/s/s + + +-3.5 3.5 +m/s/s + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s + + +-3.5 3.5 +m/s/s + + +-3.5 3.5 +m/s/s + + +0 127 +Hz + + +0 127 +Hz + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +0.05 50 + + + +Never +Start-up only + + + + +Don't adjust the trims +Assume first orientation was level +Assume ACC_BODYFIX is perfectly aligned to the vehicle + + + + +IMU 1 +IMU 2 +IMU 3 + + + +m + + +m + + +m + + +m + + +m + + +m + + +m + + +m + + +m + + +True + + +True + + +True + + +True + + +True + + +True + + + + + + +0 5 +0.5 +meters + + +0 90 +0.1 +degrees + + +centi-Degrees + + +0.1 +meters + + +0.1 +seconds + + +0 30 +0.1 +meters + + +0 10 +0.1 +seconds + + +0 30 +0.1 +m/s + + +0 127 +1 +percent + + +0 127 +1 +seconds + + + +Disabled +Servos to Neutral +Servos to Zero PWM + + + + +Disabled +Enabled + + + +0 100 +Percent + + + +Standard Glide Slope + + + + + +0 20 +m/s + + + + + + +10 200 +meters + + +0 20 +m/s + + +0 2 +seconds + + +900 2100 +PWM + + +5 20 +m/s + + +5 20 +m/s + + +5 50 +meters + + +0 1 + + + + + + + + + + + + + + + +Disabled +Pixhawk Aux1 +Pixhawk Aux2 +Pixhawk Aux3 +Pixhawk Aux4 +Pixhawk Aux5 +Pixhawk Aux6 +Pixhawk 3.3ADC1 +Pixhawk 3.3ADC2 +Pixhawk 6.6ADC + + + + +Low +High + + + + +Disabled +Pixhawk Aux1 +Pixhawk Aux2 +Pixhawk Aux3 +Pixhawk Aux4 +Pixhawk Aux5 +Pixhawk Aux6 +Pixhawk 3.3ADC1 +Pixhawk 3.3ADC2 +Pixhawk 6.6ADC + + + + +Low +High + + + + +Disabled +Pixhawk Aux1 +Pixhawk Aux2 +Pixhawk Aux3 +Pixhawk Aux4 +Pixhawk Aux5 +Pixhawk Aux6 +Pixhawk 3.3ADC1 +Pixhawk 3.3ADC2 +Pixhawk 6.6ADC + + + + +Low +High + + + + + +1000 2000 +1 +pwm + + +1000 2000 +1 +pwm + + + + + +None +File +MAVLink +BothFileAndMAVLink + + + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + + +0 32766 +1 + + + +Resume Mission +Restart Mission + + + + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +Centi-Degrees + + +-18000 17999 +1 +Centi-Degrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +Centi-Degrees + + +-18000 17999 +1 +Centi-Degrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +Centi-Degrees + + +-18000 17999 +1 +Centi-Degrees + + +0 100 +1 + + +0.0 0.2 +.005 +Seconds + + +0.0 0.2 +.005 +Seconds + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + +True + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +Centi-Degrees + + +-18000 17999 +1 +Centi-Degrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +Centi-Degrees + + +-18000 17999 +1 +Centi-Degrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +Centi-Degrees + + +-18000 17999 +1 +Centi-Degrees + + +0.0 0.2 +.005 +Seconds + + +0.0 0.2 +.005 +Seconds + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + + + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + +0.0 1.5 +0.1 + + +0 500 +pwm + + +0.25 0.8 + + +0.9:Low, 0.95:Default, 1.0:High + + +6 35 +Volts + + +6 35 +Volts + + +0 200 +Amps + + + +Normal +OneShot +OneShot125 +Brushed16kHz + +True + + +0 2000 + + +0 2000 + + +0.0:Low, 0.15:Default, 0.3:High + + +0.0:Low, 0.1:Default, 0.2:High + + +0 10 +Seconds + + +0.2 0.8 + + + +Disabled +Learn +LearnAndSave + + + + +PWM enabled while disarmed +PWM disabled while disarmed + + + +5 80 +1 +Degrees + + +0 2 +0.1 +Seconds + + + + +1 60 +1 +seconds + + +0.6 1.0 +0.05 + + +0 0.1 +0.01 + + +0 89 +degrees + + + + + +Off +Low +Medium +High + + + + +Disable +Enable + + + + +Disable +Enable + + + + +Disable +ssd1306 +sh1106 + + + + + + +Disabled +Enabled Always Land +Enabled Strict + + + + +None +CompanionComputer +IRLock +SITL_Gazebo +SITL + + + +0 360 +1 +Centi-degrees + + +-20 20 +1 +Centimeters + + +-20 20 +1 +Centimeters + + + +RawSensor +KalmanFilter + + + +0.5 5 + + +m + + +m + + +m + + + +DefaultBus +InternalI2C +ExternalI2C + + + + + + +None +LightWareSF40C +MAVLink +TeraRangerTower +RangeFinder + + + + +Default +Upside Down + + + +-180 180 +degrees + + +0 360 +degrees + + +0 45 +degrees + + +0 360 +degrees + + +0 45 +degrees + + +0 360 +degrees + + +0 45 +degrees + + +0 360 +degrees + + +0 45 +degrees + + +0 360 +degrees + + +0 45 +degrees + + +0 360 +degrees + + +0 45 +degrees + + + +None +LightWareSF40C +MAVLink +TeraRangerTower +RangeFinder + + + + +Default +Upside Down + + + +-180 180 +degrees + + + + +0.5 5 +0.1 +Hz + + + + +0.4 1.0 +0.1 +seconds + + +0.1 3.0 +0.1 + + +0 0.1 +0.01 + + +0 0.5 +0.05 + + +0 100 +1 +degrees/second + + +0 100 +1 +degrees/second + + +0.7 1.5 +0.05 + + +0 4500 +1 + + +0.1 4.0 +0.1 + + + + +0.08 0.30 +0.005 + + +0.01 0.5 +0.01 + + +0 1 +0.01 +Percent + + +0.0 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz + + +0.08 0.30 +0.005 + + +0.01 0.5 +0.01 + + +0 1 +0.01 +Percent + + +0.0 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz + + +0.10 0.50 +0.005 + + +0.010 0.05 +0.01 + + +0 1 +0.01 +Percent + + +0.000 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz + + +0.1 0.25 + + +0.5 0.9 + + +0.5 0.9 + + + + + + +0.1 +kilometers + + + +DoNotIncludeHome +IncludeHome + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + + + + +Disabled +APM2 A9 pin +APM1 relay +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +APM2 A9 pin +APM1 relay +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +APM2 A9 pin +APM1 relay +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +APM2 A9 pin +APM1 relay +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Off +On +NoChange + + + + + +0.4 1.0 +0.1 +seconds + + +0.1 4.0 +0.1 + + +0 0.1 +0.01 + + +0 1.0 +0.05 + + +0 180 +1 +degrees/second + + +0 4500 +1 + + +0.1 4.0 +0.1 + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TrOneI2C +LidarLiteV3-I2C + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +meters/Volt + + +0.001 +Volts + + + +Linear +Inverted +Hyperbolic + + + +1 +centimeters + + +1 +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +milliseconds + + + +No +Yes + + + +0 32767 +meters + + +5 127 +1 +centimeters + + +0 127 +1 + + +m + + +m + + +m + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TrOneI2C +LidarLiteV3-I2C + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +meters/Volt + + +0.001 +Volts + + + +Linear +Inverted +Hyperbolic + + + +1 +centimeters + + +1 +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +milliseconds + + + +No +Yes + + + +0 127 +1 +centimeters + + +0 127 +1 + + +m + + +m + + +m + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TrOneI2C +LidarLiteV3-I2C + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +meters/Volt + + +0.001 +Volts + + + +Linear +Inverted +Hyperbolic + + + +1 +centimeters + + +1 +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +milliseconds + + + +No +Yes + + + +0 127 +1 +centimeters + + +0 127 +1 + + +m + + +m + + +m + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TrOneI2C +LidarLiteV3-I2C + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +meters/Volt + + +0.001 +Volts + + + +Linear +Inverted +Hyperbolic + + + +1 +centimeters + + +1 +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +milliseconds + + + +No +Yes + + + +0 127 +1 +centimeters + + +0 127 +1 + + +m + + +m + + +m + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + + +None +PX4-PWM +AUXPIN + + + +0.001 + + +1 + + +1 + + +0.1 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +None +PX4-PWM +AUXPIN + + + +0.001 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + + + +Disabled +AnalogPin +RCChannelPwmValue + + + + +APM2 A0 +APM2 A1 +APM2 A13 +Pixracer +Pixhawk ADC4 +Pixhawk ADC3 + Pixhawk ADC6 +Pixhawk SBUS + + + +0 5.0 +0.01 +Volt + + +0 5.0 +0.01 +Volt + + + + + +0 2000 +Microseconds + + +0 2000 +Microseconds + + + + + +Disabled +ShowSlips +ShowOverruns + + + + +50Hz +100Hz +200Hz +250Hz +300Hz +400Hz + +True + + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +460800 +500000 +921600 +1500000 + + + + +MAVlink1 +MAVLink2 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Lidar +FrSky SPort Passthrough (OpenTX) +Lidar360 +Aerotenna uLanding +Beacon + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Lidar +FrSky SPort Passthrough (OpenTX) +Lidar360 +Aerotenna uLanding +Beacon + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Lidar +FrSky SPort Passthrough (OpenTX) +Lidar360 +Aerotenna uLanding +Beacon + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Lidar +FrSky SPort Passthrough (OpenTX) +Lidar360 +Aerotenna uLanding +Beacon + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Lidar +FrSky SPort Passthrough (OpenTX) +Lidar360 +Aerotenna uLanding +Beacon + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + + + +Disable +Enable + + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight + + + + + + +Disable +Enable + + + +0 10 +m/s + + +0 100 +metres + + +0 32768 +seconds + + +0 32768 +seconds + + +0 0.5 +m*m/s/s + + +0 1000.0 +meters + + +0 1000.0 +meters + + +0 1000.0 +meters + + +0 16 + + + + + + + + + + + + + + + +Disabled +Enabled + + + +0 100 +percentage + + +1000 2000 +ms + + +0 1000 +cm/s + + +0 100 +percentage + + + + + + +seconds + + +seconds + + +seconds + + + + +0.4 1.0 +0.1 +seconds + + +0.1 10.0 +0.1 + + +0 1.0 +0.05 + + +0 0.1 +0.01 + + +0 4500 +1 + + +0 5 +0.1 +m/s + + +0.0 10.0 +0.1 + + +0.0 30.0 +0.1 +m/s + + +0.0 50.0 +0.1 +degree/(m/s) + + +0.0 4500.0 +0.1 +Centidegrees + + + + +0.1 20.0 +0.1 + + +0.1 10.0 +0.1 + + +3.0 10.0 +0.2 + + +0.1 1.0 +0.1 + + +0.0 0.5 +0.02 + + +1.0 10.0 +0.5 + + +1.0 5.0 +0.05 + + +0.5 2.0 +0.05 + + +5.0 30.0 +1.0 + + +0.0 2.0 +0.1 + + +0.1 1.0 +0.1 + + +0.0 20.0 +0.1 + + +-1 127 +1 + + +-1 100 +0.1 + + +-1.0 2.0 +0.1 + + +0 45 +1 + + +-45 0 +1 + + +0.0 2.0 +0.1 + + +1.0 5.0 +0.2 + + +0.1 1.0 +0.1 + + +-5 40 +1 + + +0.0 20.0 +0.1 +m/s + + +-2.0 2.0 +0.1 +m/s/m + + +0.1 1.0 +0.1 + + +0.0 0.5 +0.02 + + +0.0 0.5 +0.02 + + +0.1 1.0 +0.1 + + + +Disable +Enable + + + + + + +Disable +Enable + + + +1 +meters + + + + + +Disable +Chan5 +Chan6 +Chan7 +Chan8 +Chan9 +Chan10 +Chan11 +Chan12 +Chan13 +Chan14 +Chan15 +Chan16 + + + +900 2100 + + +900 2100 + + + +Disable +Chan1 +Chan3 +Chan3 +Chan4 +Chan5 +Chan6 +Chan7 +Chan8 +Chan9 +Chan10 +Chan11 +Chan12 +Chan13 +Chan14 +Chan15 +Chan16 + + + + + + +Disable +Enable + + + +0 1 + + + + + +None +MAV + + + +m + + +m + + +m + + + +Forward +Right +Back +Left +Up +Down + + + + + +20 2000 +50 +cm/s + + +100 1000 +1 +cm + + +10 1000 +50 +cm/s + + +10 500 +10 +cm/s + + +20 2000 +50 +cm/s + + +50 500 +10 +cm/s/s + + +50 500 +10 +cm/s/s + + +500 5000 +1 +cm/s/s/s + + +100 981 +1 +cm/s/s + + +25 250 +1 +cm/s/s + + + +Disable +Enable + + + + + +0 4 +0.25 + + +0 2 +0.25 + + +0 2 +0.25 + + +0.8 1.2 +0.05 + + +0 4500 +1 + + + diff --git a/src/FirmwarePlugin/APM/APMParameterFactMetaData.Copter.3.6.xml b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Copter.3.6.xml new file mode 100644 index 0000000..70e35ad --- /dev/null +++ b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Copter.3.6.xml @@ -0,0 +1,9401 @@ + + + + + + +True + + +True + +ArduPlane +AntennaTracker +Copter +Rover +ArduSub + + + +1 255 + + + +Mission Planner and DroidPlanner + AP Planner 2 + + + +0 10 +.5 +Hz +hertz + + +0.0 1000.0 +10 +cm +centimeters + + +0 500 +10 + + +0:Feedback from mid stick,1:High throttle cancels landing,2:Disarm on land detection + +None +Feedback from mid stick +High throttle cancels landing +Disarm on land detection + + + +0 30 +1 +s +seconds + + +0:Roll,1:Pitch,2:Yaw + +None +Roll +Pitch +Yaw + + + +0 8000 +1 +cm +centimeters + + +0.5 10.0 + +Disabled +Shallow +Steep + +.1 + + +0 2000 +50 +cm/s +centimeters per second + + +-1 1000 +1 +cm +centimeters + + +0 3000 +10 +cm +centimeters + + +0 60000 +1000 +ms +milliseconds + + +0.01 2.0 +0.01 + + + +Disabled +Enabled always RTL +Enabled Continue with Mission in Auto Mode +Enabled always SmartRTL or RTL +Enabled always SmartRTL or Land + + + +100 900 + + + +Disabled +Enabled + + + + +Disabled +Mode1 +Mode2 +Mode1+2 +Mode3 +Mode1+3 +Mode2+3 +Mode1+2+3 +Mode4 +Mode1+4 +Mode2+4 +Mode1+2+4 +Mode3+4 +Mode1+3+4 +Mode2+3+4 +Mode1+2+3+4 +Mode5 +Mode1+5 +Mode2+5 +Mode1+2+5 +Mode3+5 +Mode1+3+5 +Mode2+3+5 +Mode1+2+3+5 +Mode4+5 +Mode1+4+5 +Mode2+4+5 +Mode1+2+4+5 +Mode3+4+5 +Mode1+3+4+5 +Mode2+3+4+5 +Mode1+2+3+4+5 +Mode6 +Mode1+6 +Mode2+6 +Mode1+2+6 +Mode3+6 +Mode1+3+6 +Mode2+3+6 +Mode1+2+3+6 +Mode4+6 +Mode1+4+6 +Mode2+4+6 +Mode1+2+4+6 +Mode3+4+6 +Mode1+3+4+6 +Mode2+3+4+6 +Mode1+2+3+4+6 +Mode5+6 +Mode1+5+6 +Mode2+5+6 +Mode1+2+5+6 +Mode3+5+6 +Mode1+3+5+6 +Mode2+3+5+6 +Mode1+2+3+5+6 +Mode4+5+6 +Mode1+4+5+6 +Mode2+4+5+6 +Mode1+2+4+5+6 +Mode3+4+5+6 +Mode1+3+4+5+6 +Mode2+3+4+5+6 +Mode1+2+3+4+5+6 + + + + +Never change yaw +Face next waypoint +Face next waypoint except RTL +Face along GPS course + + + +30 200 +10 +cm/s +centimeters per second + + +0 500 +10 +cm/s +centimeters per second + + +50 500 +10 +cm/s +centimeters per second + + +50 500 +10 +cm/s/s +centimeters per square second + + + +Disabled +Enabled always RTL +Enabled Continue with Mission in Auto Mode +Enabled always Land +Enabled always SmartRTL or RTL +Enabled always SmartRTL or Land + + + +925 1100 +1 +PWM +PWM in microseconds + + +0 300 +1 +PWM +PWM in microseconds + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +Smart_RTL +FlowHold +Follow + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +Smart_RTL +FlowHold +Follow + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +Smart_RTL +FlowHold +Follow + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +Smart_RTL +FlowHold +Follow + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +Smart_RTL +FlowHold +Follow + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +Smart_RTL +FlowHold +Follow + + + + +Disabled +Channel5 +Channel6 +Channel7 +Channel8 + + + + + +0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:CTUN,5:NTUN,6:RCIN,7:IMU,8:CMD,9:CURRENT,10:RCOUT,11:OPTFLOW,12:PID,13:COMPASS,14:INAV,15:CAMERA,17:MOTBATT,18:IMU_FAST,19:IMU_RAW + +Default +Default+RCIN +Default+IMU +Default+Motors +NearlyAll-AC315 +NearlyAll +All+FastATT +All+MotBatt +All+FastIMU +All+FastIMU+PID +All+FullIMU +Disabled + + + + +Normal Start-up +Start-up in ESC Calibration mode if throttle high +Start-up in ESC Calibration mode regardless of throttle +Start-up and automatically calibrate ESCs +Disabled + + + + +None +Stab Roll/Pitch kP +Rate Roll/Pitch kP +Rate Roll/Pitch kI +Rate Roll/Pitch kD +Stab Yaw kP +Rate Yaw kP +Rate Yaw kD +Rate Yaw Filter +Motor Yaw Headroom +AltHold kP +Throttle Rate kP +Throttle Accel kP +Throttle Accel kI +Throttle Accel kD +Loiter Pos kP +Velocity XY kP +Velocity XY kI +WP Speed +Acro RollPitch kP +Acro Yaw kP +RC Feel +Heli Ext Gyro +Declination +Circle Rate +RangeFinder Gain +Rate Pitch kP +Rate Pitch kI +Rate Pitch kD +Rate Roll kP +Rate Roll kI +Rate Roll kD +Rate Pitch FF +Rate Roll FF +Rate Yaw FF +Winch + + + +0 32767 + + +0 32767 + + + +Plus +X +V +H +V-Tail +A-Tail +Y6B + +True + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Object Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Object Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Object Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Object Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Object Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Object Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl + + + +0 127 +s +seconds + + +1000 8000 +cdeg +centidegrees + + +4 12 +deg/s +degrees per second + + +2000 4500 +cdeg +centidegrees + + + +No repositioning +Repositioning + + + + +Land +AltHold +Land even in Stabilize + + + +0.6:Strict, 0.8:Default, 1.0:Relaxed + + + +Disabled +Enabled + + + +50 490 +1 +Hz +hertz + + +1 10 + + +1 10 + + +0 3 +0.1 + + +0 3 +0.1 + + + +Disabled +Leveling +Leveling and Limited + + + +-0.5 1.0 + +Disabled +Very Low +Low +Medium +High +Very High + + + +0:Roll,1:Pitch,2:Yaw + +All +Roll Only +Pitch Only +Yaw Only +Roll and Pitch +Roll and Yaw +Pitch and Yaw + + + +0.05 0.10 + + +0.001 0.006 + + + +Stopped +Running + + + + +Do Not Use in RTL and Land +Use in RTL and Land + + + +0 5 + + + +Auto +Guided +LOITER +RTL +Land +Brake +Throw + + + + +Upward Throw +Drop + + + + +Disabled +Enabled + + + +0:ADSBMavlinkProcessing + + +-0.5 1.0 + +Disabled +Very Low +Low +Medium +High +Very High + + + +0 1 + + + +NotEnforced +Enforced + + + + +Undefined +Quad +Hexa +Octa +OctaQuad +Y6 +Heli +Tri +SingleCopter +CoaxCopter +Heli_Dual +DodecaHexa +HeliQuad + +True + + +50 500 +10 +cm/s +centimeters per second + + +100 10000 +10 +cm +centimeters + + + + + +Disabled +Enabled + + + +1 100 + + +1 100000 + + +-1 16777215 + + + +NoInfo +Light +Small +Large +HighVortexlarge +Heavy +HighlyManuv +Rotocraft +RESERVED +Glider +LightAir +Parachute +UltraLight +RESERVED +UAV +Space +RESERVED +EmergencySurface +ServiceSurface +PointObstacle + + + + +NO_DATA +L15W23 +L25W28P5 +L25W34 +L35W33 +L35W38 +L45W39P5 +L45W45 +L55W45 +L55W52 +L65W59P5 +L65W67 +L75W72P5 +L75W80 +L85W80 +L85W90 + + + + +NoData +Left2m +Left4m +Left6m +Center +Right2m +Right4m +Right6m + + + + +NO_DATA +AppliedBySensor + + + + +Disabled +Rx-Only +Tx-Only +Rx and Tx Enabled + + + +octal +octal + + +0:UAT_in,1:1090ES_in,2:UAT_out,3:1090ES_out + +Unknown +Rx UAT only +Rx UAT and 1090ES +Rx&Tx UAT and 1090ES + + + + + + + + + + + + + + + + + + + + + +m +meters + + +m +meters + + +mbar +millibar + + + + + + + + + + + + + + +s +seconds + + + + +0.0 1.0 +.01 + + + +Disabled +Enabled + + + +0.1 0.4 +.01 + + +0.1 0.4 +.01 + + +0 127 +1 +m/s +meters per second + + +-0.1745 +0.1745 +0.01 +rad +radians + + +-0.1745 +0.1745 +0.01 +rad +radians + + +-0.1745 +0.1745 +0.01 +rad +radians + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 +Custom + + + +0.001 0.5 +.01 + + +0 10 +1 + + + +Disabled +Enable EKF2 +Enable EKF3 + + + +-180 180 +1 +deg +degrees + + +-180 180 +1 +deg +degrees + + +-180 180 +1 +deg +degrees + + + + + +Disabled +THR_MIN PWM when disarmed +0 PWM when disarmed + + + +0:All,1:Barometer,2:Compass,3:GPS lock,4:INS,5:Parameters,6:RC Channels,7:Board voltage,8:Battery Level,10:Logging Available,11:Hardware safety switch,12:GPS Configuration + +None +All +Barometer +Compass +GPS Lock +INS(INertial Sensors - accels & gyros) +Parameters(unused) +RC Channels +Board voltage +Battery Level +LoggingAvailable +Hardware safety switch +GPS configuration + + + +0.25 3.0 +m/s/s +meters per square second + + +0.1 +V +volt + + +0.1 +V +volt + + + + +500 18000 +100 +cdeg/s +centidegrees per second + + +0 72000 + +Disabled +VerySlow +Slow +Medium +Fast + +1000 +cdeg/s/s +centidegrees per square second + + + +Disabled +Enabled + + + +0 180000 + +Disabled +VerySlow +Slow +Medium +Fast + +1000 +cdeg/s/s +centidegrees per square second + + +0 180000 + +Disabled +VerySlow +Slow +Medium +Fast + +1000 +cdeg/s/s +centidegrees per square second + + + +Disabled +Enabled + + + +3.000 12.000 + + +3.000 12.000 + + +3.000 6.000 + + +0.5 10.0 + + +0 1080 + +Disabled +Slow +Medium +Fast + +1 +deg/s +degrees per second + + +0 1080 + +Disabled +Slow +Medium +Fast + +1 +deg/s +degrees per second + + +0 1080 + +Disabled +Slow +Medium +Fast + +1 +deg/s +degrees per second + + +0 1 +0.5:Very Soft, 0.2:Soft, 0.15:Medium, 0.1:Crisp, 0.05:Very Crisp +0.01 +s +seconds + + +0.05 0.5 +0.005 + + +0.01 2.0 +0.01 + + +0 1 +0.01 +% +percent + + +0.0 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz +hertz + + +0.05 0.50 +0.005 + + +0.01 2.0 +0.01 + + +0 1 +0.01 +% +percent + + +0.0 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz +hertz + + +0.10 2.50 +0.005 + + +0.010 1.0 +0.01 + + +0 1 +0.01 +% +percent + + +0.000 0.02 +0.001 + + +0 0.5 +0.001 + + +1 10 +1 +Hz +hertz + + +0.1 0.25 + + +0.5 0.9 + + +0.1 0.9 + + +0 1000 +cdeg +centidegrees + + +0.08 0.35 +0.005 + + +0.01 0.6 +0.01 + + +0 1 +0.01 + + +0.001 0.03 +0.001 + + +0 0.5 +0.001 + + +1 20 +1 +Hz +hertz + + +0.08 0.35 +0.005 + + +0.01 0.6 +0.01 + + +0 1 +0.01 + + +0.001 0.03 +0.001 + + +0 0.5 +0.001 + + +1 20 +1 +Hz +hertz + + +0.180 0.60 +0.005 + + +0.01 0.06 +0.01 + + +0 1 +0.01 + + +0.000 0.02 +0.001 + + +0 0.5 +0.001 + + +1 20 +1 +Hz +hertz + + + +Disabled +Enabled + + + + + + +Disabled +Enabled + + + + +Remain in AVOID_ADSB +Resume previous flight mode +RTL +Resume if AUTO else Loiter + + + + + +s +seconds + + +s +seconds + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + + + +0:StopAtFence,1:UseProximitySensor,2:StopAtBeaconFence + +None +StopAtFence +UseProximitySensor +StopAtFence and UseProximitySensor +StopAtBeaconFence +All + + + +0 4500 +cdeg +centidegrees + + +1 30 +m +meters + + +1 10 +m +meters + + + +Slide +Stop + + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo + + + + +Disabled +A0 +A1 +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + + + + +Disabled +A1 +A2 +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +Land +RTL +SmartRTL +SmartRTL or Land +Terminate + + + + +None +Land +RTL +SmartRTL +SmartRTL or Land +Terminate + + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo + + + + +Disabled +A0 +A1 +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + + + + +Disabled +A1 +A2 +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +Land +RTL +SmartRTL +SmartRTL or Land +Terminate + + + + +None +Land +RTL +SmartRTL +SmartRTL or Land +Terminate + + + + + + +None +Pozyx +Marvelmind + + + +-90 90 +0.000001 +deg +degrees + + +-180 180 +0.000001 +deg +degrees + + +0 10000 +1 +m +meters + + +-180 +180 +1 +deg +degrees + + + + + +No PWMs +Two PWMs +Four PWMs +Six PWMs +Three PWMs and One Capture + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled + +True + + + +Disabled +50Hz +75Hz +100Hz +150Hz +200Hz +250Hz +300Hz + +True + + +-32768 32767 + + +0:Ch1,1:Ch2,2:Ch3,3:Ch4,4:Ch5,5:Ch6,6:Ch7,7:Ch8,8:Ch9,9:Ch10,10:Ch11,11:Ch12,12:Ch13,13:Ch14 + +Disabled +Enabled + +True + + +-1 80 +degC +degrees Celsius + + + +AUTO +PX4V1 +Pixhawk +Cube/Pixhawk2 +Pixracer +PixhawkMini +Pixhawk2Slim +VRBrain 5.1 +VRBrain 5.2 +VR Micro Brain 5.1 +VR Micro Brain 5.2 +VRBrain Core 1.0 +VRBrain 5.4 +Intel Aero FC +AUAV2.1 + +True + + + +Disabled +Enabled + +True + + +0:ActiveForSafetyEnable,1:ActiveForSafetyDisable,2:ActiveWhenArmed + + + + + +None +CYRF6936 + + + + +Auto +DSM2 +DSMX + + + +0 4 + + + +NotDisabled +Disabled + + + +0 16 + + +0 16 + + + +Disabled +Enabled + + + +1 8 + + + +Disabled +MinChannel +MidChannel +MaxChannel +MinChannelCW +MidChannelCW +MaxChannelCW + + + + +Mode1 +Mode2 + + + + +Disabled +TestChan1 +TestChan2 +TestChan3 +TestChan4 +TestChan5 +TestChan6 +TestChan7 +TestChan8 + + + +0 16 + + +0 16 + + +1 8 + + +0 40 + + +0 120 + + +0 31 + + + + + +Disabled +Enabled + + + + +Disabled +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +0 3600 + + + + + +Servo +Relay + + + +0 50 +ds +deciseconds + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +0 1000 +m +meters + + + +Low +High + + + +0 10000 +ms +milliseconds + + +0 180 +deg +degrees + + + +Disabled +PX4 AUX1 +PX4 AUX2 +PX4 AUX3 +PX4 AUX4(fast capture) +PX4 AUX5 +PX4 AUX6 + + + + +TriggerLow +TriggerHigh + + + + +Always +Only when in AUTO + + + + + + +Disabled +UAVCAN + +True + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +UAVCAN + +True + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +UAVCAN + +True + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +Enabled + + + + +First Relay +Second Relay +Third Relay +Fourth Relay +Servo + + + +1000 2000 +1 +PWM +PWM in microseconds + + +1000 2000 +1 +PWM +PWM in microseconds + + +0 32000 +1 +m +meters + + +0 5000 +1 +ms +milliseconds + + + + +0 10000 +100 +cm +centimeters + + +-90 90 +1 +deg/s +degrees per second + + + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-3.142 3.142 +0.01 +rad +radians + + + +Disabled +Internal-Learning +EKF-Learning + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Use Throttle +Use Current + + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + + +FirstCompass +SecondCompass +ThirdCompass + + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + + + + + + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +4 32 + +Very Strict +Strict +Default +Relaxed + +0.1 + + +500 3000 +1 + + +0:HMC5883,1:LSM303D,2:AK8963,3:BMM150,4:LSM9DS1,5:LIS3MDL,6:AK09916,7:IST8310,8:ICM20948,9:MMC3416,11:UAVCAN,12:QMC5883 + + +0 100 +1 +% +percent + + + + + +Disabled +Enabled + + + +0 2 +0.01 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + +0 250 +10 +ms +milliseconds +True + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.000001 0.001 +Hz +hertz + + +0.00001 0.001 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +2.0 6.0 +0.5 +m/s +meters per second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + +True + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.00001 0.001 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +2.0 6.0 +0.5 +m/s +meters per second + + +0.5 2.5 +0.1 +m/s/s +meters per square second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + +0.05 0.5 +0.05 +m/s +meters per second + + +0.5 5.0 +0.1 +m/s +meters per second + + +0.01 1.0 +0.1 +m/s +meters per second + + + + + +Disabled +Enabled + + + +0:Altitude,1:Circle,2:Polygon + +None +Altitude +Circle +Altitude and Circle +Polygon +Altitude and Polygon +Circle and Polygon +All + + + + +Report Only +RTL or Land + + + +10 1000 +1 +m +meters + + +30 10000 +m +meters + + +1 10 +m +meters + + +1 20 + + +-100 100 +1 +m +meters + + + + +0.1 6.0 +0.1 + + +0.02 1.00 +0.01 + + +0 4500 +10 +cdeg +centidegrees + + +0.1 2.5 + + +1 100 +Hz +hertz + + +0 255 + + +1 30 +deg/s +degrees per second + + + + + +Disabled +Enabled + + + +-200 +200 +1 + + +-200 +200 +1 + + +-18000 +18000 +1 + + +m +meters + + +m +meters + + +m +meters + + +0 127 + + + + + +Disabled +Enabled + + + +0 255 + + +1 1000 +m +meters + + + +North-East-Down +Relative to lead vehicle heading + + + +-100 100 +1 +m +meters + + +-100 100 +1 +m +meters + + +-100 100 +1 +m +meters + + + +None +Face Lead Vehicle +Same as Lead vehicle +Direction of Flight + + + +0.01 1.00 +0.01 + + + + +True +True +1 +Pa +pascal + + +True +1 +degC +degrees Celsius + + +0.1 +m +meters + + + +FirstBaro +2ndBaro +3rdBaro + + + + +Disabled +Bus0 +Bus1 + + + +1.0:Freshwater,1.024:Saltwater + + +True +True +1 +Pa +pascal + + +True +True +1 +Pa +pascal + + +0 100 +1 +% +percent + + + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA + +True + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA + +True + + + +Portable +Stationary +Pedestrian +Automotive +Sea +Airborne1G +Airborne2G +Airborne4G + + + + +Disabled +UseBest +Blend + + + + +Any +FloatRTK +IntegerRTK + +True + + + +Disabled +Enabled +NoChange + + + +-100 90 +deg +degrees + + + +send to first GPS +send to 2nd GPS +send to all + + + + +None (0x0000) +All (0xFFFF) +External only (0xFF00) + + + + +Ignore +Always log +Stop logging when disarmed (SBF only) +Only log every five samples (uBlox only) + +True + + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + + + + +Do not save config +Save config +Save only when needed + + + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + + + + +Disables automatic configuration +Enable automatic configuration + + + +50 200 + +10Hz +8Hz +5Hz + +ms +milliseconds + + +50 200 + +10Hz +8Hz +5Hz + +ms +milliseconds + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +0 250 +ms +milliseconds +True + + +0 250 +ms +milliseconds +True + + +0:Horiz Pos,1:Vert Pos,2:Speed + + +5.0 30.0 +s +seconds + + + + + +Disabled +Enabled + + + + +None +Servo +EPM + + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +0 255 +s +seconds + + +0 255 + + + + +-180 180 +1 +deg +degrees + + +-180 180 +1 +deg +degrees + + +-180 180 +1 +deg +degrees + + + +Servo only +Servo with ExtGyro +DirectDrive VarPitch +DirectDrive FixedPitch + + + + +H3 CCPM Adjustable +H1 Straight Swash +H3_140 CCPM + + + +0 1000 +1 +PWM +PWM in microseconds + + +-30 30 +1 +deg +degrees + + +-10 10 +0.1 + + + +NoFlybar +Flybar + + + +0 1000 +1 +PWM +PWM in microseconds + + +0 1000 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +-180 180 +1 +deg +degrees + + +-180 180 +1 +deg +degrees + + +-180 180 +1 +deg +degrees + + +-180 180 +1 +deg +degrees + + +-180 180 +1 +deg +degrees + + +-180 180 +1 +deg +degrees + + +-90 90 +1 +deg +degrees + + +-90 90 +1 +deg +degrees + + + +Longitudinal +Transverse + + + +0 1 + + +-10 10 +0.1 + + +-10 10 +0.1 + + +1000 2000 +1 +PWM +PWM in microseconds + + +1000 2000 +1 +PWM +PWM in microseconds + + +1000 2000 +1 +PWM +PWM in microseconds + + +0: Normal, 1: Reversed + + +1000 2000 +1 +PWM +PWM in microseconds + + +1000 2000 +1 +PWM +PWM in microseconds + + +1000 2000 +1 +PWM +PWM in microseconds + + + +Disabled +Passthrough +Max collective +Mid collective +Min collective + + + +0 1000 +10 +PWM +PWM in microseconds + + + +Ch8 Input +SetPoint +Throttle Curve + + + +0 500 +1 +PWM +PWM in microseconds + + +0 60 +s +seconds + + +0 60 +s +seconds + + +0 1000 +10 + + +0 500 +10 + + +0 18000 +100 +cdeg +centidegrees + + +0 10 +1 + + +0 500 +10 + + +0 1000 +10 + + +0 1000 +10 + + +0 1000 +10 + + +0 1000 +10 + + +0 1000 +10 + + + + +0 500 +1 +d% +decipercent + + +0 500 +1 +d% +decipercent + + +500 1000 +1 +d% +decipercent + + +500 1000 +1 +d% +decipercent + + + +Disabled +Very Low +Low +Medium +High +Very High + + + + + + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +0 127 +Hz +hertz + + +0 127 +Hz +hertz + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +0.05 50 + + + +Never +Start-up only + + + + +Don't adjust the trims +Assume first orientation was level +Assume ACC_BODYFIX is perfectly aligned to the vehicle + + + + +IMU 1 +IMU 2 +IMU 3 + + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +True + + +True + + +True + + +True + + +True + + +True + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU + +FirstIMUOnly +FirstAndSecondIMU + + + + + +32 + + +0:IMU1,1:IMU2,2:IMU3 + +None +First IMU +All + + + +0:Sensor-Rate Logging (sample at full sensor rate seen by AP) + + +ms +milliseconds +10 + + +1 + + + + + +Disabled +Enabled + + + +10 200 +Hz +hertz + + +5 50 +Hz +hertz + + +5 30 +dB +decibel + + + + +1000 2000 +1 +PWM +PWM in microseconds + + +1000 2000 +1 +PWM +PWM in microseconds + + + +WaitForPilotInput +Retract +Deploy + + + + + + +None +File +MAVLink +BothFileAndMAVLink + + + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +kB +kilobytes + + + + +0 45 +1 +deg +degrees + + +20 2000 +50 +cm/s +centimeters per second + + +100 981 +1 +cm/s/s +centimeters per square second + + +25 250 +1 +cm/s/s +centimeters per square second + + +500 5000 +1 +cm/s/s/s +centimeters per cubic second + + +0 2 +0.1 +s +seconds + + + + +0 32766 +1 + + + +Resume Mission +Restart Mission + + + +0:Clear Mission on reboot + + + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + +0 100 +1 + + +0.0 0.2 +.005 +s +seconds + + +0.0 0.2 +.005 +s +seconds + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + +True + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + +0.0 0.2 +.005 +s +seconds + + +0.0 0.2 +.005 +s +seconds + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + + + + + +0 500 +PWM +PWM in microseconds + + +0.25 0.8 + + +0.9:Low, 0.95:Default, 1.0:High + + +6 35 +V +volt + + +6 35 +V +volt + + +0 200 +A +ampere + + + +Normal +OneShot +OneShot125 +Brushed +DShot150 +DShot300 +DShot600 +DShot1200 + +True + + +0 2000 +PWM +PWM in microseconds + + +0 2000 +PWM +PWM in microseconds + + +0.0:Low, 0.15:Default, 0.3:High + + +0.0:Low, 0.1:Default, 0.2:High + + +0 10 +s +seconds + + +0.2 0.8 + + + +Disabled +Learn +LearnAndSave + + + + +PWM enabled while disarmed +PWM disabled while disarmed + + + +5 80 +1 +deg +degrees + + +0 2 +0.1 +s +seconds + + +0 5 +0.1 + + + +First battery +Second battery + + + + + + +Off +Low +Medium +High + + + + +Disable +Enable + + + + +Disable +Enable + + + + +Disable +ssd1306 +sh1106 + + + + +Disabled +Aircraft +Rover + + + + +Disabled + + + + + + +Disabled +Enabled Always Land +Enabled Strict + + + + +None +CompanionComputer +IRLock +SITL_Gazebo +SITL + + + +0 360 +1 +cdeg +centidegrees + + +-20 20 +1 +cm +centimeters + + +-20 20 +1 +cm +centimeters + + + +RawSensor +KalmanFilter + + + +0.5 5 + + +m +meters + + +m +meters + + +m +meters + + + +DefaultBus +InternalI2C +ExternalI2C + + + + + + +None +LightWareSF40C +MAVLink +TeraRangerTower +RangeFinder +RPLidarA2 + +True + + + +Default +Upside Down + + + +-180 180 +deg +degrees + + +0 360 +deg +degrees + + +0 45 +deg +degrees + + +0 360 +deg +degrees + + +0 45 +deg +degrees + + +0 360 +deg +degrees + + +0 45 +deg +degrees + + +0 360 +deg +degrees + + +0 45 +deg +degrees + + +0 360 +deg +degrees + + +0 45 +deg +degrees + + +0 360 +deg +degrees + + +0 45 +deg +degrees + + + +None +LightWareSF40C +MAVLink +TeraRangerTower +RangeFinder +RPLidarA2 + +True + + + +Default +Upside Down + + + +-180 180 +deg +degrees + + + + +0.5 5 +0.1 +Hz +hertz + + +1.000 3.000 + + +1.000 8.000 + + +0.500 1.500 +0.05 + + +0.000 3.000 + + +0 1000 +d% +decipercent + + +0.000 0.400 + + +1.000 100.000 +Hz +hertz + + +0.500 2.000 + + +0.1 6.0 +0.1 + + +0.02 1.00 +0.01 + + +0.00 1.00 +0.001 + + +0 4500 +10 +cm/s/s +centimeters per square second + + +0 100 +Hz +hertz + + +0 100 +Hz +hertz + + +0 45 +1 +deg +degrees + + + + + + +0.1 +km +kilometers + + + +DoNotIncludeHome +IncludeHome + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + + + + +Disabled +APM2 A9 pin +APM1 relay +BB Blue GP0 pin 4 +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +BB Blue GP0 pin 3 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1/BB Blue GP0 pin 6 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2/BB Blue GP0 pin 5 + + + + +Disabled +APM2 A9 pin +APM1 relay +BB Blue GP0 pin 4 +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +BB Blue GP0 pin 3 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1/BB Blue GP0 pin 6 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2/BB Blue GP0 pin 5 + + + + +Disabled +APM2 A9 pin +APM1 relay +BB Blue GP0 pin 4 +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +BB Blue GP0 pin 3 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1/BB Blue GP0 pin 6 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2/BB Blue GP0 pin 5 + + + + +Disabled +APM2 A9 pin +APM1 relay +BB Blue GP0 pin 4 +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +BB Blue GP0 pin 3 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1/BB Blue GP0 pin 6 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2/BB Blue GP0 pin 5 + + + + +Off +On +NoChange + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + + +None +PX4-PWM +AUXPIN + + + +0.001 + + +1 + + +1 + + +0.1 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +None +PX4-PWM +AUXPIN + + + +0.001 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + + + +Disabled +AnalogPin +RCChannelPwmValue +ReceiverProtocol + + + + +APM2 A0 +APM2 A1 +APM2 A13 +Pixracer +Pixhawk ADC4 +Pixhawk ADC3 +Pixhawk ADC6 +Pixhawk SBUS +Pixhawk2 ADC + + + +0 5.0 +0.01 +V +volt + + +0 5.0 +0.01 +V +volt + + + + +0 2000 +PWM +PWM in microseconds + + +0 2000 +PWM +PWM in microseconds + + + + + +Disabled +ShowSlips +ShowOverruns + + + + +50Hz +100Hz +200Hz +250Hz +300Hz +400Hz + +True + + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +460800 +500000 +921600 +1500000 + + + + +MAVlink1 +MAVLink2 + +True + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + + + +Disable +Enable + + + +25 400 +Hz +hertz + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + +Disabled +Enabled + + + + +Disabled +TestMotor1 +TestMotor2 +TestMotor3 +TestMotor4 +TestMotor5 +TestMotor6 +TestMotor7 +TestMotor8 + + + +0 300 +s +seconds + + +0 500 +Hz +hertz + + + +Disabled +Enabled + + + + +None +OneShot +OneShot125 +Brushed +DShot150 +DShot300 +DShot600 +DShot1200 + + + + + +25 250 +Hz +hertz + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + + + +Disabled +Enabled + + + +0 100 +% +percent + + +1000 2000 +ms +milliseconds + + +0 1000 +cm/s +centimeters per second + + +0 100 +% +percent + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 50 +1 +Hz +hertz + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 50 +1 +Hz +hertz + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 50 +1 +Hz +hertz + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 50 +1 +Hz +hertz + + + + +0 10 +m +meters + + +0 500 +True + + + + +True + + +True +s +seconds + + +True +s +seconds + + +True +s +seconds + + + + + +Disabled +Enabled +EnableAndLearn + + + +True +True +degC +degrees Celsius + + +True +True +degC +degrees Celsius + + +True +True +degC +degrees Celsius + + +True +True + + + + + +Disable +Enable + + + +1 +m +meters + + + + + +Disabled +EnableVersion1 +EnableVersion2 + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +FlowHold + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +FlowHold + + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest +ModeFlowHold + + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest +ModeFlowHold + + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest +ModeFlowHold + + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest +ModeFlowHold + + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest +ModeFlowHold + + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest +ModeFlowHold + + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest +ModeFlowHold + + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest +ModeFlowHold + + + +0 100 + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest + + + +0:DisarmOnLowThrottle,1:ArmOnHighThrottle,2:UpgradeToLoiter,3:RTLStickCancel + + +0 5 +0.01 + + +0 5 +0.01 + + +0 1 +0.01 + + +0 1 +0.01 + + +0 1 +0.01 + + +0 100 + + + +ConstantThrust +LogReplay1 +LogReplay2 + + + + + + +None +MAV + + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Right +Back +Left +Up +Down + + + + + + +None +Quadrature + + + +1 + + +0.001 + + +0.01 +m +meters + + +0.01 +m +meters + + +0.01 +m +meters + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +None +Quadrature + + + +1 + + +0.001 + + +0.01 +m +meters + + +0.01 +m +meters + + +0.01 +m +meters + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + + + +Disabled +Enabled + + + + +Servo with encoder + + + +0 10 +m/s +meters per second + + +0.01 10.0 + + +0.100 2.000 + + +0.000 2.000 + + +0.000 1.000 + + +0.000 0.400 + + +1.000 100.000 +Hz +hertz + + + + +20 2000 +50 +cm/s +centimeters per second + + +10 1000 +1 +cm +centimeters + + +10 1000 +50 +cm/s +centimeters per second + + +10 500 +10 +cm/s +centimeters per second + + +50 500 +10 +cm/s/s +centimeters per square second + + +50 500 +10 +cm/s/s +centimeters per square second + + + +Disable +Enable + + + + diff --git a/src/FirmwarePlugin/APM/APMParameterFactMetaData.Copter.3.7.xml b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Copter.3.7.xml new file mode 100644 index 0000000..195ecb7 --- /dev/null +++ b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Copter.3.7.xml @@ -0,0 +1,14791 @@ + + + + + + +True + + +1 255 + + + +Mission Planner and DroidPlanner + AP Planner 2 + + + +0 10 +.5 +Hz +hertz + + +0.0 1000.0 +10 +cm +centimeters + + +0 500 +10 + + +0:Feedback from mid stick,1:High throttle cancels landing,2:Disarm on land detection + +None +Feedback from mid stick +High throttle cancels landing +Disarm on land detection + + + +0 30 +1 +s +seconds + + +0:Roll,1:Pitch,2:Yaw + +None +Roll +Pitch +Yaw + + + +200 8000 +1 +cm +centimeters + + +0.5 10.0 + +Disabled +Shallow +Steep + +.1 + + +0 2000 +50 +cm/s +centimeters per second + + +-1 1000 +1 +cm +centimeters + + +0 3000 +10 +cm +centimeters + + +0 60000 +1000 +ms +milliseconds + + +0.01 2.0 +0.01 + + + +Disabled +Enabled always RTL +Enabled Continue with Mission in Auto Mode +Enabled always SmartRTL or RTL +Enabled always SmartRTL or Land + + + +100 900 + + + +Disabled +Enabled + + + + +Disabled +Mode1 +Mode2 +Mode1+2 +Mode3 +Mode1+3 +Mode2+3 +Mode1+2+3 +Mode4 +Mode1+4 +Mode2+4 +Mode1+2+4 +Mode3+4 +Mode1+3+4 +Mode2+3+4 +Mode1+2+3+4 +Mode5 +Mode1+5 +Mode2+5 +Mode1+2+5 +Mode3+5 +Mode1+3+5 +Mode2+3+5 +Mode1+2+3+5 +Mode4+5 +Mode1+4+5 +Mode2+4+5 +Mode1+2+4+5 +Mode3+4+5 +Mode1+3+4+5 +Mode2+3+4+5 +Mode1+2+3+4+5 +Mode6 +Mode1+6 +Mode2+6 +Mode1+2+6 +Mode3+6 +Mode1+3+6 +Mode2+3+6 +Mode1+2+3+6 +Mode4+6 +Mode1+4+6 +Mode2+4+6 +Mode1+2+4+6 +Mode3+4+6 +Mode1+3+4+6 +Mode2+3+4+6 +Mode1+2+3+4+6 +Mode5+6 +Mode1+5+6 +Mode2+5+6 +Mode1+2+5+6 +Mode3+5+6 +Mode1+3+5+6 +Mode2+3+5+6 +Mode1+2+3+5+6 +Mode4+5+6 +Mode1+4+5+6 +Mode2+4+5+6 +Mode1+2+4+5+6 +Mode3+4+5+6 +Mode1+3+4+5+6 +Mode2+3+4+5+6 +Mode1+2+3+4+5+6 + + + + +Never change yaw +Face next waypoint +Face next waypoint except RTL +Face along GPS course + + + +30 200 +10 +cm/s +centimeters per second + + +0 500 +10 +cm/s +centimeters per second + + +50 500 +10 +cm/s +centimeters per second + + +50 500 +10 +cm/s/s +centimeters per square second + + + +Disabled +Enabled always RTL +Enabled Continue with Mission in Auto Mode +Enabled always Land +Enabled always SmartRTL or RTL +Enabled always SmartRTL or Land + + + +925 1100 +1 +PWM +PWM in microseconds + + +0 300 +1 +PWM +PWM in microseconds + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +Smart_RTL +FlowHold +Follow +ZigZag + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +Smart_RTL +FlowHold +Follow +ZigZag + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +Smart_RTL +FlowHold +Follow +ZigZag + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +Smart_RTL +FlowHold +Follow +ZigZag + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +Smart_RTL +FlowHold +Follow +ZigZag + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +Smart_RTL +FlowHold +Follow +ZigZag + + + + +Disabled +Channel5 +Channel6 +Channel7 +Channel8 + + + + + +0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:CTUN,5:NTUN,6:RCIN,7:IMU,8:CMD,9:CURRENT,10:RCOUT,11:OPTFLOW,12:PID,13:COMPASS,14:INAV,15:CAMERA,17:MOTBATT,18:IMU_FAST,19:IMU_RAW + +Default +Default+RCIN +Default+IMU +Default+Motors +NearlyAll-AC315 +NearlyAll +All+FastATT +All+MotBatt +All+FastIMU +All+FastIMU+PID +All+FullIMU +Disabled + + + + +Normal Start-up +Start-up in ESC Calibration mode if throttle high +Start-up in ESC Calibration mode regardless of throttle +Start-up and automatically calibrate ESCs +Disabled + + + + +None +Stab Roll/Pitch kP +Rate Roll/Pitch kP +Rate Roll/Pitch kI +Rate Roll/Pitch kD +Stab Yaw kP +Rate Yaw kP +Rate Yaw kD +Rate Yaw Filter +Motor Yaw Headroom +AltHold kP +Throttle Rate kP +Throttle Accel kP +Throttle Accel kI +Throttle Accel kD +Loiter Pos kP +Velocity XY kP +Velocity XY kI +WP Speed +Acro RollPitch kP +Acro Yaw kP +RC Feel +Heli Ext Gyro +Declination +Circle Rate +RangeFinder Gain +Rate Pitch kP +Rate Pitch kI +Rate Pitch kD +Rate Roll kP +Rate Roll kI +Rate Roll kD +Rate Pitch FF +Rate Roll FF +Rate Yaw FF +Winch + + + +0 32767 + + +0 32767 + + + +Plus +X +V +H +V-Tail +A-Tail +Y6B +Y6F +BetaFlightX +DJIX +ClockwiseX + +True + + +0 127 +s +seconds + + +1000 8000 +cdeg +centidegrees + + +4 12 +deg/s +degrees per second + + +2000 4500 +cdeg +centidegrees + + + +No repositioning +Repositioning + + + + +Land +AltHold +Land even in Stabilize + + + +0.6:Strict, 0.8:Default, 1.0:Relaxed + + + +Disabled +Enabled + + + +50 490 +1 +Hz +hertz + + +1 10 + + +1 10 + + +0 3 +0.1 + + +0 3 +0.1 + + + +Disabled +Leveling +Leveling and Limited + + + +-0.5 1.0 + +Disabled +Very Low +Low +Medium +High +Very High + + + + +Stopped +Running + + + + +Do Not Use in RTL and Land +Use in RTL and Land + + + +0 5 + + + +Auto +Guided +LOITER +RTL +Land +Brake +Throw + + + + +Upward Throw +Drop + + + + +Disabled +Enabled + + + +0:ADSBMavlinkProcessing,1:DevOptionVFR_HUDRelativeAlt + + +-0.5 1.0 + +Disabled +Very Low +Low +Medium +High +Very High + + + +0 1 + + + +NotEnforced +Enforced + + + + +Undefined +Quad +Hexa +Octa +OctaQuad +Y6 +Heli +Tri +SingleCopter +CoaxCopter +BiCopter +Heli_Dual +DodecaHexa +HeliQuad + +True + + +50 500 +10 +cm/s +centimeters per second + + +100 10000 +10 +cm +centimeters + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Object Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Object Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Object Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Object Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Object Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Object Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl + + + + + + +Disabled +Enabled + + + +1 100 + + +0 100000 +m +meters + + +-1 16777215 + + + +NoInfo +Light +Small +Large +HighVortexlarge +Heavy +HighlyManuv +Rotocraft +RESERVED +Glider +LightAir +Parachute +UltraLight +RESERVED +UAV +Space +RESERVED +EmergencySurface +ServiceSurface +PointObstacle + + + + +NO_DATA +L15W23 +L25W28P5 +L25W34 +L35W33 +L35W38 +L45W39P5 +L45W45 +L55W45 +L55W52 +L65W59P5 +L65W67 +L75W72P5 +L75W80 +L85W80 +L85W90 + + + + +NoData +Left2m +Left4m +Left6m +Center +Right2m +Right4m +Right6m + + + + +NO_DATA +AppliedBySensor + + + + +Disabled +Rx-Only +Tx-Only +Rx and Tx Enabled + + + +0 7777 +octal +octal + + +0:UAT_in,1:1090ES_in,2:UAT_out,3:1090ES_out + +Unknown +Rx UAT only +Rx UAT and 1090ES +Rx&Tx UAT and 1090ES + + + +0 32767 +m +meters + + + + + + + + + + + + + + + + + + + + + + +m +meters + + +m +meters + + +mbar +millibar + + + + + + + + + + + + + + +s +seconds + + + + +0.0 1.0 +.01 + + + +Disabled +Enabled + + + +0.1 0.4 +.01 + + +0.1 0.4 +.01 + + +0 127 +1 +m/s +meters per second + + +-0.1745 +0.1745 +0.01 +rad +radians + + +-0.1745 +0.1745 +0.01 +rad +radians + + +-0.1745 +0.1745 +0.01 +rad +radians + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 +Custom + + + +0.001 0.5 +.01 + + +0 10 +1 + + + +Disabled +Enable EKF2 +Enable EKF3 + + + +-180 180 +1 +deg +degrees + + +-180 180 +1 +deg +degrees + + +-180 180 +1 +deg +degrees + + + + + +Disabled +THR_MIN PWM when disarmed +0 PWM when disarmed + + + +0:All,1:Barometer,2:Compass,3:GPS lock,4:INS,5:Parameters,6:RC Channels,7:Board voltage,8:Battery Level,9:Airspeed,10:Logging Available,11:Hardware safety switch,12:GPS Configuration,13:System + +None +All +Barometer +Compass +GPS Lock +INS(INertial Sensors - accels & gyros) +Parameters(unused) +RC Channels +Board voltage +Battery Level +Airspeed +LoggingAvailable +Hardware safety switch +GPS configuration +System + + + +0.25 3.0 +m/s/s +meters per square second + + + +Disabled +ArmingOnly +ArmOrDisarm + + + +0:Land,1:VTOL Land,2:DO_LAND_START,3:Takeoff,4:VTOL Takeoff,5:Rallypoint + + + + +500 18000 +100 +cdeg/s +centidegrees per second + + +0 72000 + +Disabled +VerySlow +Slow +Medium +Fast + +1000 +cdeg/s/s +centidegrees per square second + + + +Disabled +Enabled + + + +0 180000 + +Disabled +VerySlow +Slow +Medium +Fast + +1000 +cdeg/s/s +centidegrees per square second + + +0 180000 + +Disabled +VerySlow +Slow +Medium +Fast + +1000 +cdeg/s/s +centidegrees per square second + + + +Disabled +Enabled + + + +0.0 12.000 + + +0.0 12.000 + + +0.0 6.000 + + +0.5 10.0 + + +0 1080 + +Disabled +Slow +Medium +Fast + +1 +deg/s +degrees per second + + +0 1080 + +Disabled +Slow +Medium +Fast + +1 +deg/s +degrees per second + + +0 1080 + +Disabled +Slow +Medium +Fast + +1 +deg/s +degrees per second + + +0 1 +0.5:Very Soft, 0.2:Soft, 0.15:Medium, 0.1:Crisp, 0.05:Very Crisp +0.01 +s +seconds + + +0.05 0.5 +0.005 + + +0.01 2.0 +0.01 + + +0 1 +0.01 +% +percent + + +0.0 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz +hertz + + +0.05 0.50 +0.005 + + +0.01 2.0 +0.01 + + +0 1 +0.01 +% +percent + + +0.0 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz +hertz + + +0.10 2.50 +0.005 + + +0.010 1.0 +0.01 + + +0 1 +0.01 +% +percent + + +0.000 0.02 +0.001 + + +0 0.5 +0.001 + + +1 10 +1 +Hz +hertz + + +0.1 0.25 + + +0.5 0.9 + + +0.1 0.9 + + +0 1000 +cdeg +centidegrees + + +0.08 0.35 +0.005 + + +0.01 0.6 +0.01 + + +0 1 +0.01 + + +0.001 0.03 +0.001 + + +0 0.5 +0.001 + + +1 20 +1 +Hz +hertz + + +0.08 0.35 +0.005 + + +0.01 0.6 +0.01 + + +0 1 +0.01 + + +0.001 0.03 +0.001 + + +0 0.5 +0.001 + + +1 20 +1 +Hz +hertz + + +0.180 0.60 +0.005 + + +0.01 0.06 +0.01 + + +0 1 +0.01 + + +0.000 0.02 +0.001 + + +0 0.5 +0.001 + + +1 20 +1 +Hz +hertz + + + +Disabled +Enabled + + + + + +0:Roll,1:Pitch,2:Yaw + +All +Roll Only +Pitch Only +Yaw Only +Roll and Pitch +Roll and Yaw +Pitch and Yaw + + + +0.05 0.10 + + +0.001 0.006 + + + + + +Disabled +Enabled + + + + +Remain in AVOID_ADSB +Resume previous flight mode +RTL +Resume if AUTO else Loiter + + + + + +s +seconds + + +s +seconds + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + + + +0:StopAtFence,1:UseProximitySensor,2:StopAtBeaconFence + +None +StopAtFence +UseProximitySensor +StopAtFence and UseProximitySensor +StopAtBeaconFence +All + + + +0 4500 +cdeg +centidegrees + + +1 30 +m +meters + + +1 10 +m +meters + + + +Slide +Stop + + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +None +Pozyx +Marvelmind + + + +-90 90 +0.000001 +deg +degrees + + +-180 180 +0.000001 +deg +degrees + + +0 10000 +1 +m +meters + + +-180 +180 +1 +deg +degrees + + + + + +No PWMs +One PWMs +Two PWMs +Three PWMs +Four PWMs +Five PWMs +Six PWMs +Seven PWMs +Eight PWMs + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled + +True + + + +Disabled +50Hz +75Hz +100Hz +150Hz +200Hz +250Hz +300Hz + +True + + +-32768 32767 + + +0:Ch1,1:Ch2,2:Ch3,3:Ch4,4:Ch5,5:Ch6,6:Ch7,7:Ch8,8:Ch9,9:Ch10,10:Ch11,11:Ch12,12:Ch13,13:Ch14 + +Disabled +Enabled + +True + + +-1 80 +degC +degrees Celsius + + + +AUTO +PX4V1 +Pixhawk +Cube/Pixhawk2 +Pixracer +PixhawkMini +Pixhawk2Slim +VRBrain 5.1 +VRBrain 5.2 +VR Micro Brain 5.1 +VR Micro Brain 5.2 +VRBrain Core 1.0 +VRBrain 5.4 +Intel Aero FC +AUAV2.1 + +True + + + +Disabled +Enabled + +True + + +0:ActiveForSafetyEnable,1:ActiveForSafetyDisable,2:ActiveWhenArmed,3:Force safety on when the aircraft disarms + + +4.0 5.5 +0.1 +V +volt + + +3.3 12.0 +0.1 +V +volt + + +0 32 +1 + + + + + +None +CYRF6936 + + + + +Auto +DSM2 +DSMX + + + +0 4 + + + +NotDisabled +Disabled + + + +0 16 + + +0 16 + + + +Disabled +Enabled + + + +1 8 + + + +Disabled +MinChannel +MidChannel +MaxChannel +MinChannelCW +MidChannelCW +MaxChannelCW + + + + +Mode1 +Mode2 + + + + +Disabled +TestChan1 +TestChan2 +TestChan3 +TestChan4 +TestChan5 +TestChan6 +TestChan7 +TestChan8 + + + +0 16 + + +0 16 + + +1 8 + + +0 40 + + +0 120 + + +0 31 + + + + +0:GPS,1:MAVLINK_SYSTEM_TIME,2:HW + + + + + +Disabled +Enabled + + + + +Disabled +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 + + + + +Disabled +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 + + + + +Disabled +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 + + + + +Disabled +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 + + + +0 3600 + + + + + +Servo +Relay + + + +0 50 +ds +deciseconds + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +0 1000 +m +meters + + + +Low +High + + + +0 10000 +ms +milliseconds + + +0 180 +deg +degrees + + + +Disabled +AUX1 +AUX2 +AUX3 +AUX4 +AUX5 +AUX6 + +True + + + +TriggerLow +TriggerHigh + + + + +Always +Only when in AUTO + + + + +Default +BMMCC + + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + +0 32767 + + + + + +Disabled +Enabled + + + + +First Relay +Second Relay +Third Relay +Fourth Relay +Servo + + + +1000 2000 +1 +PWM +PWM in microseconds + + +1000 2000 +1 +PWM +PWM in microseconds + + +0 32000 +1 +m +meters + + +0 5000 +1 +ms +milliseconds + + + + +0 10000 +100 +cm +centimeters + + +-90 90 +1 +deg/s +degrees per second + + + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-3.142 3.142 +0.01 +rad +radians + + + +Disabled +Internal-Learning +EKF-Learning +InFlight-Learning + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Use Throttle +Use Current + + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + + +FirstCompass +SecondCompass +ThirdCompass + + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +True + + +True + + +True + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +4 32 + +Very Strict +Strict +Default +Relaxed + +0.1 + + +500 3000 +1 + + +0:HMC5883,1:LSM303D,2:AK8963,3:BMM150,4:LSM9DS1,5:LIS3MDL,6:AK09916,7:IST8310,8:ICM20948,9:MMC3416,11:UAVCAN,12:QMC5883,14:MAG3110,15:IST8308 + + +0 100 +1 +% +percent + + + +Disabled +CheckOnly +CheckAndFix + + + + + + + + + + + + +Disabled +Enabled + + + +0 2 +0.01 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.000001 0.001 +Hz +hertz + + +0.00001 0.005 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +2.0 6.0 +0.5 +m/s +meters per second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + +0 127 +1 +ms +milliseconds +True + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + +True + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.00001 0.005 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +2.0 6.0 +0.5 +m/s +meters per second + + +0.5 2.5 +0.1 +m/s/s +meters per square second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + +0.05 0.5 +0.05 +m/s +meters per second + + +0.5 5.0 +0.1 +m/s +meters per second + + +0.01 1.0 +0.1 +m/s +meters per second + + + + + +Disabled +Enabled + + + +0:Altitude,1:Circle,2:Polygon + +None +Altitude +Circle +Altitude and Circle +Polygon +Altitude and Polygon +Circle and Polygon +All + + + + +Report Only +RTL or Land +Always Land +SmartRTL or RTL or Land +Brake or Land + + + +10 1000 +1 +m +meters + + +30 10000 +m +meters + + +1 10 +m +meters + + +1 20 + + +-100 100 +1 +m +meters + + + + +0.1 6.0 +0.1 + + +0.02 1.00 +0.01 + + +0 4500 +10 +cdeg +centidegrees + + +0 100 +Hz +hertz + + +0.1 2.5 + + +1 100 +Hz +hertz + + +0 255 + + +1 30 +deg/s +degrees per second + + + + + +Disabled +Enabled + + + +-200 +200 +1 + + +-200 +200 +1 + + +-18000 +18000 +1 + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +0 127 + + + + + +Disabled +Enabled + + + +0 255 + + +1 1000 +m +meters + + + +North-East-Down +Relative to lead vehicle heading + + + +-100 100 +1 +m +meters + + +-100 100 +1 +m +meters + + +-100 100 +1 +m +meters + + + +None +Face Lead Vehicle +Same as Lead vehicle +Direction of Flight + + + +0.01 1.00 +0.01 + + + +absolute + relative + + + + + +True +True +1 +Pa +pascal + + +True +1 +degC +degrees Celsius + + +0.1 +m +meters + + + +FirstBaro +2ndBaro +3rdBaro + + + + +Disabled +Bus0 +Bus1 + + + +1.0:Freshwater,1.024:Saltwater + + +True +True +1 +Pa +pascal + + +True +True +1 +Pa +pascal + + +0 100 +1 +% +percent + + +0:BMP085,1:BMP280,2:MS5611,3:MS5607,4:MS5637,5:FBM320,6:DPS280,7:LPS25H,8:Keller + +BMP085 +BMP280 +MS5611 +MS5607 +MS5637 +FBM320 +DPS280 +LPS25H +Keller + + + + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA + +True + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA + +True + + + +Portable +Stationary +Pedestrian +Automotive +Sea +Airborne1G +Airborne2G +Airborne4G + + + + +Disabled +UseBest +Blend +UseSecond + + + + +Any +FloatRTK +IntegerRTK + +True + + + +Disabled +Enabled +NoChange + + + +-100 90 +deg +degrees + + + +send to first GPS +send to 2nd GPS +send to all + + + + +None (0x0000) +All (0xFFFF) +External only (0xFF00) + + + + +Ignore +Always log +Stop logging when disarmed (SBF only) +Only log every five samples (uBlox only) + +True + + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + + + + +Do not save config +Save config +Save only when needed + + + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + + + + +Disables automatic configuration +Enable automatic configuration + + + +50 200 + +10Hz +8Hz +5Hz + +ms +milliseconds + + +50 200 + +10Hz +8Hz +5Hz + +ms +milliseconds + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +0 250 +ms +milliseconds +True + + +0 250 +ms +milliseconds +True + + +0:Horiz Pos,1:Vert Pos,2:Speed + + +5.0 30.0 +s +seconds + + + + + +Disabled +Enabled + + + + +None +Servo +EPM + + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +0 255 +s +seconds + + +0 255 + + + + + +Servo only +Servo with ExtGyro +DirectDrive VarPitch +DirectDrive FixedPitch + + + +0 1000 +1 +PWM +PWM in microseconds + + +-10 10 +0.1 + + + +NoFlybar +Flybar + + + +0 1000 +1 +PWM +PWM in microseconds + + +0 1000 +1 +PWM +PWM in microseconds + + + +Longitudinal +Transverse + + + +0 1 + + +-10 10 +0.1 + + +-10 10 +0.1 + + +1000 2000 +1 +PWM +PWM in microseconds + + +1000 2000 +1 +PWM +PWM in microseconds + + +1000 2000 +1 +PWM +PWM in microseconds + + +1000 2000 +1 +PWM +PWM in microseconds + + +1000 2000 +1 +PWM +PWM in microseconds + + +1000 2000 +1 +PWM +PWM in microseconds + + + +Disabled +Passthrough +Max collective +Mid collective +Min collective + + + +0 1000 +10 +PWM +PWM in microseconds + + + +Ch8 Input +SetPoint +Throttle Curve + + + +0 500 +1 +PWM +PWM in microseconds + + +0 60 +s +seconds + + +0 60 +s +seconds + + +0 1000 +10 + + +0 500 +10 + + +0 18000 +100 +cdeg +centidegrees + + +0 10 +1 + + +0 500 +10 + + +0 1000 +10 + + +0 1000 +10 + + +0 1000 +10 + + +0 1000 +10 + + +0 1000 +10 + + + + + +H3 Generic +H1 non-CPPM +H3_140 +H3_120 +H4_90 +H4_45 + + + + +Normal +Reversed + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +-180 180 +deg +degrees + + +-180 180 +deg +degrees + + +-180 180 +deg +degrees + + +-30 30 +1 +deg +degrees + + + + + +H3 Generic +H1 non-CPPM +H3_140 +H3_120 +H4_90 +H4_45 + + + + +Normal +Reversed + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +-180 180 +deg +degrees + + +-180 180 +deg +degrees + + +-180 180 +deg +degrees + + +-30 30 +1 +deg +degrees + + + + + +H3 Generic +H1 non-CPPM +H3_140 +H3_120 +H4_90 +H4_45 + + + + +Normal +Reversed + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +-180 180 +deg +degrees + + +-180 180 +deg +degrees + + +-180 180 +deg +degrees + + +-30 30 +1 +deg +degrees + + + + +0 500 +1 +d% +decipercent + + +0 500 +1 +d% +decipercent + + +500 1000 +1 +d% +decipercent + + +500 1000 +1 +d% +decipercent + + + +Disabled +Very Low +Low +Medium +High +Very High + + + + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +0 127 +Hz +hertz + + +0 127 +Hz +hertz + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +0.05 50 + + + +Never +Start-up only + + + + +Don't adjust the trims +Assume first orientation was level +Assume ACC_BODYFIX is perfectly aligned to the vehicle + + + + +IMU 1 +IMU 2 +IMU 3 + + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +True + + +True + + +True + + +True + + +True + + +True + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU + +FirstIMUOnly +FirstAndSecondIMU + + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU + +FirstIMUOnly +FirstAndSecondIMU +FirstSecondAndThirdIMU +AllIMUs + + + + + +32 + + +0:IMU1,1:IMU2,2:IMU3 + +None +First IMU +All + + + +0:Sensor-Rate Logging (sample at full sensor rate seen by AP) + + +10 +ms +milliseconds + + +1 + + + + + +Disabled +Enabled + + + +10 200 +Hz +hertz + + +5 50 +Hz +hertz + + +5 30 +dB +decibel + + + + + +WaitForPilotInput +Retract +Deploy + + + + +Disabled +AUX1 +AUX2 +AUX3 +AUX4 +AUX5 +AUX6 + +True + + + +Low +High + + + + +Disabled +AUX1 +AUX2 +AUX3 +AUX4 +AUX5 +AUX6 + +True + + + +Low +High + + + +0 1000 +1 +m +meters + + +0 1000 +1 +m +meters + + + + +0:File,1:MAVLink,2:Block + +None +File +MAVLink +File and MAVLink +Block +Block and MAVLink + + + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +kB +kilobytes + + + + +0 45 +1 +deg +degrees + + +20 2000 +50 +cm/s +centimeters per second + + +100 981 +1 +cm/s/s +centimeters per square second + + +25 250 +1 +cm/s/s +centimeters per square second + + +500 5000 +1 +cm/s/s/s +centimeters per cubic second + + +0 2 +0.1 +s +seconds + + + + +0 32766 +1 + + + +Resume Mission +Restart Mission + + + +0:Clear Mission on reboot + + + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + +0 100 +1 + + +0.0 0.2 +.005 +s +seconds + + +0.0 0.2 +.005 +s +seconds + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + +True + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + +0.0 0.2 +.005 +s +seconds + + +0.0 0.2 +.005 +s +seconds + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + + + + + +0 500 +PWM +PWM in microseconds + + +0.25 0.8 + + +0.9:Low, 0.95:Default, 1.0:High + + +6 35 +V +volt + + +6 35 +V +volt + + +0 200 +A +ampere + + + +Normal +OneShot +OneShot125 +Brushed +DShot150 +DShot300 +DShot600 +DShot1200 + +True + + +0 2000 +PWM +PWM in microseconds + + +0 2000 +PWM +PWM in microseconds + + +0.0:Low, 0.15:Default, 0.3:High + + +0.0:Low, 0.1:Default, 0.2:High + + +0 10 +s +seconds + + +0.2 0.8 + + + +Disabled +Learn +LearnAndSave + + + + +PWM enabled while disarmed +PWM disabled while disarmed + + + +5 80 +1 +deg +degrees + + +0 2 +0.1 +s +seconds + + +0 5 +0.1 + + + +First battery +Second battery + + + +0 .5 +0.001 +s +seconds + + +0 .5 +0.001 +s +seconds + + + + + +Off +Low +Medium +High + + + + +Disable +Enable + + + + +Standard +MAVLink +OutbackChallenge + + + + +Disable +ssd1306 +sh1106 + + + + +Disabled +Aircraft +Rover + + + + +Disabled + + + +0:Build in LED, 1:Internal ToshibaLED, 2:External ToshibaLED, 3:External PCA9685, 4:Oreo LED, 5:UAVCAN, 6:NCP5623 External, 7:NCP5623 Internal + + + +LowIsOn +HighIsOn + + + + + + +None +MAX7456 + +True + + + +Disable +Chan5 +Chan6 +Chan7 +Chan8 +Chan9 +Chan10 +Chan11 +Chan12 +Chan13 +Chan14 +Chan15 +Chan16 + + + +0:UseDecimalPack, 1:InvertedWindPointer, 2:InvertedAHRoll + + +True + + +0 31 +True + + +0 63 +True + + +0 99 + + +1 30 + + +0 100 + + + +Metric +Imperial +SI +Aviation + + + +1 20 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + + +None +CompanionComputer +IRLock +SITL_Gazebo +SITL + + + +0 360 +1 +cdeg +centidegrees + + +-20 20 +1 +cm +centimeters + + +-20 20 +1 +cm +centimeters + + + +RawSensor +KalmanFilter + + + +0.5 5 + + +m +meters + + +m +meters + + +m +meters + + + +DefaultBus +InternalI2C +ExternalI2C + + + +0.02 0.250 +1 +s +seconds +True + + + + + +None +LightWareSF40C +MAVLink +TeraRangerTower +RangeFinder +RPLidarA2 +TeraRangerTowerEvo +SITL +MorseSITL + +True + + + +Default +Upside Down + + + +-180 180 +deg +degrees + + +0 360 +deg +degrees + + +0 45 +deg +degrees + + +0 360 +deg +degrees + + +0 45 +deg +degrees + + +0 360 +deg +degrees + + +0 45 +deg +degrees + + +0 360 +deg +degrees + + +0 45 +deg +degrees + + +0 360 +deg +degrees + + +0 45 +deg +degrees + + +0 360 +deg +degrees + + +0 45 +deg +degrees + + + +None +LightWareSF40C +MAVLink +TeraRangerTower +RangeFinder +RPLidarA2 +TeraRangerTowerEvo + +True + + + +Default +Upside Down + + + +-180 180 +deg +degrees + + + + +0.5 5 +0.1 +Hz +hertz + + +1.000 3.000 + + +1.000 8.000 + + +0.500 1.500 +0.05 + + +0.000 3.000 + + +0 1000 +d% +decipercent + + +0.000 0.400 + + +1.000 100.000 +Hz +hertz + + +0.500 2.000 + + +0.1 6.0 +0.1 + + +0.02 1.00 +0.01 + + +0.00 1.00 +0.001 + + +0 4500 +10 +cm/s/s +centimeters per square second + + +0 100 +Hz +hertz + + +0 100 +Hz +hertz + + +0 45 +1 +deg +degrees + + + + + + +0.1 +km +kilometers + + + +DoNotIncludeHome +IncludeHome + + + + + +0.0 120.0 +s +seconds + + +0:Ignore RC Receiver, 1:Ignore MAVLink Overrides, 2:Ignore Receiver Failsafe + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable + Relay5 + Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable + Relay5 + Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable + Relay5 + Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable + Relay5 + Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable + Relay5 + Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable + Relay5 + Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable + Relay5 + Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable + Relay5 + Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable + Relay5 + Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable + Relay5 + Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable + Relay5 + Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable + Relay5 + Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable + Relay5 + Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable + Relay5 + Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable + Relay5 + Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable + Relay5 + Relay6 + + + + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Off +On +NoChange + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +PX4-PWM +AUXPIN + + + +0.001 + + +1 + + +1 + + +0.1 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +None +PX4-PWM +AUXPIN + + + +0.001 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + + + +Disabled +AnalogPin +RCChannelPwmValue +ReceiverProtocol +PWMInputPin + + + + +V5 Nano +Pixracer +Pixhawk ADC4 +Pixhawk ADC3 +Pixhawk ADC6 +Pixhawk2 ADC +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 +Pixhawk SBUS + + + +0 5.0 +0.01 +V +volt + + +0 5.0 +0.01 +V +volt + + +0 16 + + +0 2000 +PWM +PWM in microseconds + + +0 2000 +PWM +PWM in microseconds + + + + + +Disabled +ShowSlips +ShowOverruns + + + + +50Hz +100Hz +200Hz +250Hz +300Hz +400Hz + +True + + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +460800 +500000 +921600 +1500000 + + + + +MAVlink1 +MAVLink2 + +True + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + +0 120 +s +seconds + + + + + +Disable +Enable + + + +25 400 +Hz +hertz + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + +Disabled +Enabled + + + + +Disabled +TestMotor1 +TestMotor2 +TestMotor3 +TestMotor4 +TestMotor5 +TestMotor6 +TestMotor7 +TestMotor8 + + + +0 300 +s +seconds + + +0 500 +Hz +hertz + + + +Disabled +Enabled + + + + +None +OneShot +OneShot125 +Brushed +DShot150 +DShot300 +DShot600 +DShot1200 + + + + +Console +Telem1 +Telem2 +Telem3 +Telem4 +Telem5 + + + +1 127 + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + + +0 4095 + + +0 4095 + + + + +25 250 +Hz +hertz + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + + + +Disabled +Enabled + + + +0 100 +% +percent + + +1000 2000 +ms +milliseconds + + +0 1000 +cm/s +centimeters per second + + +0 100 +% +percent + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 50 +1 +Hz +hertz + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 50 +1 +Hz +hertz + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 50 +1 +Hz +hertz + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 50 +1 +Hz +hertz + + + + +0 10 +m +meters + + +0 500 +True + + + + +True + + +True +s +seconds + + +True +s +seconds + + +True +s +seconds + + + + + +Disabled +Enabled +EnableAndLearn + + + +True +True +degC +degrees Celsius + + +True +True +degC +degrees Celsius + + +True +True + + + + + +Disable +Enable + + + +1 +m +meters + + + + + +Disabled +EnableVersion1 +EnableVersion2 + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +FlowHold + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +FlowHold + + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest +ModeFlowHold + + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest +ModeFlowHold + + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest +ModeFlowHold + + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest +ModeFlowHold + + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest +ModeFlowHold + + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest +ModeFlowHold + + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest +ModeFlowHold + + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest +ModeFlowHold + + + +0 100 + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest + + + +0:DisarmOnLowThrottle,1:ArmOnHighThrottle,2:UpgradeToLoiter,3:RTLStickCancel + + +0 5 +0.01 + + +0 5 +0.01 + + +0 1 +0.01 + + +0 1 +0.01 + + +0 1 +0.01 + + +0 100 + + + +ConstantThrust +LogReplay1 +LogReplay2 + + + + + + +None +MAV + + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Right +Back +Left +Up +Down + + + + + + +None +Quadrature + + + +1 + + +0.001 +m +meters + + +0.01 +m +meters + + +0.01 +m +meters + + +0.01 +m +meters + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +None +Quadrature + + + +1 + + +0.001 +m +meters + + +0.01 +m +meters + + +0.01 +m +meters + + +0.01 +m +meters + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + + + +Disabled +Enabled + + + + +Servo with encoder + + + +0 10 +m/s +meters per second + + +0.01 10.0 + + +0.100 2.000 + + +0.000 2.000 + + +0.000 1.000 + + +0.000 0.400 + + +1.000 100.000 +Hz +hertz + + + + +20 2000 +50 +cm/s +centimeters per second + + +10 1000 +1 +cm +centimeters + + +10 1000 +50 +cm/s +centimeters per second + + +10 500 +10 +cm/s +centimeters per second + + +50 500 +10 +cm/s/s +centimeters per square second + + +50 500 +10 +cm/s/s +centimeters per square second + + + +Disable +Enable + + + + diff --git a/src/FirmwarePlugin/APM/APMParameterFactMetaData.Copter.4.0.xml b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Copter.4.0.xml new file mode 100644 index 0000000..00e25d5 --- /dev/null +++ b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Copter.4.0.xml @@ -0,0 +1,16158 @@ + + + + + + +True + + +1 255 + + +1 255 + + +Hz +hertz +0 10 +.5 + + +cm +centimeters +0.0 1000.0 +10 + + + +None +Feedback from mid stick +High throttle cancels landing +Disarm on land detection + +0:Feedback from mid stick,1:High throttle cancels landing,2:Disarm on land detection + + +s +seconds +0 30 +1 + + + +None +Roll +Pitch +Yaw +AccelZ + +0:Roll,1:Pitch,2:Yaw,3:AccelZ + + +cm +centimeters +200 8000 +1 + + +0.5 10.0 +.1 + +Disabled +Shallow +Steep + + + +cm/s +centimeters per second +0 2000 +50 + + +cm +centimeters +-1 1000 +1 + + +cm +centimeters +0 3000 +10 + + +ms +milliseconds +0 60000 +1000 + + +0.01 2.0 +0.01 + + + +Disabled/NoAction +RTL +RTL or Continue with Mission in Auto Mode (Deprecated in 4.0+-see FS_OPTIONS) +SmartRTL or RTL +SmartRTL or Land +Land (4.0+ Only) + + + +100 900 + + + +Disabled +Mode1 +Mode2 +Mode1+2 +Mode3 +Mode1+3 +Mode2+3 +Mode1+2+3 +Mode4 +Mode1+4 +Mode2+4 +Mode1+2+4 +Mode3+4 +Mode1+3+4 +Mode2+3+4 +Mode1+2+3+4 +Mode5 +Mode1+5 +Mode2+5 +Mode1+2+5 +Mode3+5 +Mode1+3+5 +Mode2+3+5 +Mode1+2+3+5 +Mode4+5 +Mode1+4+5 +Mode2+4+5 +Mode1+2+4+5 +Mode3+4+5 +Mode1+3+4+5 +Mode2+3+4+5 +Mode1+2+3+4+5 +Mode6 +Mode1+6 +Mode2+6 +Mode1+2+6 +Mode3+6 +Mode1+3+6 +Mode2+3+6 +Mode1+2+3+6 +Mode4+6 +Mode1+4+6 +Mode2+4+6 +Mode1+2+4+6 +Mode3+4+6 +Mode1+3+4+6 +Mode2+3+4+6 +Mode1+2+3+4+6 +Mode5+6 +Mode1+5+6 +Mode2+5+6 +Mode1+2+5+6 +Mode3+5+6 +Mode1+3+5+6 +Mode2+3+5+6 +Mode1+2+3+5+6 +Mode4+5+6 +Mode1+4+5+6 +Mode2+4+5+6 +Mode1+2+4+5+6 +Mode3+4+5+6 +Mode1+3+4+5+6 +Mode2+3+4+5+6 +Mode1+2+3+4+5+6 + + + + +Never change yaw +Face next waypoint +Face next waypoint except RTL +Face along GPS course + + + +cm/s +centimeters per second +30 200 +10 + + +cm/s +centimeters per second +0 500 +10 + + +cm/s +centimeters per second +50 500 +10 + + +cm/s/s +centimeters per square second +50 500 +10 + + + +Disabled +Enabled always RTL +Enabled Continue with Mission in Auto Mode (Deprecated in 4.0+) +Enabled always Land +Enabled always SmartRTL or RTL +Enabled always SmartRTL or Land + + + +910 1100 +PWM +PWM in microseconds +1 + + +0 300 +PWM +PWM in microseconds +1 + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +Smart_RTL +FlowHold +Follow +ZigZag +SystemID +Heli_Autorotate + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +Smart_RTL +FlowHold +Follow +ZigZag +SystemID +Heli_Autorotate + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +Smart_RTL +FlowHold +Follow +ZigZag +SystemID +Heli_Autorotate + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +Smart_RTL +FlowHold +Follow +ZigZag +SystemID +Heli_Autorotate + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +Smart_RTL +FlowHold +Follow +ZigZag +SystemID +Heli_Autorotate + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +Smart_RTL +FlowHold +Follow +ZigZag +SystemID +Heli_Autorotate + + + + +Disabled +Channel5 +Channel6 +Channel7 +Channel8 + + + + + + +Default +Default+RCIN +Default+IMU +Default+Motors +NearlyAll-AC315 +NearlyAll +All+FastATT +All+MotBatt +All+FastIMU +All+FastIMU+PID +All+FullIMU +Disabled + +0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:CTUN,5:NTUN,6:RCIN,7:IMU,8:CMD,9:CURRENT,10:RCOUT,11:OPTFLOW,12:PID,13:COMPASS,14:INAV,15:CAMERA,17:MOTBATT,18:IMU_FAST,19:IMU_RAW + + + +Normal Start-up +Start-up in ESC Calibration mode if throttle high +Start-up in ESC Calibration mode regardless of throttle +Start-up and automatically calibrate ESCs +Disabled + + + + +None +Stab Roll/Pitch kP +Rate Roll/Pitch kP +Rate Roll/Pitch kI +Rate Roll/Pitch kD +Stab Yaw kP +Rate Yaw kP +Rate Yaw kD +Rate Yaw Filter +Motor Yaw Headroom +AltHold kP +Throttle Rate kP +Throttle Accel kP +Throttle Accel kI +Throttle Accel kD +Loiter Pos kP +Velocity XY kP +Velocity XY kI +WP Speed +Acro RollPitch kP +Acro Yaw kP +RC Feel +Heli Ext Gyro +Declination +Circle Rate +RangeFinder Gain +Rate Pitch kP +Rate Pitch kI +Rate Pitch kD +Rate Roll kP +Rate Roll kI +Rate Roll kD +Rate Pitch FF +Rate Roll FF +Rate Yaw FF +Winch +SysID Magnitude + + + + +Plus +X +V +H +V-Tail +A-Tail +Y6B +Y6F +BetaFlightX +DJIX +ClockwiseX + I + BetaFlightXReversed + +True + + +s +seconds +0 127 + + +cdeg +centidegrees +1000 8000 + + +deg/s +degrees per second +4 12 + + +cdeg +centidegrees +2000 4500 + + + +No repositioning +Repositioning + + + + +Land +AltHold +Land even in Stabilize + + + +0.6:Strict, 0.8:Default, 1.0:Relaxed + + + +Disabled +Enabled + + + +Hz +hertz +50 490 +1 + + +1 10 + + +1 10 + + +0 3 +0.1 + + +0 3 +0.1 + + + +Disabled +Leveling +Leveling and Limited + + + + +Disabled +Very Low +Low +Medium +High +Very High + +-0.5 1.0 + + + +Stopped +Running + + + + +Do Not Use in RTL and Land +Use in RTL and Land + + + +0 5 + + + +Auto +Guided +LOITER +RTL +Land +Brake +Throw + + + + +Upward Throw +Drop + + + + +Disabled +Enabled + + + +0:ADSBMavlinkProcessing,1:DevOptionVFR_HUDRelativeAlt + + + +Disabled +Very Low +Low +Medium +High +Very High + +-0.5 1.0 + + +0 1 + + + +NotEnforced +Enforced + + + + +Undefined +Quad +Hexa +Octa +OctaQuad +Y6 +Heli +Tri +SingleCopter +CoaxCopter +BiCopter +Heli_Dual +DodecaHexa +HeliQuad + +True + + +cm/s +centimeters per second +50 500 +10 + + +cm +centimeters +100 10000 +10 + + + + + + + +Disabled +Enabled + + + + +Disabled +Continue if in Auto on RC failsafe only +Continue if in Auto on GCS failsafe only +Continue if in Auto on RC and/or GCS failsafe +Continue if in Guided on RC failsafe only +Continue if landing on any failsafe +Continue if in pilot controlled modes on GCS failsafe +Continue if in Auto on RC and/or GCS failsafe and continue if in pilot controlled modes on GCS failsafe + +0:Continue if in Auto on RC failsafe, 1:Continue if in Auto on GCS failsafe, 2:Continue if in Guided on RC failsafe, 3:Continue if landing on any failsafe, 4:Continue if in pilot controlled modes on GCS failsafe + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Object Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Object Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Object Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Object Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Object Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Object Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl + + + +0 32767 + + +0 32767 + + + + + +Disabled +Enabled + + + +1 100 + + +0 100000 +m +meters + + +-1 16777215 + + + +NoInfo +Light +Small +Large +HighVortexlarge +Heavy +HighlyManuv +Rotocraft +RESERVED +Glider +LightAir +Parachute +UltraLight +RESERVED +UAV +Space +RESERVED +EmergencySurface +ServiceSurface +PointObstacle + + + + +NO_DATA +L15W23 +L25W28P5 +L25W34 +L35W33 +L35W38 +L45W39P5 +L45W45 +L55W45 +L55W52 +L65W59P5 +L65W67 +L75W72P5 +L75W80 +L85W80 +L85W90 + + + + +NoData +Left2m +Left4m +Left6m +Center +Right2m +Right4m +Right6m + + + + +NO_DATA +AppliedBySensor + + + + +Disabled +Rx-Only +Tx-Only +Rx and Tx Enabled + + + +0 7777 +octal +octal + + + +Unknown +Rx UAT only +Rx UAT and 1090ES +Rx&Tx UAT and 1090ES + +0:UAT_in,1:1090ES_in,2:UAT_out,3:1090ES_out + + +0 32767 +m +meters + + + + + +no logging +log only special ID +log all + + + + + + + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + + + + + + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + +m +meters + + +m +meters + + +mbar +millibar + + + + + + + + + + + + + + +s +seconds + + +km +kilometers + + + + +0.0 1.0 +.01 + + + +Disabled +Enabled + + + +0.1 0.4 +.01 + + +0.1 0.4 +.01 + + +0 127 +m/s +meters per second +1 + + +rad +radians +-0.1745 +0.1745 +0.01 + + +rad +radians +-0.1745 +0.1745 +0.01 + + +rad +radians +-0.1745 +0.1745 +0.01 + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 +Custom + + + +0.001 0.5 +.01 + + +0 10 +1 + + + +Disabled +Enable EKF2 +Enable EKF3 + + + +-180 180 +deg +degrees +1 + + +-180 180 +deg +degrees +1 + + +-180 180 +deg +degrees +1 + + + + + +Disabled +THR_MIN PWM when disarmed +0 PWM when disarmed + + + +m/s/s +meters per square second +0.25 3.0 + + + +Disabled +ArmingOnly +ArmOrDisarm + + + +0:Land,1:VTOL Land,2:DO_LAND_START,3:Takeoff,4:VTOL Takeoff,5:Rallypoint + + + +None +All +Barometer +Compass +GPS Lock +INS(INertial Sensors - accels & gyros) +Parameters(unused) +RC Channels +Board voltage +Battery Level +Airspeed +LoggingAvailable +Hardware safety switch +GPS configuration +System +Mission +RangeFinder + +0:All,1:Barometer,2:Compass,3:GPS lock,4:INS,5:Parameters,6:RC Channels,7:Board voltage,8:Battery Level,9:Airspeed,10:Logging Available,11:Hardware safety switch,12:GPS Configuration,13:System,14:Mission,15:Rangefinder + + + + + +Disabled +Enabled + + + +0.3 1 +0.01 + + +RPM +Revolutions Per Minute +1000 2800 +1 + + +cm/s +centimeters per second +800 2000 +50 + + +Hz +hertz +0.2 0.5 +0.01 + + +Hz +hertz +0.03 0.15 +0.01 + + +cm/s/s +centimeters per square second +30 60 +10 + + +s +seconds +0.5 4 +0.1 + + +s +seconds +0.5 3 +0.1 + + +0.1 6.0 +0.1 + + +0 1 +0.01 + + + + +cdeg/s +centidegrees per second +500 18000 +100 + + +cdeg/s/s +centidegrees per square second +0 72000 + +Disabled +VerySlow +Slow +Medium +Fast + +1000 + + + +Disabled +Enabled + + + +cdeg/s/s +centidegrees per square second +0 180000 +1000 + +Disabled +VerySlow +Slow +Medium +Fast + + + +cdeg/s/s +centidegrees per square second +0 180000 +1000 + +Disabled +VerySlow +Slow +Medium +Fast + + + + +Disabled +Enabled + + + +0.0 12.000 + + +0.0 12.000 + + +0.0 6.000 + + +0.5 10.0 + + +deg/s +degrees per second +0 1080 +1 + +Disabled +Slow +Medium +Fast + + + +deg/s +degrees per second +0 1080 +1 + +Disabled +Slow +Medium +Fast + + + +deg/s +degrees per second +0 1080 +1 + +Disabled +Slow +Medium +Fast + + + +s +seconds +0 1 +0.01 +0.5:Very Soft, 0.2:Soft, 0.15:Medium, 0.1:Crisp, 0.05:Very Crisp + + +0.01 0.5 +0.005 + + +0.01 2.0 +0.01 + + +0 1 +0.01 +% +percent + + +0.0 0.05 +0.001 + + +0 0.5 +0.001 + + +5 100 +1 +Hz +hertz + + +0 100 +1 +Hz +hertz + + +5 100 +1 +Hz +hertz + + +0.01 0.50 +0.005 + + +0.01 2.0 +0.01 + + +0 1 +0.01 +% +percent + + +0.0 0.05 +0.001 + + +0 0.5 +0.001 + + +5 100 +1 +Hz +hertz + + +0 100 +1 +Hz +hertz + + +5 100 +1 +Hz +hertz + + +0.10 2.50 +0.005 + + +0.010 1.0 +0.01 + + +0 1 +0.01 +% +percent + + +0.000 0.02 +0.001 + + +0 0.5 +0.001 + + +1 50 +1 +Hz +hertz + + +0 20 +1 +Hz +hertz + + +5 50 +1 +Hz +hertz + + +0.1 0.25 + + +0.5 0.9 + + +0.1 0.9 + + +1 100 +1 +Hz +hertz + + +1 100 +1 +Hz +hertz + + +1 10 +1 +Hz +hertz + + +cdeg +centidegrees +0 1000 + + +0.08 0.35 +0.005 + + +0.01 0.6 +0.01 + + +0 1 +0.01 + + +0 1 + + +0.001 0.03 +0.001 + + +0 0.5 +0.001 + + +5 50 +1 +Hz +hertz + + +5 50 +1 +Hz +hertz + + +0 50 +1 +Hz +hertz + + +0.08 0.35 +0.005 + + +0.01 0.6 +0.01 + + +0 1 +0.01 + + +0 1 + + +0.001 0.03 +0.001 + + +0 0.5 +0.001 + + +5 50 +1 +Hz +hertz + + +5 50 +1 +Hz +hertz + + +0 50 +1 +Hz +hertz + + +0.180 0.60 +0.005 + + +0.01 0.06 +0.01 + + +0 1 +0.01 + + +0 1 + + +0.000 0.02 +0.001 + + +0 0.5 +0.001 + + +5 50 +1 +Hz +hertz + + +5 50 +1 +Hz +hertz + + +0 50 +1 +Hz +hertz + + + +Disabled +Enabled + + + + + + +All +Roll Only +Pitch Only +Yaw Only +Roll and Pitch +Roll and Yaw +Pitch and Yaw + +0:Roll,1:Pitch,2:Yaw + + +0.05 0.10 + + +0.001 0.006 + + + + + +Disabled +Enabled + + + + +Remain in AVOID_ADSB +Resume previous flight mode +RTL +Resume if AUTO else Loiter + + + + + +s +seconds + + +s +seconds + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + + + + +None +UseFence +UseProximitySensor +UseFence and UseProximitySensor +UseBeaconFence +All + +0:UseFence,1:UseProximitySensor,2:UseBeaconFence + + +cdeg +centidegrees +0 4500 + + +m +meters +1 30 + + +m +meters +1 10 + + + +Slide +Stop + + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + + +None +Land +RTL +SmartRTL or RTL +SmartRTL or Land +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + + + + +None +Pozyx +Marvelmind +SITL + + + +deg +degrees +0.000001 +-90 90 + + +deg +degrees +0.000001 +-180 180 + + +m +meters +1 +0 10000 + + +deg +degrees +1 +-180 +180 + + + + + +No PWMs +One PWMs +Two PWMs +Three PWMs +Four PWMs +Five PWMs +Six PWMs +Seven PWMs +Eight PWMs + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled + +True + + + +Disabled +50Hz +75Hz +100Hz +150Hz +200Hz +250Hz +300Hz + +True + + +-32768 32767 + + + +Disabled +Enabled + +0:Ch1,1:Ch2,2:Ch3,3:Ch4,4:Ch5,5:Ch6,6:Ch7,7:Ch8,8:Ch9,9:Ch10,10:Ch11,11:Ch12,12:Ch13,13:Ch14 +True + + +-1 80 +degC +degrees Celsius + + + +AUTO +PX4V1 +Pixhawk +Cube/Pixhawk2 +Pixracer +PixhawkMini +Pixhawk2Slim +VRBrain 5.1 +VRBrain 5.2 +VR Micro Brain 5.1 +VR Micro Brain 5.2 +VRBrain Core 1.0 +VRBrain 5.4 +Intel Aero FC +AUAV2.1 + +True + + + +Disabled +Enabled + +True + + +0:ActiveForSafetyEnable,1:ActiveForSafetyDisable,2:ActiveWhenArmed,3:Force safety on when the aircraft disarms + + +V +volt +4.0 5.5 +0.1 + + +V +volt +3.3 12.0 +0.1 + + +0 32 +1 + + + +3.3V +5V + + + +0:Enable hardware watchdog + + +0 10000 +ms +milliseconds + + +1 500 +1 + + +0 1 +0.1 + + +0 100 +1 + + +0 10 +1 +True + + + + + +None +CYRF6936 +CC2500 +BK2425 + + + + +Auto +DSM2 +DSMX + + + +0 4 + + + +NotDisabled +Disabled + + + +0 16 + + +0 16 + + + +Disabled +Enabled + + + +1 8 + + + +Disabled +MinChannel +MidChannel +MaxChannel +MinChannelCW +MidChannelCW +MaxChannelCW + + + + +Mode1 +Mode2 + + + + +Disabled +TestChan1 +TestChan2 +TestChan3 +TestChan4 +TestChan5 +TestChan6 +TestChan7 +TestChan8 + + + +0 16 + + +0 16 + + +1 8 + + +0 40 + + +0 120 + + +0 31 + + + + +0:GPS,1:MAVLINK_SYSTEM_TIME,2:HW + + +-720 +840 + + + + + +Disabled +Enabled + + + + +Disabled +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 + + + + +Disabled +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 + + + + +Disabled +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 + + + + +Disabled +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 + + + +0 3600 + + + + + +Servo +Relay +GoPro in Solo Gimbal + + + +ds +deciseconds +0 50 + + +PWM +PWM in microseconds +1000 2000 + + +PWM +PWM in microseconds +1000 2000 + + +m +meters +0 1000 + + + +Low +High + + + +ms +milliseconds +0 10000 + + +deg +degrees +0 180 + + + +Disabled +AUX1 +AUX2 +AUX3 +AUX4 +AUX5 +AUX6 + +True + + + +TriggerLow +TriggerHigh + + + + +Always +Only when in AUTO + + + + +Default +BMMCC + + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + +0 32767 + + + + + +Disabled +Enabled + + + + +First Relay +Second Relay +Third Relay +Fourth Relay +Servo + + + +1000 2000 +PWM +PWM in microseconds +1 + + +1000 2000 +PWM +PWM in microseconds +1 + + +0 32000 +m +meters +1 + + +0 5000 +ms +milliseconds +1 + + +0 15 +m/s +meters per second +1 + + + + +cm +centimeters +0 200000 +100 + + +deg/s +degrees per second +-90 90 +1 + + + +Disable +Enable + + + + + +-400 400 +mGauss +milligauss +1 +1 + + +-400 400 +mGauss +milligauss +1 +1 + + +-400 400 +mGauss +milligauss +1 + + +-3.142 3.142 +rad +radians +0.01 + + + +Disabled +Internal-Learning +EKF-Learning +InFlight-Learning + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Use Throttle +Use Current + +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 +Custom + + + + +Internal +External +ForcedExternal + + + +-400 400 +mGauss +milligauss +1 +1 + + +-400 400 +mGauss +milligauss +1 +1 + + +-400 400 +mGauss +milligauss +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-400 400 +mGauss +milligauss +1 +1 + + +-400 400 +mGauss +milligauss +1 +1 + + +-400 400 +mGauss +milligauss +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +True + + +True + + +True + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 +Custom + + + + +Internal +External +ForcedExternal + + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 +Custom + + + + +Internal +External +ForcedExternal + + + +1 + + +1 + + + + +1 + + +1 + + + + +1 + + +1 + + + + +1 + + +1 + + + + +1 + + +1 + + + + +1 + + +1 + + + + +4 32 + +Very Strict +Strict +Default +Relaxed + +0.1 + + +500 3000 +1 + + +0:HMC5883,1:LSM303D,2:AK8963,3:BMM150,4:LSM9DS1,5:LIS3MDL,6:AK09916,7:IST8310,8:ICM20948,9:MMC3416,11:UAVCAN,12:QMC5883,14:MAG3110,15:IST8308 + + +% +percent +0 100 +1 + + + +Disabled +CheckOnly +CheckAndFix + + + +True + + +True + + +True + + + +Disabled +Enabled + + + +0 1.3 + + +0 1.3 + + +0 1.3 + + +0:CalRequireGPS + + +True + + +True + + +True + + +True + + +True + + +-180 180 +deg +degrees +1 +True + + +-180 180 +deg +degrees +1 +True + + +-180 180 +deg +degrees +1 +True + + + + + +Disabled +Enabled + + + +0 2 +0.01 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.000001 0.001 +Hz +hertz + + +0.00001 0.005 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +2.0 6.0 +0.5 +m/s +meters per second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + +0 127 +1 +ms +milliseconds +True + + + +None +Navigation +Terrain + +True + + +0 500 +mGauss +milligauss + + +0.1 30.0 +Hz +hertz +False + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +True +ms +milliseconds + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always +Use external yaw sensor + +True + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 250 +10 +True +ms +milliseconds + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.00001 0.005 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +True +ms +milliseconds + + +2.0 6.0 +0.5 +m/s +meters per second + + +0.5 2.5 +0.1 +m/s/s +meters per square second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + +0.05 0.5 +0.05 +m/s +meters per second + + +0.5 5.0 +0.1 +m/s +meters per second + + +0.01 1.0 +0.1 +m/s +meters per second + + + +None +Navigation +Terrain + +True + + +0.1 30.0 +Hz +hertz +False + + +0 500 +mGauss +milligauss + + + + + +Disabled +Enabled + + + + +None +Altitude +Circle +Altitude and Circle +Polygon +Altitude and Polygon +Circle and Polygon +All + +0:Altitude,1:Circle,2:Polygon + + + +Report Only +RTL or Land +Always Land +SmartRTL or RTL or Land +Brake or Land + + + +m +meters +10 1000 +1 + + +m +meters +30 10000 + + +m +meters +1 10 + + +1 20 + + +m +meters +-100 100 +1 + + + + +0.1 6.0 +0.1 + + +0.02 1.00 +0.01 + + +0 4500 +10 +cdeg +centidegrees + + +0 100 +Hz +hertz + + +0.1 2.5 + + +1 100 +Hz +hertz + + +0 255 + + +1 30 +deg/s +degrees per second + + + + + +None +PX4Flow +Pixart +Bebop +CXOF +MAVLink +UAVCAN + +True + + +-200 +200 +1 + + +-200 +200 +1 + + +-18000 +18000 +1 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +0 127 + + + +Disabled +Enabled + + + + + + +Disabled +Enabled + + + +0 255 + + +m +meters +1 1000 + + + +North-East-Down +Relative to lead vehicle heading + + + +-100 100 +m +meters +1 + + +-100 100 +m +meters +1 + + +-100 100 +m +meters +1 + + + +None +Face Lead Vehicle +Same as Lead vehicle +Direction of Flight + + + +0.01 1.00 +0.01 + + + +absolute + relative + + + + + +Pa +pascal +1 +True +True + + +degC +degrees Celsius +1 +True + + +m +meters +0.1 + + + +FirstBaro +2ndBaro +3rdBaro + + + + +Disabled +Bus0 +Bus1 + + + +1.0:Freshwater,1.024:Saltwater + + +Pa +pascal +1 +True +True + + +Pa +pascal +1 +True +True + + +% +percent +0 100 +1 + + +0:BMP085,1:BMP280,2:MS5611,3:MS5607,4:MS5637,5:FBM320,6:DPS280,7:LPS25H,8:Keller,9:MS5837,10:BMP388 + +BMP085 +BMP280 +MS5611 +MS5607 +MS5637 +FBM320 +DPS280 +LPS25H +Keller +MS5837 +BMP388 + + + + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA +HemisphereNMEA +uBlox-MovingBaseline-Base +uBlox-MovingBaseline-Rover + +True + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA +HemisphereNMEA +uBlox-MovingBaseline-Base +uBlox-MovingBaseline-Rover + +True + + + +Portable +Stationary +Pedestrian +Automotive +Sea +Airborne1G +Airborne2G +Airborne4G + + + + +Disabled +UseBest +Blend +UseSecond + + + + +Any +FloatRTK +IntegerRTK + +True + + + +Disabled +Enabled +NoChange + + + +-100 90 +deg +degrees + + + +send to first GPS +send to 2nd GPS +send to all + + + + +None (0x0000) +All (0xFFFF) +External only (0xFF00) + + + + +Ignore +Always log +Stop logging when disarmed (SBF only) +Only log every five samples (uBlox only) + +True + + + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + + + +Do not save config +Save config +Save only when needed + + + + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + + + +Disables automatic configuration +Enable automatic configuration + + + +ms +milliseconds + +10Hz +8Hz +5Hz + +50 200 + + +ms +milliseconds + +10Hz +8Hz +5Hz + +50 200 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +ms +milliseconds +0 250 +True + + +ms +milliseconds +0 250 +True + + +0:Horiz Pos,1:Vert Pos,2:Speed + + +s +seconds +5.0 30.0 + + +0:Use UART2 for moving baseline on ublox + + + + + +Disabled +Enabled + + + + +None +Servo +EPM + + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +0 255 +s +seconds + + +0 255 + + + + + +Servo only +Servo with ExtGyro +DirectDrive VarPitch +DirectDrive FixedPitch CW +DirectDrive FixedPitch CCW + + + +0 1000 +PWM +PWM in microseconds +1 + + +-10 10 +0.1 + + + +NoFlybar +Flybar + + + +0 100 +% +percent +1 + + +0 1000 +PWM +PWM in microseconds +1 + + + +H3 Generic +H1 non-CPPM +H3_140 +H3_120 +H4_90 +H4_45 + + + + +Normal +Reversed + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +-180 180 +deg +degrees + + +-180 180 +deg +degrees + + +-180 180 +deg +degrees + + +-30 30 +deg +degrees +1 + + + +Longitudinal +Transverse + + + +0 1 + + +-10 10 +0.1 + + +-10 10 +0.1 + + +1000 2000 +PWM +PWM in microseconds +1 + + +1000 2000 +PWM +PWM in microseconds +1 + + +1000 2000 +PWM +PWM in microseconds +1 + + + +H3 Generic +H1 non-CPPM +H3_140 +H3_120 +H4_90 +H4_45 + + + + +Normal +Reversed + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +-180 180 +deg +degrees + + +-180 180 +deg +degrees + + +-180 180 +deg +degrees + + +-30 30 +deg +degrees +1 + + + +H3 Generic +H1 non-CPPM +H3_140 +H3_120 +H4_90 +H4_45 + + + + +Normal +Reversed + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +-180 180 +deg +degrees + + +-180 180 +deg +degrees + + +-180 180 +deg +degrees + + +-30 30 +deg +degrees +1 + + +-0.2 0.2 +0.01 + + +1000 2000 +PWM +PWM in microseconds +1 + + +1000 2000 +PWM +PWM in microseconds +1 + + +1000 2000 +PWM +PWM in microseconds +1 + + + +Disabled +Passthrough +Max collective +Mid collective +Min collective + + + +0 4500 +100 + + +0 10 +1 + + +0.3 0.8 + + + +Disabled +Learn +Learn and Save + + + + +I term management based landed state +Leaky I(4.0 and earlier) + +0:Use Leaky I + + + + +0 100 +% +percent +1 + + + +RC Passthrough +External Gov SetPoint +Throttle Curve +Governor + + + +0 60 +s +seconds + + +0 60 +s +seconds + + +0 100 +% +percent +1 + + +0 50 +% +percent +1 + + +0 500 +10 + + +0 100 +% +percent +1 + + +0 100 +% +percent +1 + + +0 100 +% +percent +1 + + +0 100 +% +percent +1 + + +0 100 +% +percent +1 + + +800 3500 +RPM +Revolutions Per Minute +10 + + +0 50 +% +percent +1 + + +0 150 +% +percent +1 + + +50 100 +% +percent +1 + + +50 200 +RPM +Revolutions Per Minute +10 + + + + + +Disabled +Very Low +Low +Medium +High +Very High + + + +0 100 +% +percent +1 + + +0 100 +% +percent +1 + + +0 100 +% +percent +1 + + +0 100 +% +percent +1 + + + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +Hz +hertz +0 256 + + +Hz +hertz +0 256 + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +0.05 50 + + + +Never +Start-up only + + + + +Don't adjust the trims +Assume first orientation was level +Assume ACC_BODYFIX is perfectly aligned to the vehicle + + + + +IMU 1 +IMU 2 +IMU 3 + + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +True + + +True + + +True + + +True + + +True + + +True + + + +FirstIMUOnly +FirstAndSecondIMU + +0:FirstIMU,1:SecondIMU,2:ThirdIMU + + + +FirstIMUOnly +FirstAndSecondIMU +FirstSecondAndThirdIMU +AllIMUs + +0:FirstIMU,1:SecondIMU,2:ThirdIMU + + + + + +Disabled +Enabled + + + +10 495 +Hz +hertz + + +5 250 +Hz +hertz + + +5 50 +dB +decibel + + +0:1st harmonic,1:2nd harmonic,2:3rd harmonic,3:4th hamronic,4:5th harmonic,5:6th harmonic,6:7th harmonic,7:8th harmonic +True + + +0.0 1.0 +True + + +0 3 + +Disabled +Throttle +RPM Sensor +ESC Telemetry + + + + + +32 +True + + + +None +First IMU +All + +0:IMU1,1:IMU2,2:IMU3 +True + + +0:Sensor-Rate Logging (sample at full sensor rate seen by AP), 1: Sample post-filtering + + +ms +milliseconds +10 + + +1 + + + + + +Disabled +Enabled + + + +5 30 +dB +decibel + + +10 400 +Hz +hertz + + +5 100 +Hz +hertz + + + + + +WaitForPilotInput +Retract +Deploy + + + + +Disabled +AUX1 +AUX2 +AUX3 +AUX4 +AUX5 +AUX6 + +True + + + +Low +High + + + + +Disabled +AUX1 +AUX2 +AUX3 +AUX4 +AUX5 +AUX6 + +True + + + +Low +High + + + +m +meters +0 1000 +1 + + +m +meters +0 1000 +1 + + + +Retract after Takeoff +Deploy during Land +Retract after Takeoff AND deploy during Land + +0:Retract after Takeoff,1:Deploy during Land + + + + + +None +File +MAVLink +File and MAVLink +Block +Block and MAVLink + +0:File,1:MAVLink,2:Block + + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +kB +kilobytes + + +s +seconds + + + + +deg +degrees +0 45 +1 + + +cm/s +centimeters per second +20 2000 +50 + + +cm/s/s +centimeters per square second +100 981 +1 + + +cm/s/s +centimeters per square second +25 250 +1 + + +cm/s/s/s +centimeters per cubic second +500 5000 +1 + + +s +seconds +0 2 +0.1 + + + + +0 32766 +1 +True + + + +Resume Mission +Restart Mission + + + +0:Clear Mission on reboot + + + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + +0 100 +1 + + +s +seconds +0.0 0.2 +.005 + + +s +seconds +0.0 0.2 +.005 + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + +True + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + +s +seconds +0.0 0.2 +.005 + + +s +seconds +0.0 0.2 +.005 + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + + + + + +0 500 +PWM +PWM in microseconds + + +0.25 0.8 + + +0.9:Low, 0.95:Default, 1.0:High + + +6 35 +V +volt + + +6 35 +V +volt + + +0 200 +A +ampere + + + +Normal +OneShot +OneShot125 +Brushed +DShot150 +DShot300 +DShot600 +DShot1200 + +True + + +PWM +PWM in microseconds +0 2000 + + +PWM +PWM in microseconds +0 2000 + + +0.0:Low, 0.15:Default, 0.3:High + + +0.0:Low, 0.1:Default, 0.2:High + + +0 10 +s +seconds + + +0.2 0.8 + + + +Disabled +Learn +Learn and Save + + + + +PWM enabled while disarmed +PWM disabled while disarmed + + + +5 80 +deg +degrees +1 + + +0 2 +s +seconds +0.1 + + +0 5 +0.1 + + + +First battery +Second battery + + + +0 .5 +s +seconds +0.001 + + +0 .5 +s +seconds +0.001 + + +0 5 +s +seconds +0.001 + + + + + +Off +Low +Medium +High + + + + +Disable +Enable + + + + +Standard +MAVLink +OutbackChallenge +TrafficLight + + + + +Disable +ssd1306 +sh1106 +SITL + + + + +Disabled +Aircraft +Rover + + + + +Disabled + + + +0:Build in LED, 1:Internal ToshibaLED, 2:External ToshibaLED, 3:External PCA9685, 4:Oreo LED, 5:UAVCAN, 6:NCP5623 External, 7:NCP5623 Internal, 8:NeoPixel, 9:ProfiLED + + + +LowIsOn +HighIsOn + + + +0 100 +% +percent + + +1 32 + + + + + +Disabled +BendyRuler +Dijkstra + + + +m +meters +1 100 +1 + + +m +meters +0.1 100 +1 + + + + +0 10000 +True + + +s +seconds +0 127 +1 + + +1 200 +True + + + +Disabled +Send only HIGH importance items +Send HIGH and NORMAL importance items +Send all items + + + +deg +degrees +1 10 +True + + +m +meters +0 10 + + +m +meters +0 10 + + + + + +None +MAX7456 + +True + + + +Disable +Chan5 +Chan6 +Chan7 +Chan8 +Chan9 +Chan10 +Chan11 +Chan12 +Chan13 +Chan14 +Chan15 +Chan16 + + + +0:UseDecimalPack, 1:InvertedWindPointer, 2:InvertedAHRoll + + +True + + +0 31 +True + + +0 63 +True + + +0 99 + + +1 30 + + +0 100 + + + +Metric +Imperial +SI +Aviation + + + +1 20 + + +0 4 + + +0 4 + + +0 4 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + + +None +CompanionComputer +IRLock +SITL_Gazebo +SITL + + + +0 360 +1 +cdeg +centidegrees + + +-20 20 +1 +cm +centimeters + + +-20 20 +1 +cm +centimeters + + + +RawSensor +KalmanFilter + + + +0.5 5 + + +m +meters + + +m +meters + + +m +meters + + + +DefaultBus +InternalI2C +ExternalI2C + + + +0.02 0.250 +1 +s +seconds +True + + + + + +None +LightwareSF40c +LightWareSF40C-legacy +MAVLink +TeraRangerTower +RangeFinder +RPLidarA2 +TeraRangerTowerEvo +SITL +MorseSITL +AirSimSITL + +True + + + +Default +Upside Down + + + +deg +degrees +-180 180 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + + +None +LightwareSF40c +LightWareSF40C-legacy +MAVLink +TeraRangerTower +RangeFinder +RPLidarA2 +TeraRangerTowerEvo +SITL +MorseSITL +AirSimSITL + +True + + + +Default +Upside Down + + + +deg +degrees +-180 180 + + + + +Hz +hertz +0.5 5 +0.1 + + +1.000 3.000 + + +1.000 8.000 + + +0.500 1.500 +0.05 + + +0.000 3.000 + + +0 1000 +d% +decipercent + + +0.000 0.400 + + +0 0.5 +0.001 + + +1 50 +1 +Hz +hertz + + +1 100 +1 +Hz +hertz + + +1 100 +1 +Hz +hertz + + +0.500 2.000 + + +0.1 6.0 +0.1 + + +0.02 1.00 +0.01 + + +0.00 1.00 +0.001 + + +0 4500 +10 +cm/s/s +centimeters per square second + + +0 100 +Hz +hertz + + +0 100 +Hz +hertz + + +deg +degrees +0 45 +1 + + + + + + +km +kilometers +0.1 + + + +DoNotIncludeHome +IncludeHome + + + + + +0.0 120.0 +s +seconds + + +0:Ignore RC Receiver, 1:Ignore MAVLink Overrides, 2:Ignore Receiver Failsafe + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable +Relay5 +Relay6 +Stabilize +PosHold +AltHold +FlowHold +Circle +Drift +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable +Relay5 +Relay6 +Stabilize +PosHold +AltHold +FlowHold +Circle +Drift +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable +Relay5 +Relay6 +Stabilize +PosHold +AltHold +FlowHold +Circle +Drift +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable +Relay5 +Relay6 +Stabilize +PosHold +AltHold +FlowHold +Circle +Drift +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable +Relay5 +Relay6 +Stabilize +PosHold +AltHold +FlowHold +Circle +Drift +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable +Relay5 +Relay6 +Stabilize +PosHold +AltHold +FlowHold +Circle +Drift +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable +Relay5 +Relay6 +Stabilize +PosHold +AltHold +FlowHold +Circle +Drift +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable +Relay5 +Relay6 +Stabilize +PosHold +AltHold +FlowHold +Circle +Drift +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable +Relay5 +Relay6 +Stabilize +PosHold +AltHold +FlowHold +Circle +Drift +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable +Relay5 +Relay6 +Stabilize +PosHold +AltHold +FlowHold +Circle +Drift +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable +Relay5 +Relay6 +Stabilize +PosHold +AltHold +FlowHold +Circle +Drift +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable +Relay5 +Relay6 +Stabilize +PosHold +AltHold +FlowHold +Circle +Drift +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable +Relay5 +Relay6 +Stabilize +PosHold +AltHold +FlowHold +Circle +Drift +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable +Relay5 +Relay6 +Stabilize +PosHold +AltHold +FlowHold +Circle +Drift +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable +Relay5 +Relay6 +Stabilize +PosHold +AltHold +FlowHold +Circle +Drift +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +Super Simple Mode +Acro Trainer +Sprayer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw +ADSB-Avoidance +PrecLoiter +Proximity Avoidance +ArmDisarm +SmartRTL +InvertedFlight +Winch Enable +WinchControl +RC Override Enable +User Function 1 +User Function 2 +User Function 3 +Clear Waypoints +ZigZag +ZigZag SaveWP +Compass Learn +GPS Disable +Relay5 +Relay6 +Stabilize +PosHold +AltHold +FlowHold +Circle +Drift +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True +1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8 + + +1 8 +1 +True +1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8 + + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Off +On +NoChange + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +PWM +AUXPIN + + + +0.001 + + +1 + + +1 + + +0.1 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +None +PWM +AUXPIN + + + +0.001 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + + + +Disabled +AnalogPin +RCChannelPwmValue +ReceiverProtocol +PWMInputPin + + + + +V5 Nano +Pixracer +Pixhawk ADC4 +Pixhawk ADC3 +Pixhawk ADC6 +Pixhawk2 ADC +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 +Pixhawk SBUS + + + +V +volt +0.01 +0 5.0 + + +V +volt +0.01 +0 5.0 + + +0 16 + + +PWM +PWM in microseconds +0 2000 + + +PWM +PWM in microseconds +0 2000 + + + + + +Disabled +ShowSlips +ShowOverruns + + + + +50Hz +100Hz +200Hz +250Hz +300Hz +400Hz + +True + + + + + +None +Lua Scripts + +True + + +1000 1000000 +10000 + + +1024 1048576 +1024 +True + + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +460800 +500000 +921600 +1500000 + + + + +MAVlink1 +MAVLink2 + +True + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + +0 120 +s +seconds + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + + + + +Disable +Enable + + + +25 400 +Hz +hertz + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + +Disabled +Enabled + + + + +Disabled +TestMotor1 +TestMotor2 +TestMotor3 +TestMotor4 +TestMotor5 +TestMotor6 +TestMotor7 +TestMotor8 + + + +s +seconds +0 300 + + +Hz +hertz +0 500 + + + +Disabled +Enabled + + + + +None +OneShot +OneShot125 +Brushed +DShot150 +DShot300 +DShot600 +DShot1200 + + + + +Console +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 + + + +1 127 + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + + +0 4095 + + +0 4095 + + + + +25 250 +Hz +hertz + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + + + +None +Input Roll Angle +Input Pitch Angle +Input Yaw Angle +Recovery Roll Angle +Recovery Pitch Angle +Recovery Yaw Angle +Rate Roll +Rate Pitch +Rate Yaw +Mixer Roll +Mixer Pitch +Mixer Yaw +Mixer Thrust + + + + + +0.01 100 +Hz +hertz + + +0.01 100 +Hz +hertz + + +0 20 +s +seconds + + +0 255 +s +seconds + + +0 5 +s +seconds + + + + + +Disabled +Enabled + + + +% +percent +0 100 + + +ms +milliseconds +1000 2000 + + +cm/s +centimeters per second +0 1000 + + +% +percent +0 100 + + + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 50 +1 + + + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 50 +1 + + + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 50 +1 + + + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 50 +1 + + + + +m +meters +0 10 + + +0 500 +True + + + + +True + + +s +seconds +True + + +s +seconds +True + + +s +seconds +True + + + + + +Disabled +Enabled +EnableAndLearn + + + +degC +degrees Celsius +True +True + + +degC +degrees Celsius +True +True + + +True +True + + + + + +Disable +Enable + + + +m +meters +1 + + +0:Disable Download + + + + + +Disabled +EnableVersion1 +EnableVersion2 + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +FlowHold + + + + +Stabilize +Acro +AltHold +Auto +Guided +Loiter +RTL +Circle +Land +Drift +Sport +Flip +AutoTune +PosHold +Brake +Throw +Avoid_ADSB +Guided_NoGPS +FlowHold + + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest +ModeFlowHold + + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest +ModeFlowHold + + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest +ModeFlowHold + + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest +ModeFlowHold + + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest +ModeFlowHold + + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest +ModeFlowHold + + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest +ModeFlowHold + + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest +ModeFlowHold + + + +0 100 + + + +None +TakePhoto +ToggleVideo +ModeAcro +ModeAltHold +ModeAuto +ModeLoiter +ModeRTL +ModeCircle +ModeLand +ModeDrift +ModeSport +ModeAutoTune +ModePosHold +ModeBrake +ModeThrow +Flip +ModeStabilize +Disarm +ToggleMode +Arm-Land-RTL +ToggleSimpleMode +ToggleSuperSimpleMode +MotorLoadTest + + + +0:DisarmOnLowThrottle,1:ArmOnHighThrottle,2:UpgradeToLoiter,3:RTLStickCancel + + +0 5 +0.01 + + +0 5 +0.01 + + +0 1 +0.01 + + +0 1 +0.01 + + +0 1 +0.01 + + +0 100 + + + +ConstantThrust +LogReplay1 +LogReplay2 + + + + + + +None +MAV + + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Right +Back +Left +Up +Down + + + + + + +None +Quadrature +SITL Quadrature + + + +1 + + +m +meters +0.001 + + +m +meters +0.01 + + +m +meters +0.01 + + +m +meters +0.01 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +None +Quadrature +SITL Quadrature + + + +1 + + +m +meters +0.001 + + +m +meters +0.01 + + +m +meters +0.01 + + +m +meters +0.01 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + + + +Disabled +Enabled + + + + +Servo with encoder + + + +0 10 +m/s +meters per second + + +0.01 10.0 + + +0.100 2.000 + + +0.000 2.000 + + +0.000 1.000 + + +0.000 0.400 + + +1.000 100.000 +Hz +hertz + + + + +cm/s +centimeters per second +20 2000 +50 + + +cm +centimeters +5 1000 +1 + + +cm/s +centimeters per second +10 1000 +50 + + +cm/s +centimeters per second +10 500 +10 + + +cm/s/s +centimeters per square second +50 500 +10 + + +cm/s/s +centimeters per square second +50 500 +10 + + + +Disable +Enable + + + + diff --git a/src/FirmwarePlugin/APM/APMParameterFactMetaData.Copter.4.2.xml b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Copter.4.1.xml similarity index 89% rename from src/FirmwarePlugin/APM/APMParameterFactMetaData.Copter.4.2.xml rename to src/FirmwarePlugin/APM/APMParameterFactMetaData.Copter.4.1.xml index 49b2c68..4898e43 100644 --- a/src/FirmwarePlugin/APM/APMParameterFactMetaData.Copter.4.2.xml +++ b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Copter.4.1.xml @@ -13,34 +13,33 @@ 1 255 - 0 10 - .5 Hz hertz + 0 10 + .5 - 0.0 1000.0 - 10 cm centimeters + 0.0 1000.0 + 10 - 0:Feedback from mid stick,1:High throttle cancels landing,2:Disarm on land detection None Feedback from mid stick High throttle cancels landing Disarm on land detection + 0:Feedback from mid stick,1:High throttle cancels landing,2:Disarm on land detection - 0 30 - 1 s seconds + 0 30 + 1 - 0:Roll,1:Pitch,2:Yaw,3:AccelZ None Roll @@ -48,45 +47,46 @@ Yaw AccelZ + 0:Roll,1:Pitch,2:Yaw,3:AccelZ - 200 300000 - 1 cm centimeters + 200 8000 + 1 0.5 10.0 + .1 Disabled Shallow Steep - .1 - 0 2000 - 50 cm/s centimeters per second + 0 2000 + 50 + cm + centimeters 0 1000 1 - cm - centimeters - 0 3000 - 10 cm centimeters + 0 3000 + 10 - 0 60000 - 1000 ms milliseconds + 0 60000 + 1000 @@ -94,6 +94,10 @@ Terrain + + 0.01 2.0 + 0.01 + Disabled/NoAction @@ -101,15 +105,79 @@ RTL or Continue with Mission in Auto Mode (Removed in 4.0+-see FS_OPTIONS) SmartRTL or RTL SmartRTL or Land - Land - Auto DO_LAND_START or RTL + Land (4.0+ Only) 100 900 - - 0:SwitchPos1, 1:SwitchPos2, 2:SwitchPos3, 3:SwitchPos4, 4:SwitchPos5, 5:SwitchPos6 + + + Disabled + Mode1 + Mode2 + Mode1+2 + Mode3 + Mode1+3 + Mode2+3 + Mode1+2+3 + Mode4 + Mode1+4 + Mode2+4 + Mode1+2+4 + Mode3+4 + Mode1+3+4 + Mode2+3+4 + Mode1+2+3+4 + Mode5 + Mode1+5 + Mode2+5 + Mode1+2+5 + Mode3+5 + Mode1+3+5 + Mode2+3+5 + Mode1+2+3+5 + Mode4+5 + Mode1+4+5 + Mode2+4+5 + Mode1+2+4+5 + Mode3+4+5 + Mode1+3+4+5 + Mode2+3+4+5 + Mode1+2+3+4+5 + Mode6 + Mode1+6 + Mode2+6 + Mode1+2+6 + Mode3+6 + Mode1+3+6 + Mode2+3+6 + Mode1+2+3+6 + Mode4+6 + Mode1+4+6 + Mode2+4+6 + Mode1+2+4+6 + Mode3+4+6 + Mode1+3+4+6 + Mode2+3+4+6 + Mode1+2+3+4+6 + Mode5+6 + Mode1+5+6 + Mode2+5+6 + Mode1+2+5+6 + Mode3+5+6 + Mode1+3+5+6 + Mode2+3+5+6 + Mode1+2+3+5+6 + Mode4+5+6 + Mode1+4+5+6 + Mode2+4+5+6 + Mode1+2+4+5+6 + Mode3+4+5+6 + Mode1+3+4+5+6 + Mode2+3+4+5+6 + Mode1+2+3+4+5+6 + @@ -120,28 +188,28 @@ + cm/s + centimeters per second 30 200 10 - cm/s - centimeters per second + cm/s + centimeters per second 0 500 10 - cm/s - centimeters per second - 50 500 - 10 cm/s centimeters per second - - 50 500 10 + + cm/s/s centimeters per square second + 50 500 + 10 @@ -151,22 +219,21 @@ Enabled always Land Enabled always SmartRTL or RTL Enabled always SmartRTL or Land - Enabled Auto DO_LAND_START or RTL 910 1100 - 1 PWM PWM in microseconds + 1 0 300 - 1 PWM PWM in microseconds + 1 - + Stabilize Acro @@ -192,10 +259,9 @@ ZigZag SystemID Heli_Autorotate - Auto RTL - + Stabilize Acro @@ -221,10 +287,9 @@ ZigZag SystemID Heli_Autorotate - Auto RTL - + Stabilize Acro @@ -250,10 +315,9 @@ ZigZag SystemID Heli_Autorotate - Auto RTL - + Stabilize Acro @@ -279,10 +343,9 @@ ZigZag SystemID Heli_Autorotate - Auto RTL - + Stabilize Acro @@ -308,10 +371,9 @@ ZigZag SystemID Heli_Autorotate - Auto RTL - + Stabilize Acro @@ -337,7 +399,6 @@ ZigZag SystemID Heli_Autorotate - Auto RTL @@ -384,11 +445,10 @@ Heli_Autorotate - - 0:SwitchPos1, 1:SwitchPos2, 2:SwitchPos3, 3:SwitchPos4, 4:SwitchPos5, 5:SwitchPos6 - + + - 0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:CTUN,5:NTUN,6:RCIN,7:IMU,8:CMD,9:CURRENT,10:RCOUT,11:OPTFLOW,12:PID,13:COMPASS,14:INAV,15:CAMERA,17:MOTBATT,18:IMU_FAST,19:IMU_RAW,20:VideoStabilization + 0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:CTUN,5:NTUN,6:RCIN,7:IMU,8:CMD,9:CURRENT,10:RCOUT,11:OPTFLOW,12:PID,13:COMPASS,14:INAV,15:CAMERA,17:MOTBATT,18:IMU_FAST,19:IMU_RAW @@ -420,12 +480,13 @@ Velocity XY kP Velocity XY kI WP Speed - Acro Roll/Pitch deg/s - Acro Yaw deg/s + Acro RollPitch kP + Acro Yaw kP RC Feel Heli Ext Gyro Declination Circle Rate + RangeFinder Gain Rate Pitch kP Rate Pitch kI Rate Pitch kD @@ -453,31 +514,30 @@ ClockwiseX I BetaFlightXReversed - Y4 True - 0 127 s seconds + 0 127 - 1000 8000 - 10 cdeg centidegrees + 10 + 1000 8000 - 4 12 deg/s degrees per second + 4 12 - 2000 4500 - 10 cdeg centidegrees + 10 + 2000 4500 @@ -493,11 +553,7 @@ - - Strict - Default - Relaxed - + 0.6:Strict,0.8:Default,1.0:Relaxed @@ -506,10 +562,16 @@ - 50 490 - 1 Hz hertz + 50 490 + 1 + + + 1 10 + + + 1 10 0 3 @@ -527,7 +589,6 @@ - -0.5 0.95 Disabled Very Low @@ -536,6 +597,7 @@ High Very High + -0.5 1.0 @@ -573,7 +635,6 @@ 0:ADSBMavlinkProcessing,1:DevOptionVFR_HUDRelativeAlt - -1.0 0.95 Disabled Very Low @@ -582,6 +643,7 @@ High Very High + -0.5 1.0 0 1 @@ -611,21 +673,20 @@ Deca Scripting Matrix 6DoF Scripting - Dynamic Scripting Matrix True - - 0 500 - 10 + cm/s centimeters per second + 50 500 + 10 - 100 10000 - 10 cm centimeters + 100 10000 + 10 @@ -638,7 +699,6 @@ - 0:Continue if in Auto on RC failsafe, 1:Continue if in Auto on GCS failsafe, 2:Continue if in Guided on RC failsafe, 3:Continue if landing on any failsafe, 4:Continue if in pilot controlled modes on GCS failsafe, 5:Release Gripper Disabled Continue if in Auto on RC failsafe only @@ -649,6 +709,7 @@ Continue if in pilot controlled modes on GCS failsafe Continue if in Auto on RC and/or GCS failsafe and continue if in pilot controlled modes on GCS failsafe + 0:Continue if in Auto on RC failsafe, 1:Continue if in Auto on GCS failsafe, 2:Continue if in Guided on RC failsafe, 3:Continue if landing on any failsafe, 4:Continue if in pilot controlled modes on GCS failsafe, 5:Release Gripper 0:Air-mode,1:Rate Loop Only @@ -657,65 +718,27 @@ 0:Allow Arming,1:Allow Takeoff Without Raising Throttle,2:Ignore pilot yaw - 0:Allow Arming from Transmitter,2:Ignore pilot yaw,3:SetAttitudeTarget interprets Thrust As Thrust,4:Do not stabilize PositionXY,5:Do not stabilize VelocityXY,6:Waypoint navigation used for position targets + 0:Allow Arming from Transmitter,2:Ignore pilot yaw,3:SetAttitudeTarget_ThrustAsThrust - 2 120 - 1 s seconds + 2 120 + 1 2:Ignore pilot yaw - 0:Disable thrust loss check, 1:Disable yaw imbalance warning, 2:Release gripper on thrust loss + 0:Disable thrust loss check, 1:Disable yaw imbalance warning - 0 5 - 0.05 Hz hertz + 0 5 + 0.05 True - - 0.1 5 - s - seconds - - - 1 1080 - deg/s - degrees per second - - - 1 360 - deg/s - degrees per second - - - 1 360 - deg/s - degrees per second - - - -0.5 1.0 - - Disabled - Very Low - Low - Medium - High - Very High - - - - - Do not track - Ground - Ceiling - - @@ -725,7 +748,6 @@ Disabled uAvionix-MAVLink Sagetech - uAvionix-UCP True @@ -738,7 +760,7 @@ m meters - + -1 16777215 @@ -828,9 +850,6 @@ log all - - 0:Ping200X Send GPS,1:Squawk 7400 on RC failsafe,2:Squawk 7400 on GCS failsafe - @@ -913,11 +932,10 @@ 0.0 1.0 .01 - + Disabled - Use GPS for DCM position - Use GPS for DCM position and height + Enabled @@ -930,29 +948,29 @@ 0 127 - 1 m/s meters per second + 1 - -0.1745 +0.1745 - 0.01 rad radians + -0.1745 +0.1745 + 0.01 - -0.1745 +0.1745 - 0.01 rad radians + -0.1745 +0.1745 + 0.01 - -0.1745 +0.1745 - 0.01 rad radians + -0.1745 +0.1745 + 0.01 - + None Yaw45 @@ -963,40 +981,38 @@ Yaw270 Yaw315 Roll180 - Yaw45Roll180 - Yaw90Roll180 - Yaw135Roll180 + Roll180Yaw45 + Roll180Yaw90 + Roll180Yaw135 Pitch180 - Yaw225Roll180 - Yaw270Roll180 - Yaw315Roll180 + Roll180Yaw225 + Roll180Yaw270 + Roll180Yaw315 Roll90 - Yaw45Roll90 - Yaw90Roll90 - Yaw135Roll90 + Roll90Yaw45 + Roll90Yaw90 + Roll90Yaw135 Roll270 - Yaw45Roll270 - Yaw90Roll270 - Yaw135Roll270 + Roll270Yaw45 + Roll270Yaw90 + Roll270Yaw135 Pitch90 Pitch270 - Yaw90Pitch180 - Yaw270Pitch180 - Pitch90Roll90 - Pitch90Roll180 - Pitch90Roll270 - Pitch180Roll90 - Pitch180Roll270 - Pitch270Roll90 - Pitch270Roll180 - Pitch270Roll270 - Yaw90Pitch180Roll90 - Yaw270Roll90 + Pitch180Yaw90 + Pitch180Yaw270 + Roll90Pitch90 + Roll180Pitch90 + Roll270Pitch90 + Roll90Pitch180 + Roll270Pitch180 + Roll90Pitch270 + Roll180Pitch270 + Roll270Pitch270 + Roll90Pitch180Yaw90 + Roll90Yaw270 Yaw293Pitch68Roll180 Pitch315 - Pitch315Roll90 - Roll45 - Roll315 + Roll90Pitch315 Custom @@ -1018,28 +1034,28 @@ -180 180 - 1 deg degrees + 1 -180 180 - 1 deg degrees + 1 -180 180 - 1 deg degrees + 1 - 0.25 3.0 m/s/s meters per square second + 0.25 3.0 @@ -1067,46 +1083,46 @@ 0.01 - 1000 2800 - 1 RPM Revolutions Per Minute + 1000 2800 + 1 - 800 2000 - 50 cm/s centimeters per second + 800 2000 + 50 + Hz + hertz 0.2 0.5 0.01 - Hz - hertz - 0.03 0.15 - 0.01 Hz hertz + 0.03 0.15 + 0.01 - 30 60 - 10 cm/s/s centimeters per square second + 30 60 + 10 + s + seconds 0.5 4 0.1 - s - seconds - 0.5 3 - 0.1 s seconds + 0.5 3 + 0.1 0.1 6.0 @@ -1117,157 +1133,16 @@ 0.01 - - - - None - I2C-MS4525D0 - Analog - I2C-MS5525 - I2C-MS5525 (0x76) - I2C-MS5525 (0x77) - I2C-SDP3X - I2C-DLVR-5in - DroneCAN - I2C-DLVR-10in - I2C-DLVR-20in - I2C-DLVR-30in - I2C-DLVR-60in - NMEA water speed - MSP - ASP5033 - - - - True - - - - DoNotUse - Use - UseWhenZeroThrottle - - - - 0.1 - - - 0.1 - - - - - - - - Normal - Swapped - Auto Detect - - - - - Disable - Enable - - - - - - - Bus0(internal) - Bus1(external) - Bus2(auxillary) - - - - - FirstSensor - 2ndSensor - - - - 0:SpeedMismatchDisable, 1:AllowSpeedMismatchRecovery, 2:DisableVoltageCorrection - - - m/s - meters per second - - - m/s - meters per second - - - - None - I2C-MS4525D0 - Analog - I2C-MS5525 - I2C-MS5525 (0x76) - I2C-MS5525 (0x77) - I2C-SDP3X - I2C-DLVR-5in - DroneCAN - I2C-DLVR-10in - I2C-DLVR-20in - I2C-DLVR-30in - I2C-DLVR-60in - NMEA water speed - MSP - ASP5033 - - - - - Don't Use - use - UseWhenZeroThrottle - - - - 0.1 - - - 0.1 - - - - - - - - Normal - Swapped - Auto Detect - - - - - Disable - Enable - - - - - - - Bus0(internal) - Bus1(external) - Bus2(auxillary) - - - - True - - - 500 18000 - 100 cdeg/s centidegrees per second + 500 18000 + 100 + cdeg/s/s + centidegrees per square second 0 72000 Disabled @@ -1277,8 +1152,6 @@ Fast 1000 - cdeg/s/s - centidegrees per square second @@ -1287,7 +1160,10 @@ + cdeg/s/s + centidegrees per square second 0 180000 + 1000 Disabled VerySlow @@ -1295,12 +1171,12 @@ Medium Fast - 1000 - cdeg/s/s - centidegrees per square second + cdeg/s/s + centidegrees per square second 0 180000 + 1000 Disabled VerySlow @@ -1308,9 +1184,6 @@ Medium Fast - 1000 - cdeg/s/s - centidegrees per square second @@ -1331,53 +1204,47 @@ 0.5 10.0 - 0 1080 - - Disabled - Slow - Medium - Fast - - 1 deg/s degrees per second + 0 1080 + 1 + + Disabled + Slow + Medium + Fast + - 0 1080 - - Disabled - Slow - Medium - Fast - - 1 deg/s degrees per second + 0 1080 + 1 + + Disabled + Slow + Medium + Fast + - 0 1080 - - Disabled - Slow - Medium - Fast - - 1 deg/s degrees per second + 0 1080 + 1 + + Disabled + Slow + Medium + Fast + - 0 1 - - Very Soft - Soft - Medium - Crisp - Very Crisp - - 0.01 s seconds + 0 1 + 0.01 + 0.5:Very Soft,0.2:Soft,0.15:Medium,0.1:Crisp,0.05:Very Crisp 0.01 0.5 @@ -1515,10 +1382,10 @@ 0.1 0.9 - 0 1000 - 10 cdeg centidegrees + 10 + 0 1000 0.0 0.35 @@ -1539,7 +1406,7 @@ 0.0 0.03 0.001 - + 0.05 0.5 0.001 @@ -1584,7 +1451,7 @@ 0.0 0.03 0.001 - + 0.05 0.5 0.001 @@ -1629,7 +1496,7 @@ 0.000 0.02 0.001 - + 0 0.5 0.001 @@ -1672,24 +1539,6 @@ 0.001 0.006 - - 0:Roll,1:Pitch,2:Yaw - - - 0:VFF,1:Rate D/Rate P(incl max gain),2:Angle P,3:Max Gain Only - - - 10 30 - - - 50 120 - - - 1 2.5 - - - 0 1 - @@ -1759,20 +1608,20 @@ 0:UseFence,1:UseProximitySensor,2:UseBeaconFence - 0 4500 - 10 cdeg centidegrees + 10 + 0 4500 - 1 30 m meters + 1 30 - 1 10 m meters + 1 10 @@ -1781,44 +1630,44 @@ - 0 2 m/s meters per second + 0 2 - 0 6 m meters + 0 6 - 0 9 m/s/s meters per square second + 0 9 - 0 2 m meters + 0 2 - True - True - 1 Pa pascal + 1 + True + True - True - 1 degC degrees Celsius + 1 + True - 0.1 m meters + 0.1 @@ -1835,30 +1684,27 @@ - - Freshwater - Saltwater - + 1.0:Freshwater,1.024:Saltwater - True - True - 1 Pa pascal + 1 + True + True - True - True - 1 Pa pascal + 1 + True + True - 0 100 - 1 % percent + 0 100 + 1 0:BMP085,1:BMP280,2:MS5611,3:MS5607,4:MS5637,5:FBM320,6:DPS280,7:LPS25H,8:Keller,9:MS5837,10:BMP388,11:SPL06,12:MSP @@ -1954,9 +1800,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -1966,92 +1812,13 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - Land - RTL - SmartRTL or RTL - SmartRTL or Land - Terminate - Auto DO_LAND_START or RTL - - - - - None - Land - RTL - SmartRTL or RTL - SmartRTL or Land - Terminate - Auto DO_LAND_START or RTL - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - Navigator Pixhawk2_PM2/CubeOrange_PM2 CubeOrange Durandal @@ -2063,7 +1830,7 @@ Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - CubeOrange_PM2/Navigator + CubeOrange_PM2 Pixhawk2_PM2 CubeOrange Durandal @@ -2081,23 +1848,80 @@ V volt - + + mAh + milliampere hour + 50 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + Land + RTL + SmartRTL or RTL + SmartRTL or Land + Terminate + + + + + None + Land + RTL + SmartRTL or RTL + SmartRTL or Land + Terminate + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -2109,9 +1933,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -2121,92 +1945,13 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - Land - RTL - SmartRTL or RTL - SmartRTL or Land - Terminate - Auto DO_LAND_START or RTL - - - - - None - Land - RTL - SmartRTL or RTL - SmartRTL or Land - Terminate - Auto DO_LAND_START or RTL - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - Navigator Pixhawk2_PM2/CubeOrange_PM2 CubeOrange Durandal @@ -2218,7 +1963,7 @@ Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - CubeOrange_PM2/Navigator + CubeOrange_PM2 Pixhawk2_PM2 CubeOrange Durandal @@ -2236,23 +1981,80 @@ V volt - + + mAh + milliampere hour + 50 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + Land + RTL + SmartRTL or RTL + SmartRTL or Land + Terminate + + + + + None + Land + RTL + SmartRTL or RTL + SmartRTL or Land + Terminate + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -2264,9 +2066,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -2276,92 +2078,13 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - Land - RTL - SmartRTL or RTL - SmartRTL or Land - Terminate - Auto DO_LAND_START or RTL - - - - - None - Land - RTL - SmartRTL or RTL - SmartRTL or Land - Terminate - Auto DO_LAND_START or RTL - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - Navigator Pixhawk2_PM2/CubeOrange_PM2 CubeOrange Durandal @@ -2373,7 +2096,7 @@ Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - CubeOrange_PM2/Navigator + CubeOrange_PM2 Pixhawk2_PM2 CubeOrange Durandal @@ -2391,23 +2114,80 @@ V volt - + + mAh + milliampere hour + 50 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + Land + RTL + SmartRTL or RTL + SmartRTL or Land + Terminate + + + + + None + Land + RTL + SmartRTL or RTL + SmartRTL or Land + Terminate + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -2419,9 +2199,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -2431,92 +2211,13 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - Land - RTL - SmartRTL or RTL - SmartRTL or Land - Terminate - Auto DO_LAND_START or RTL - - - - - None - Land - RTL - SmartRTL or RTL - SmartRTL or Land - Terminate - Auto DO_LAND_START or RTL - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - Navigator Pixhawk2_PM2/CubeOrange_PM2 CubeOrange Durandal @@ -2528,7 +2229,7 @@ Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - CubeOrange_PM2/Navigator + CubeOrange_PM2 Pixhawk2_PM2 CubeOrange Durandal @@ -2546,23 +2247,80 @@ V volt - + + mAh + milliampere hour + 50 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + Land + RTL + SmartRTL or RTL + SmartRTL or Land + Terminate + + + + + None + Land + RTL + SmartRTL or RTL + SmartRTL or Land + Terminate + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -2574,9 +2332,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -2586,92 +2344,13 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - Land - RTL - SmartRTL or RTL - SmartRTL or Land - Terminate - Auto DO_LAND_START or RTL - - - - - None - Land - RTL - SmartRTL or RTL - SmartRTL or Land - Terminate - Auto DO_LAND_START or RTL - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - Navigator Pixhawk2_PM2/CubeOrange_PM2 CubeOrange Durandal @@ -2683,7 +2362,7 @@ Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - CubeOrange_PM2/Navigator + CubeOrange_PM2 Pixhawk2_PM2 CubeOrange Durandal @@ -2701,23 +2380,80 @@ V volt - + + mAh + milliampere hour + 50 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + Land + RTL + SmartRTL or RTL + SmartRTL or Land + Terminate + + + + + None + Land + RTL + SmartRTL or RTL + SmartRTL or Land + Terminate + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -2729,9 +2465,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -2741,92 +2477,13 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - Land - RTL - SmartRTL or RTL - SmartRTL or Land - Terminate - Auto DO_LAND_START or RTL - - - - - None - Land - RTL - SmartRTL or RTL - SmartRTL or Land - Terminate - Auto DO_LAND_START or RTL - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - Navigator Pixhawk2_PM2/CubeOrange_PM2 CubeOrange Durandal @@ -2838,7 +2495,7 @@ Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - CubeOrange_PM2/Navigator + CubeOrange_PM2 Pixhawk2_PM2 CubeOrange Durandal @@ -2856,23 +2513,80 @@ V volt - + + mAh + milliampere hour + 50 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + Land + RTL + SmartRTL or RTL + SmartRTL or Land + Terminate + + + + + None + Land + RTL + SmartRTL or RTL + SmartRTL or Land + Terminate + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -2884,9 +2598,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -2896,92 +2610,13 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - Land - RTL - SmartRTL or RTL - SmartRTL or Land - Terminate - Auto DO_LAND_START or RTL - - - - - None - Land - RTL - SmartRTL or RTL - SmartRTL or Land - Terminate - Auto DO_LAND_START or RTL - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - Navigator Pixhawk2_PM2/CubeOrange_PM2 CubeOrange Durandal @@ -2993,7 +2628,7 @@ Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - CubeOrange_PM2/Navigator + CubeOrange_PM2 Pixhawk2_PM2 CubeOrange Durandal @@ -3011,23 +2646,80 @@ V volt - + + mAh + milliampere hour + 50 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + Land + RTL + SmartRTL or RTL + SmartRTL or Land + Terminate + + + + + None + Land + RTL + SmartRTL or RTL + SmartRTL or Land + Terminate + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -3039,9 +2731,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -3051,92 +2743,13 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - Land - RTL - SmartRTL or RTL - SmartRTL or Land - Terminate - Auto DO_LAND_START or RTL - - - - - None - Land - RTL - SmartRTL or RTL - SmartRTL or Land - Terminate - Auto DO_LAND_START or RTL - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - Navigator Pixhawk2_PM2/CubeOrange_PM2 CubeOrange Durandal @@ -3148,7 +2761,7 @@ Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - CubeOrange_PM2/Navigator + CubeOrange_PM2 Pixhawk2_PM2 CubeOrange Durandal @@ -3166,23 +2779,80 @@ V volt - + + mAh + milliampere hour + 50 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + Land + RTL + SmartRTL or RTL + SmartRTL or Land + Terminate + + + + + None + Land + RTL + SmartRTL or RTL + SmartRTL or Land + Terminate + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -3194,9 +2864,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -3206,92 +2876,13 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - Land - RTL - SmartRTL or RTL - SmartRTL or Land - Terminate - Auto DO_LAND_START or RTL - - - - - None - Land - RTL - SmartRTL or RTL - SmartRTL or Land - Terminate - Auto DO_LAND_START or RTL - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - Navigator Pixhawk2_PM2/CubeOrange_PM2 CubeOrange Durandal @@ -3303,7 +2894,7 @@ Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - CubeOrange_PM2/Navigator + CubeOrange_PM2 Pixhawk2_PM2 CubeOrange Durandal @@ -3321,23 +2912,80 @@ V volt - + + mAh + milliampere hour + 50 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + Land + RTL + SmartRTL or RTL + SmartRTL or Land + Terminate + + + + + None + Land + RTL + SmartRTL or RTL + SmartRTL or Land + Terminate + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -3351,32 +2999,46 @@ - -90 90 - 0.000001 deg degrees + 0.000001 + -90 90 - -180 180 - 0.000001 deg degrees + 0.000001 + -180 180 - 0 10000 - 1 m meters + 1 + 0 10000 - -180 +180 - 1 deg degrees + 1 + -180 +180 - + + + No PWMs + One PWMs + Two PWMs + Three PWMs + Four PWMs + Five PWMs + Six PWMs + Seven PWMs + Eight PWMs + + True + + Disabled Enabled @@ -3384,7 +3046,7 @@ True - + Disabled Enabled @@ -3443,7 +3105,7 @@ 0:Output1,1:Output2,2:Output3,3:Output4,4:Output5,5:Output6,6:Output7,7:Output8,8:Output9,9:Output10,10:Output11,11:Output12,12:Output13,13:Output14 True - + -1 80 degC degrees Celsius @@ -3487,16 +3149,16 @@ 0:ActiveForSafetyEnable,1:ActiveForSafetyDisable,2:ActiveWhenArmed,3:Force safety on when the aircraft disarms + V + volt 4.0 5.5 0.1 - V - volt - 3.3 12.0 - 0.1 V volt + 3.3 12.0 + 0.1 0 32 @@ -3509,22 +3171,22 @@ - 0:Enable hardware watchdog, 1:Disable MAVftp, 2:Enable set of internal parameters, 3:Enable Debug Pins, 4:Unlock flash on reboot, 5:Write protect firmware flash on reboot, 6:Write protect bootloader flash on reboot + 0:Enable hardware watchdog, 1:Disable MAVftp, 2:Enable set of internal parameters 0 10000 ms milliseconds - + 1 500 1 - + 0 1 0.1 - + 0 100 1 @@ -3533,11 +3195,6 @@ 1 True - - 0 20 - degC - degrees Celsius - @@ -3740,7 +3397,7 @@ ADSB Avoidance En PrecLoiter Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL InvertedFlight RC Override Enable @@ -3756,8 +3413,8 @@ ZigZag SaveWP Compass Learn GPS Disable - Relay5 On/Off - Relay6 On/Off + Relay5 + Relay6 Stabilize PosHold AltHold @@ -3768,25 +3425,16 @@ Standby Mode RunCam Control RunCam OSD Control - VisOdom Align + Viso Align Disarm ZigZag Auto Air Mode Generator EKF Pos Source - VTX Power - AUTO RTL KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Turtle - simple heading reset - ArmDisarm (4.2 and higher) - ArmDisarm with AirMode (4.2 and higher) - Optflow Calibration - Force Flying - Turbine Start(heli) Scripting1 Scripting2 Scripting3 @@ -3835,7 +3483,7 @@ ADSB Avoidance En PrecLoiter Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL InvertedFlight RC Override Enable @@ -3851,8 +3499,8 @@ ZigZag SaveWP Compass Learn GPS Disable - Relay5 On/Off - Relay6 On/Off + Relay5 + Relay6 Stabilize PosHold AltHold @@ -3863,25 +3511,16 @@ Standby Mode RunCam Control RunCam OSD Control - VisOdom Align + Viso Align Disarm ZigZag Auto Air Mode Generator EKF Pos Source - VTX Power - AUTO RTL KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Turtle - simple heading reset - ArmDisarm (4.2 and higher) - ArmDisarm with AirMode (4.2 and higher) - Optflow Calibration - Force Flying - Turbine Start(heli) Scripting1 Scripting2 Scripting3 @@ -3930,7 +3569,7 @@ ADSB Avoidance En PrecLoiter Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL InvertedFlight RC Override Enable @@ -3946,8 +3585,8 @@ ZigZag SaveWP Compass Learn GPS Disable - Relay5 On/Off - Relay6 On/Off + Relay5 + Relay6 Stabilize PosHold AltHold @@ -3958,25 +3597,16 @@ Standby Mode RunCam Control RunCam OSD Control - VisOdom Align + Viso Align Disarm ZigZag Auto Air Mode Generator EKF Pos Source - VTX Power - AUTO RTL KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Turtle - simple heading reset - ArmDisarm (4.2 and higher) - ArmDisarm with AirMode (4.2 and higher) - Optflow Calibration - Force Flying - Turbine Start(heli) Scripting1 Scripting2 Scripting3 @@ -4025,7 +3655,7 @@ ADSB Avoidance En PrecLoiter Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL InvertedFlight RC Override Enable @@ -4041,8 +3671,8 @@ ZigZag SaveWP Compass Learn GPS Disable - Relay5 On/Off - Relay6 On/Off + Relay5 + Relay6 Stabilize PosHold AltHold @@ -4053,25 +3683,16 @@ Standby Mode RunCam Control RunCam OSD Control - VisOdom Align + Viso Align Disarm ZigZag Auto Air Mode Generator EKF Pos Source - VTX Power - AUTO RTL KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Turtle - simple heading reset - ArmDisarm (4.2 and higher) - ArmDisarm with AirMode (4.2 and higher) - Optflow Calibration - Force Flying - Turbine Start(heli) Scripting1 Scripting2 Scripting3 @@ -4092,24 +3713,24 @@ - 0 50 ds deciseconds + 0 50 - 1000 2000 PWM PWM in microseconds + 1000 2000 - 1000 2000 PWM PWM in microseconds + 1000 2000 - 0 1000 m meters + 0 1000 @@ -4118,14 +3739,14 @@ - 0 10000 ms milliseconds + 0 10000 - 0 180 deg degrees + 0 180 @@ -4197,15 +3818,12 @@ Disabled - DroneCAN + UAVCAN ToshibaCAN PiccoloCAN CANTester - EFI_NWPMU - USD1 KDECAN - Scripting - Benewake + PacketDigitalCAN True @@ -4219,17 +3837,17 @@ 0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 - 1 500 Hz hertz + 1 500 0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15, 15: Servo 16 - 1 500 Hz hertz + 1 500 @@ -4254,10 +3872,10 @@ 1 250 - + 0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 - + 0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 @@ -4265,34 +3883,17 @@ Hz hertz - - 0:ClearDNADatabase,1:IgnoreDNANodeConflicts - - - 1 200 - Hz - hertz - - - 0 18 - - - 1024 16384 - Disabled - DroneCAN + UAVCAN ToshibaCAN PiccoloCAN CANTester - EFI_NWPMU - USD1 KDECAN - Scripting - Benewake + PacketDigitalCAN True @@ -4306,17 +3907,17 @@ 0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 - 1 500 Hz hertz + 1 500 0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15, 15: Servo 16 - 1 500 Hz hertz + 1 500 @@ -4341,10 +3942,10 @@ 1 250 - + 0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 - + 0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 @@ -4352,34 +3953,17 @@ Hz hertz - - 0:ClearDNADatabase,1:IgnoreDNANodeConflicts - - - 1 200 - Hz - hertz - - - 0 18 - - - 1024 16384 - Disabled - DroneCAN + UAVCAN ToshibaCAN PiccoloCAN CANTester - EFI_NWPMU - USD1 KDECAN - Scripting - Benewake + PacketDigitalCAN True @@ -4393,17 +3977,17 @@ 0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 - 1 500 Hz hertz + 1 500 0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15, 15: Servo 16 - 1 500 Hz hertz + 1 500 @@ -4428,10 +4012,10 @@ 1 250 - + 0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 - + 0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 @@ -4439,20 +4023,6 @@ Hz hertz - - 0:ClearDNADatabase,1:IgnoreDNANodeConflicts - - - 1 200 - Hz - hertz - - - 0 18 - - - 1024 16384 - @@ -4460,7 +4030,6 @@ Disabled First driver Second driver - Third driver True @@ -4474,7 +4043,6 @@ Disabled First driver Second driver - Third driver True @@ -4488,7 +4056,6 @@ Disabled First driver Second driver - Third driver True @@ -4542,50 +4109,47 @@ 1000 2000 - 1 PWM PWM in microseconds + 1 1000 2000 - 1 PWM PWM in microseconds + 1 0 32000 - 1 m meters + 1 0 5000 - 1 ms milliseconds + 1 0 15 - 1 m/s meters per second - - - 0:hold open forever after release + 1 - 0 200000 - 100 cm centimeters + 0 200000 + 100 - -90 90 - 1 deg/s degrees per second + -90 90 + 1 0:manual control, 1:face direction of travel, 2:Start at center rather than on perimeter @@ -4593,30 +4157,30 @@ - 1 -400 400 - 1 mGauss milligauss + 1 + 1 - 1 -400 400 - 1 mGauss milligauss + 1 + 1 -400 400 - 1 mGauss milligauss + 1 -3.142 3.142 - 0.01 rad radians + 0.01 @@ -4639,34 +4203,34 @@ - 1 Disabled Use Throttle Use Current + 1 - 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 + 1 - 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 + 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 - + None Yaw45 @@ -4677,44 +4241,42 @@ Yaw270 Yaw315 Roll180 - Yaw45Roll180 - Yaw90Roll180 - Yaw135Roll180 + Roll180Yaw45 + Roll180Yaw90 + Roll180Yaw135 Pitch180 - Yaw225Roll180 - Yaw270Roll180 - Yaw315Roll180 + Roll180Yaw225 + Roll180Yaw270 + Roll180Yaw315 Roll90 - Yaw45Roll90 - Yaw90Roll90 - Yaw135Roll90 + Roll90Yaw45 + Roll90Yaw90 + Roll90Yaw135 Roll270 - Yaw45Roll270 - Yaw90Roll270 - Yaw135Roll270 + Roll270Yaw45 + Roll270Yaw90 + Roll270Yaw135 Pitch90 Pitch270 - Yaw90Pitch180 - Yaw270Pitch180 - Pitch90Roll90 - Pitch90Roll180 - Pitch90Roll270 - Pitch180Roll90 - Pitch180Roll270 - Pitch270Roll90 - Pitch270Roll180 - Pitch270Roll270 - Yaw90Pitch180Roll90 - Yaw270Roll90 + Pitch180Yaw90 + Pitch180Yaw270 + Roll90Pitch90 + Roll180Pitch90 + Roll270Pitch90 + Roll90Pitch180 + Roll270Pitch180 + Roll90Pitch270 + Roll180Pitch270 + Roll270Pitch270 + Roll90Pitch180Yaw90 + Roll90Yaw270 Yaw293Pitch68Roll180 Pitch315 - Pitch315Roll90 - Roll45 - Roll315 + Roll90Pitch315 Custom - + Internal External @@ -4722,84 +4284,84 @@ - 1 -400 400 - 1 mGauss milligauss + 1 + 1 - 1 -400 400 - 1 mGauss milligauss + 1 + 1 -400 400 - 1 mGauss milligauss + 1 - 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 + 1 - 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 + 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 - 1 -400 400 - 1 mGauss milligauss + 1 + 1 - 1 -400 400 - 1 mGauss milligauss + 1 + 1 -400 400 - 1 mGauss milligauss + 1 - 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 + 1 - 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 + 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 True @@ -4859,12 +4421,10 @@ Yaw293Pitch68Roll180 Pitch315 Roll90Pitch315 - Roll45 - Roll315 Custom - + Internal External @@ -4920,12 +4480,10 @@ Yaw293Pitch68Roll180 Pitch315 Roll90Pitch315 - Roll45 - Roll315 Custom - + Internal External @@ -4995,20 +4553,19 @@ 1 - 0:HMC5883,1:LSM303D,2:AK8963,3:BMM150,4:LSM9DS1,5:LIS3MDL,6:AK09916,7:IST8310,8:ICM20948,9:MMC3416,11:DroneCAN,12:QMC5883,14:MAG3110,15:IST8308,16:RM3100,17:MSP,18:ExternalAHRS + 0:HMC5883,1:LSM303D,2:AK8963,3:BMM150,4:LSM9DS1,5:LIS3MDL,6:AK09916,7:IST8310,8:ICM20948,9:MMC3416,11:UAVCAN,12:QMC5883,14:MAG3110,15:IST8308,16:RM3100,17:MSP,18:ExternalAHRS - 0 100 - 1 % percent + 0 100 + 1 Disabled CheckOnly CheckAndFix - use same tolerance to auto rotate 45 deg rotations @@ -5025,7 +4582,6 @@ Disabled Enabled - True 0 1.3 @@ -5056,23 +4612,23 @@ -180 180 - 1 deg degrees + 1 True -180 180 - 1 deg degrees + 1 True -180 180 - 1 deg degrees + 1 True @@ -5112,46 +4668,11 @@ - - - - Disabled - Enabled - - - - - Disabled - Serial0 - Serial1 - Serial2 - Serial3 - Serial4 - Serial5 - Serial6 - - - - - Disabled - Driver1 - Driver2 - - - - 0:EnforceArming - - - m - meters - - None VectorNav - LORD @@ -5159,23 +4680,6 @@ hertz - - - - None - Serial-MS - NWPMU - Serial-Lutan - - True - - - 0 1 - - - 0 10 - - @@ -5204,7 +4708,7 @@ m/s meters per second - + 100 1000 25 @@ -5450,16 +4954,24 @@ 0.1 30.0 Hz hertz + False - + 0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF True - + 0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF True - + + 500 5000 + 100 + ms + milliseconds + True + + 1 10 1 True @@ -5485,7 +4997,7 @@ m/s meters per second - + 100 1000 25 @@ -5518,9 +5030,9 @@ 0 250 10 + True ms milliseconds - True 0.01 0.5 @@ -5583,9 +5095,9 @@ 0 250 10 + True ms milliseconds - True 0.0001 0.1 @@ -5610,13 +5122,13 @@ meters per cubic second - 0.01 2.0 + 0.01 1.0 0.1 m/s/s meters per square second - 0.0 2.0 + 0.0 1.0 0.1 @@ -5666,7 +5178,7 @@ Gauss/s gauss per second - + -1 70 1 % @@ -5689,9 +5201,9 @@ 0 250 10 + True ms milliseconds - True 2.0 6.0 @@ -5743,21 +5255,29 @@ 0.1 30.0 Hz hertz + False 0 500 mGauss milligauss - + 0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF True - + 0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF True - + + 500 5000 + 100 + ms + milliseconds + True + + 1 10 1 True @@ -5800,10 +5320,6 @@ 0.0 10.0 0.5 - - 0 2 - 1 - @@ -5969,29 +5485,29 @@ + m + meters 10 1000 1 - m - meters - 30 10000 m meters + 30 10000 - 1 10 m meters + 1 10 1 20 - -100 100 - 1 m meters + -100 100 + 1 @@ -6100,7 +5616,7 @@ Bebop CXOF MAVLink - DroneCAN + UAVCAN MSP UPFLOW @@ -6115,28 +5631,28 @@ 1 - -17999 +18000 - 10 cdeg centidegrees + -17999 +18000 + 10 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 0 127 @@ -6153,9 +5669,9 @@ 0 255 - 1 1000 m meters + 1 1000 @@ -6165,21 +5681,21 @@ -100 100 - 1 m meters + 1 -100 100 - 1 m meters + 1 -100 100 - 1 m meters + 1 @@ -6302,9 +5818,6 @@ 27 - - 0:EnableAirspeedAndGroundspeed - @@ -6323,11 +5836,13 @@ None AUTO uBlox + MTK + MTK19 NMEA SiRF HIL SwiftNav - DroneCAN + UAVCAN SBF GSOF ERB @@ -6339,8 +5854,6 @@ MSP AllyStar ExternalAHRS - DroneCAN-MovingBaseline-Base - DroneCAN-MovingBaseline-Rover True @@ -6349,11 +5862,13 @@ None AUTO uBlox + MTK + MTK19 NMEA SiRF HIL SwiftNav - DroneCAN + UAVCAN SBF GSOF ERB @@ -6365,8 +5880,6 @@ MSP AllyStar ExternalAHRS - DroneCAN-MovingBaseline-Base - DroneCAN-MovingBaseline-Rover True @@ -6449,88 +5962,87 @@ Disables automatic configuration - Enable automatic configuration for Serial GPSes only - Enable automatic configuration for DroneCAN as well + Enable automatic configuration - 50 200 + ms + milliseconds 10Hz 8Hz 5Hz - ms - milliseconds + 50 200 - 50 200 + ms + milliseconds 10Hz 8Hz 5Hz - ms - milliseconds + 50 200 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - 0 250 ms milliseconds + 0 250 True - 0 250 ms milliseconds + 0 250 True 0:Horiz Pos,1:Vert Pos,2:Speed - 5.0 30.0 s seconds + 5.0 30.0 - 0:Use UART2 for moving baseline on ublox,1:Use base station for GPS yaw on SBF,2:Use baudrate 115200,3:Use dedicated CAN port b/w GPSes for moving baseline + 0:Use UART2 for moving baseline on ublox,1:Use base station for GPS yaw on SBF 0 10 @@ -6543,11 +6055,11 @@ True + 1 FirstGPS SecondGPS - 1 True @@ -6555,9 +6067,9 @@ True - + - + @@ -6569,22 +6081,22 @@ True - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -6596,22 +6108,22 @@ True - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -6648,7 +6160,7 @@ s seconds - + 0 255 @@ -6665,9 +6177,9 @@ 0 1000 - 1 PWM PWM in microseconds + 1 -10 10 @@ -6681,15 +6193,15 @@ 0 100 - 1 % percent + 1 0 1000 - 1 PWM PWM in microseconds + 1 @@ -6736,9 +6248,9 @@ -30 30 - 1 deg degrees + 1 @@ -6760,15 +6272,21 @@ 1000 2000 - 1 PWM PWM in microseconds + 1 1000 2000 - 1 PWM PWM in microseconds + 1 + + + 1000 2000 + PWM + PWM in microseconds + 1 @@ -6815,9 +6333,9 @@ -30 30 - 1 deg degrees + 1 @@ -6864,9 +6382,9 @@ -30 30 - 1 deg degrees + 1 -0.2 0.2 @@ -6878,22 +6396,28 @@ 1000 2000 - 1 PWM PWM in microseconds + 1 1000 2000 - 1 PWM PWM in microseconds + 1 + + + 1000 2000 + PWM + PWM in microseconds + 1 Disabled Passthrough Max collective - Zero thrust collective + Mid collective Min collective @@ -6905,7 +6429,7 @@ 0 10 1 - + 0.3 0.8 @@ -6918,44 +6442,20 @@ 0:Use Leaky I - - -20 0 - 0.1 - deg - degrees - - - 5 20 - 0.1 - deg - degrees - - - -5 0 - 0.1 - deg - degrees - - - -5 0 - 0.1 - deg - degrees - 0 100 - 1 % percent + 1 - + RC Passthrough External Gov SetPoint Throttle Curve - AutoThrottle + Governor @@ -6963,22 +6463,22 @@ s seconds - + 0 60 s seconds 0 100 - 1 % percent + 1 0 50 - 1 % percent + 1 0 500 @@ -6986,81 +6486,69 @@ 0 100 - 1 % percent + 1 0 100 - 1 % percent + 1 0 100 - 1 % percent + 1 0 100 - 1 % percent + 1 0 100 - 1 % percent + 1 + + + 800 3500 + RPM + Revolutions Per Minute + 10 + + + 0 50 + % + percent + 1 + + + 0 150 + % + percent + 1 + + + 50 100 + % + percent + 1 50 200 - 10 RPM Revolutions Per Minute + 10 0 40 + % + percent 1 - % - percent - - - 0 120 - 1 - s - seconds - - - 0 70 - 0.1 - % - percent - - - 0 100 - 0.1 - % - percent - - - 0 100 - 0.1 - % - percent - - - 800 3500 - 10 - RPM - Revolutions Per Minute - - - 10 60 - 1 - % - percent @@ -7076,174 +6564,174 @@ 0 100 - 1 % percent + 1 0 100 - 1 % percent + 1 0 100 - 1 % percent + 1 0 100 - 1 % percent + 1 - 1 rad/s radians per second + 1 - 1 rad/s radians per second + 1 - 1 rad/s radians per second + 1 - 1 rad/s radians per second + 1 - 1 rad/s radians per second + 1 - 1 rad/s radians per second + 1 - 1 rad/s radians per second + 1 - 1 rad/s radians per second + 1 - 1 rad/s radians per second + 1 - 1 0.8 1.2 + 1 - 1 0.8 1.2 + 1 - 1 0.8 1.2 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 1 0.8 1.2 + 1 - 1 0.8 1.2 + 1 - 1 0.8 1.2 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 1 0.8 1.2 + 1 - 1 0.8 1.2 + 1 - 1 0.8 1.2 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 0 256 Hz hertz + 0 256 - 0 256 Hz hertz + 0 256 @@ -7287,57 +6775,57 @@ - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -10 10 m meters + -10 10 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 True @@ -7361,7 +6849,7 @@ 0:FirstIMU,1:SecondIMU,2:ThirdIMU - 0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU,6:SeventhIMU + 0:FirstIMU,1:SecondIMU,2:ThirdIMU @@ -7373,85 +6861,39 @@ True - 1 degC degrees Celsius + 1 - 1 degC degrees Celsius + 1 - 1 degC degrees Celsius + 1 - 1 degC degrees Celsius + 1 - 1 degC degrees Celsius + 1 - 1 degC degrees Celsius + 1 0:PersistParams - - - - Disabled - Enabled - - - - 10 495 - Hz - hertz - - - 5 250 - Hz - hertz - - - 5 50 - dB - decibel - - - 0:1st harmonic,1:2nd harmonic,2:3rd harmonic,3:4th hamronic,4:5th harmonic,5:6th harmonic,6:7th harmonic,7:8th harmonic - True - - - 0.0 1.0 - True - - - 0 4 - - Disabled - Throttle - RPM Sensor - ESC Telemetry - Dynamic FFT - Second RPM Sensor - - - - 0:Double notch,1:Dynamic harmonic,2:Update at loop rate - True - - @@ -7474,7 +6916,7 @@ dB decibel - + 0:1st harmonic,1:2nd harmonic,2:3rd harmonic,3:4th hamronic,4:5th harmonic,5:6th harmonic,6:7th harmonic,7:8th harmonic True @@ -7490,7 +6932,6 @@ RPM Sensor ESC Telemetry Dynamic FFT - Second RPM Sensor @@ -7511,14 +6952,37 @@ 0:Sensor-Rate Logging (sample at full sensor rate seen by AP), 1: Sample post-filtering - 10 ms milliseconds + 10 1 + + + + Disabled + Enabled + + + + 5 30 + dB + decibel + + + 10 400 + Hz + hertz + + + 5 100 + Hz + hertz + + @@ -7529,16 +6993,16 @@ True - 1 -70 80 degC degrees Celsius + 1 - 1 -70 80 degC degrees Celsius + 1 1 @@ -7605,16 +7069,16 @@ True - 1 -70 80 degC degrees Celsius + 1 - 1 -70 80 degC degrees Celsius + 1 1 @@ -7681,16 +7145,16 @@ True - 1 -70 80 degC degrees Celsius + 1 - 1 -70 80 degC degrees Celsius + 1 1 @@ -7748,12 +7212,6 @@ - - - Disabled - Enabled - - WaitForPilotInput @@ -7798,16 +7256,16 @@ - 0 1000 - 1 m meters + 0 1000 + 1 - 0 1000 - 1 m meters + 0 1000 + 1 0:Retract after Takeoff,1:Deploy during Land @@ -7846,69 +7304,54 @@ seconds - 10 1000 MB megabyte - - - 0 1000 - Hz - hertz - - - 0 1000 - Hz - hertz - - - 0 1000 - Hz - hertz + 10 1000 - - 0 45 - 1 + deg degrees + 0 45 + 1 - 20 3500 - 50 cm/s centimeters per second + 20 3500 + 50 + cm/s/s + centimeters per square second 100 981 1 - cm/s/s - centimeters per square second - 25 250 - 1 cm/s/s centimeters per square second + 25 250 + 1 - 500 5000 - 1 cm/s/s/s centimeters per cubic second + 500 5000 + 1 - 0 2 - 0.1 s seconds + 0 2 + 0.1 - True 0 32766 1 + True @@ -7942,40 +7385,40 @@ - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 @@ -8009,16 +7452,16 @@ - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 @@ -8034,16 +7477,16 @@ - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 @@ -8059,32 +7502,32 @@ - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 0 100 1 - 0.0 0.2 - .005 s seconds + 0.0 0.2 + .005 - 0.0 0.2 - .005 s seconds + 0.0 0.2 + .005 @@ -8096,40 +7539,40 @@ - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 @@ -8163,16 +7606,16 @@ - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 @@ -8188,16 +7631,16 @@ - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 @@ -8213,28 +7656,28 @@ - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 - 0.0 0.2 - .005 s seconds + 0.0 0.2 + .005 - 0.0 0.2 - .005 s seconds + 0.0 0.2 + .005 @@ -8257,11 +7700,7 @@ -1.0 1.0 - - Low - Default - High - + 0.9:Low,0.95:Default,1.0:High 6 53 @@ -8288,33 +7727,24 @@ DShot300 DShot600 DShot1200 - PWMRange True - - 0 2000 + PWM PWM in microseconds + 0 2000 - - 0 2000 + PWM PWM in microseconds + 0 2000 - - Low - Default - High - + 0.0:Low,0.15:Default,0.3:High - - Low - Default - High - + 0.0:Low,0.1:Default,0.2:High 0 10 @@ -8339,15 +7769,15 @@ 5 80 - 1 deg degrees + 1 0 2 - 0.1 s seconds + 0.1 0 5 @@ -8361,21 +7791,21 @@ 0 .5 - 0.001 s seconds + 0.001 0 .5 - 0.001 s seconds + 0.001 0 5 - 0.001 s seconds + 0.001 @@ -8399,7 +7829,7 @@ - 0:EnableTelemetryMode, 1: DisableDJIWorkarounds, 2:EnableBTFLFonts + 0:EnableTelemetryMode @@ -8412,7 +7842,7 @@ - 0:Built-in buzzer, 1:DShot, 2:DroneCAN + 0:Built-in buzzer, 1:DShot, 2:UAVCAN @@ -8443,7 +7873,7 @@ - 0:Built-in LED, 1:Internal ToshibaLED, 2:External ToshibaLED, 3:External PCA9685, 4:Oreo LED, 5:DroneCAN, 6:NCP5623 External, 7:NCP5623 Internal, 8:NeoPixel, 9:ProfiLED, 10:Scripting, 11:DShot, 12:ProfiLED_SPI + 0:Built-in LED, 1:Internal ToshibaLED, 2:External ToshibaLED, 3:External PCA9685, 4:Oreo LED, 5:UAVCAN, 6:NCP5623 External, 7:NCP5623 Internal, 8:NeoPixel, 9:ProfiLED, 10:Scripting, 11:DShot @@ -8471,21 +7901,18 @@ - 0.1 100 - 1 m meters - - - 1: log Dijkstra points + 0.1 100 + 1 - 1 100 - 1 m meters + 1 100 + 1 1.1 2 @@ -8508,10 +7935,10 @@ True - 0 127 - 1 s seconds + 0 127 + 1 1 200 @@ -8526,25 +7953,25 @@ - 1 10 deg degrees + 1 10 True - 0 10 m meters + 0 10 - 0 10 m meters + 0 10 - 0 4 m meters + 0 4 @@ -8583,7 +8010,7 @@ - 0:UseDecimalPack, 1:InvertedWindPointer, 2:InvertedAHRoll, 3:Convert feet to miles at 5280ft instead of 10000ft, 4:DisableCrosshair + 0:UseDecimalPack, 1:InvertedWindPointer, 2:InvertedAHRoll True @@ -8860,40 +8287,40 @@ 0 15 - + Disabled Enabled - + 0 29 - + 0 15 - + Disabled Enabled - + 0 29 - + 0 15 - + Disabled Enabled - + 0 29 - + 0 15 @@ -9136,16 +8563,16 @@ 0 15 - + Disabled Enabled - + 0 29 - + 0 15 @@ -9340,18 +8767,6 @@ 0 15 - - - Disabled - Enabled - - - - 0 29 - - - 0 15 - @@ -9570,40 +8985,40 @@ 0 15 - + Disabled Enabled - + 0 29 - + 0 15 - + Disabled Enabled - + 0 29 - + 0 15 - + Disabled Enabled - + 0 29 - + 0 15 @@ -9846,16 +9261,16 @@ 0 15 - + Disabled Enabled - + 0 29 - + 0 15 @@ -10050,18 +9465,6 @@ 0 15 - - - Disabled - Enabled - - - - 0 29 - - - 0 15 - @@ -10280,40 +9683,40 @@ 0 15 - + Disabled Enabled - + 0 29 - + 0 15 - + Disabled Enabled - + 0 29 - + 0 15 - + Disabled Enabled - + 0 29 - + 0 15 @@ -10556,16 +9959,16 @@ 0 15 - + Disabled Enabled - + 0 29 - + 0 15 @@ -10760,18 +10163,6 @@ 0 15 - - - Disabled - Enabled - - - - 0 29 - - - 0 15 - @@ -10990,40 +10381,40 @@ 0 15 - + Disabled Enabled - + 0 29 - + 0 15 - + Disabled Enabled - + 0 29 - + 0 15 - + Disabled Enabled - + 0 29 - + 0 15 @@ -11266,16 +10657,16 @@ 0 15 - + Disabled Enabled - + 0 29 - + 0 15 @@ -11470,18 +10861,6 @@ 0 15 - - - Disabled - Enabled - - - - 0 29 - - - 0 15 - @@ -12071,22 +11450,22 @@ 0.5 5 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -12102,52 +11481,13 @@ seconds True - - 0 10 - m - meters - - - - Land Vertically (Not strict) - Retry Landing(Normal Strictness) - Do not land (just Hover) (Very Strict) - - - - 0 10 - 1 - - - 0 20 - s - seconds - - - - Go to the last location where landing target was detected - Go towards the approximate location of the detected landing target - - - - 0 5 - m - meters - - - 0 50 - m - meters - - - 0: Moving Landing Target - None LightwareSF40c + LightWareSF40C-legacy MAVLink TeraRangerTower RangeFinder @@ -12156,7 +11496,6 @@ LightwareSF45B SITL AirSimSITL - CygbotD1 True @@ -12167,69 +11506,69 @@ - -180 180 deg degrees + -180 180 - 0 360 deg degrees + 0 360 - 0 127 deg degrees + 0 127 - 0 360 deg degrees + 0 360 - 0 127 deg degrees + 0 127 - 0 360 deg degrees + 0 360 - 0 127 deg degrees + 0 127 - 0 360 deg degrees + 0 360 - 0 127 deg degrees + 0 127 - 0 360 deg degrees + 0 360 - 0 127 deg degrees + 0 127 - 0 360 deg degrees + 0 360 - 0 127 deg degrees + 0 127 @@ -12244,27 +11583,17 @@ - 0 20 Hz hertz - - - 0 500 - m - meters - - - 0 500 - m - meters + 0 20 - 0.5 5 - 0.1 Hz hertz + 0.5 5 + 0.1 1.000 3.000 @@ -12359,12 +11688,12 @@ cm/s/s centimeters per square second - + 0 100 Hz hertz - + 0 100 Hz hertz @@ -12374,31 +11703,31 @@ 0.01 - 0 45 - 1 deg degrees - - - 1 20 + 0 45 1 - m/s/s/s - meters per cubic second - - 5 50 - 1 - m/s/s/s - meters per cubic second + + s + seconds + 0.25 2 + 0.01 + + + s + seconds + 0.1 1 + 0.01 - 0.1 km kilometers + 0.1 @@ -12414,30 +11743,30 @@ seconds - 0:Ignore RC Receiver, 1:Ignore MAVLink Overrides, 2:Ignore Receiver Failsafe bit but allow other RC failsafes if setup, 3:FPort Pad, 4:Log RC input bytes, 5:Arming check throttle for 0 input, 6:Skip the arming check for neutral Roll/Pitch/Yaw sticks, 7:Allow Switch reverse, 8:Use passthrough for CRSF telemetry, 9:Suppress CRSF mode/rate message for ELRS systems,10:Enable multiple receiver support, 11:CRSF RSSI shows Link Quality + 0:Ignore RC Receiver, 1:Ignore MAVLink Overrides, 2:Ignore Receiver Failsafe bit but allow other RC failsafes if setup, 3:FPort Pad, 4:Log RC input bytes, 5:Arming check throttle for 0 input, 6:Skip the arming check for neutral Roll/Pitch/Yay sticks, 7:Allow Switch reverse, 8:Use passthrough for CRSF telemetry - 0:All,1:PPM,2:IBUS,3:SBUS,4:SBUS_NI,5:DSM,6:SUMD,7:SRXL,8:SRXL2,9:CRSF,10:ST24,11:FPORT,12:FPORT2,13:FastSBUS + 0:All,1:PPM,2:IBUS,3:SBUS,4:SBUS_NI,5:DSM,6:SUMD,7:SRXL,8:SRXL2,9:CRSF,10:ST24,11:FPORT,12:FPORT2 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -12446,9 +11775,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -12488,7 +11817,7 @@ ADSB Avoidance En PrecLoiter Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL InvertedFlight RC Override Enable @@ -12516,25 +11845,17 @@ Standby Mode RunCam Control RunCam OSD Control - VisOdom Align + Viso Align Disarm ZigZag Auto Air Mode Generator EKF Pos Source VTX Power - AUTO RTL KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Turtle - simple heading reset - ArmDisarm (4.2 and higher) - ArmDisarm with AirMode (4.2 and higher) - Optflow Calibration - Force Flying - Turbine Start(heli) Scripting1 Scripting2 Scripting3 @@ -12548,22 +11869,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -12572,9 +11893,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -12614,7 +11935,7 @@ ADSB Avoidance En PrecLoiter Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL InvertedFlight RC Override Enable @@ -12642,25 +11963,17 @@ Standby Mode RunCam Control RunCam OSD Control - VisOdom Align + Viso Align Disarm ZigZag Auto Air Mode Generator EKF Pos Source VTX Power - AUTO RTL KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Turtle - simple heading reset - ArmDisarm (4.2 and higher) - ArmDisarm with AirMode (4.2 and higher) - Optflow Calibration - Force Flying - Turbine Start(heli) Scripting1 Scripting2 Scripting3 @@ -12674,22 +11987,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -12698,9 +12011,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -12740,7 +12053,7 @@ ADSB Avoidance En PrecLoiter Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL InvertedFlight RC Override Enable @@ -12768,25 +12081,17 @@ Standby Mode RunCam Control RunCam OSD Control - VisOdom Align + Viso Align Disarm ZigZag Auto Air Mode Generator EKF Pos Source VTX Power - AUTO RTL KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Turtle - simple heading reset - ArmDisarm (4.2 and higher) - ArmDisarm with AirMode (4.2 and higher) - Optflow Calibration - Force Flying - Turbine Start(heli) Scripting1 Scripting2 Scripting3 @@ -12800,22 +12105,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -12824,9 +12129,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -12866,7 +12171,7 @@ ADSB Avoidance En PrecLoiter Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL InvertedFlight RC Override Enable @@ -12894,25 +12199,17 @@ Standby Mode RunCam Control RunCam OSD Control - VisOdom Align + Viso Align Disarm ZigZag Auto Air Mode Generator EKF Pos Source VTX Power - AUTO RTL KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Turtle - simple heading reset - ArmDisarm (4.2 and higher) - ArmDisarm with AirMode (4.2 and higher) - Optflow Calibration - Force Flying - Turbine Start(heli) Scripting1 Scripting2 Scripting3 @@ -12926,22 +12223,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -12950,9 +12247,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -12992,7 +12289,7 @@ ADSB Avoidance En PrecLoiter Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL InvertedFlight RC Override Enable @@ -13020,25 +12317,17 @@ Standby Mode RunCam Control RunCam OSD Control - VisOdom Align + Viso Align Disarm ZigZag Auto Air Mode Generator EKF Pos Source VTX Power - AUTO RTL KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Turtle - simple heading reset - ArmDisarm (4.2 and higher) - ArmDisarm with AirMode (4.2 and higher) - Optflow Calibration - Force Flying - Turbine Start(heli) Scripting1 Scripting2 Scripting3 @@ -13052,22 +12341,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -13076,9 +12365,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -13118,7 +12407,7 @@ ADSB Avoidance En PrecLoiter Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL InvertedFlight RC Override Enable @@ -13146,25 +12435,17 @@ Standby Mode RunCam Control RunCam OSD Control - VisOdom Align + Viso Align Disarm ZigZag Auto Air Mode Generator EKF Pos Source VTX Power - AUTO RTL KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Turtle - simple heading reset - ArmDisarm (4.2 and higher) - ArmDisarm with AirMode (4.2 and higher) - Optflow Calibration - Force Flying - Turbine Start(heli) Scripting1 Scripting2 Scripting3 @@ -13178,22 +12459,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -13202,9 +12483,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -13244,7 +12525,7 @@ ADSB Avoidance En PrecLoiter Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL InvertedFlight RC Override Enable @@ -13272,25 +12553,17 @@ Standby Mode RunCam Control RunCam OSD Control - VisOdom Align + Viso Align Disarm ZigZag Auto Air Mode Generator EKF Pos Source VTX Power - AUTO RTL KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Turtle - simple heading reset - ArmDisarm (4.2 and higher) - ArmDisarm with AirMode (4.2 and higher) - Optflow Calibration - Force Flying - Turbine Start(heli) Scripting1 Scripting2 Scripting3 @@ -13304,22 +12577,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -13328,9 +12601,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -13370,7 +12643,7 @@ ADSB Avoidance En PrecLoiter Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL InvertedFlight RC Override Enable @@ -13398,25 +12671,17 @@ Standby Mode RunCam Control RunCam OSD Control - VisOdom Align + Viso Align Disarm ZigZag Auto Air Mode Generator EKF Pos Source VTX Power - AUTO RTL KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Turtle - simple heading reset - ArmDisarm (4.2 and higher) - ArmDisarm with AirMode (4.2 and higher) - Optflow Calibration - Force Flying - Turbine Start(heli) Scripting1 Scripting2 Scripting3 @@ -13430,22 +12695,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -13454,9 +12719,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -13496,7 +12761,7 @@ ADSB Avoidance En PrecLoiter Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL InvertedFlight RC Override Enable @@ -13524,25 +12789,17 @@ Standby Mode RunCam Control RunCam OSD Control - VisOdom Align + Viso Align Disarm ZigZag Auto Air Mode Generator EKF Pos Source VTX Power - AUTO RTL KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Turtle - simple heading reset - ArmDisarm (4.2 and higher) - ArmDisarm with AirMode (4.2 and higher) - Optflow Calibration - Force Flying - Turbine Start(heli) Scripting1 Scripting2 Scripting3 @@ -13556,22 +12813,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -13580,9 +12837,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -13622,7 +12879,7 @@ ADSB Avoidance En PrecLoiter Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL InvertedFlight RC Override Enable @@ -13650,25 +12907,17 @@ Standby Mode RunCam Control RunCam OSD Control - VisOdom Align + Viso Align Disarm ZigZag Auto Air Mode Generator EKF Pos Source VTX Power - AUTO RTL KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Turtle - simple heading reset - ArmDisarm (4.2 and higher) - ArmDisarm with AirMode (4.2 and higher) - Optflow Calibration - Force Flying - Turbine Start(heli) Scripting1 Scripting2 Scripting3 @@ -13682,22 +12931,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -13706,9 +12955,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -13748,7 +12997,7 @@ ADSB Avoidance En PrecLoiter Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL InvertedFlight RC Override Enable @@ -13776,25 +13025,17 @@ Standby Mode RunCam Control RunCam OSD Control - VisOdom Align + Viso Align Disarm ZigZag Auto Air Mode Generator EKF Pos Source VTX Power - AUTO RTL KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Turtle - simple heading reset - ArmDisarm (4.2 and higher) - ArmDisarm with AirMode (4.2 and higher) - Optflow Calibration - Force Flying - Turbine Start(heli) Scripting1 Scripting2 Scripting3 @@ -13808,22 +13049,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -13832,9 +13073,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -13874,7 +13115,7 @@ ADSB Avoidance En PrecLoiter Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL InvertedFlight RC Override Enable @@ -13902,25 +13143,17 @@ Standby Mode RunCam Control RunCam OSD Control - VisOdom Align + Viso Align Disarm ZigZag Auto Air Mode Generator EKF Pos Source VTX Power - AUTO RTL KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Turtle - simple heading reset - ArmDisarm (4.2 and higher) - ArmDisarm with AirMode (4.2 and higher) - Optflow Calibration - Force Flying - Turbine Start(heli) Scripting1 Scripting2 Scripting3 @@ -13934,22 +13167,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -13958,9 +13191,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -14000,7 +13233,7 @@ ADSB Avoidance En PrecLoiter Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL InvertedFlight RC Override Enable @@ -14028,25 +13261,17 @@ Standby Mode RunCam Control RunCam OSD Control - VisOdom Align + Viso Align Disarm ZigZag Auto Air Mode Generator EKF Pos Source VTX Power - AUTO RTL KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Turtle - simple heading reset - ArmDisarm (4.2 and higher) - ArmDisarm with AirMode (4.2 and higher) - Optflow Calibration - Force Flying - Turbine Start(heli) Scripting1 Scripting2 Scripting3 @@ -14060,22 +13285,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -14084,9 +13309,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -14126,7 +13351,7 @@ ADSB Avoidance En PrecLoiter Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL InvertedFlight RC Override Enable @@ -14154,25 +13379,17 @@ Standby Mode RunCam Control RunCam OSD Control - VisOdom Align + Viso Align Disarm ZigZag Auto Air Mode Generator EKF Pos Source VTX Power - AUTO RTL KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Turtle - simple heading reset - ArmDisarm (4.2 and higher) - ArmDisarm with AirMode (4.2 and higher) - Optflow Calibration - Force Flying - Turbine Start(heli) Scripting1 Scripting2 Scripting3 @@ -14186,22 +13403,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -14210,9 +13427,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -14252,7 +13469,7 @@ ADSB Avoidance En PrecLoiter Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL InvertedFlight RC Override Enable @@ -14280,25 +13497,17 @@ Standby Mode RunCam Control RunCam OSD Control - VisOdom Align + Viso Align Disarm ZigZag Auto Air Mode Generator EKF Pos Source VTX Power - AUTO RTL KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Turtle - simple heading reset - ArmDisarm (4.2 and higher) - ArmDisarm with AirMode (4.2 and higher) - Optflow Calibration - Force Flying - Turbine Start(heli) Scripting1 Scripting2 Scripting3 @@ -14312,22 +13521,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -14336,9 +13545,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -14378,7 +13587,7 @@ ADSB Avoidance En PrecLoiter Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL InvertedFlight RC Override Enable @@ -14406,25 +13615,17 @@ Standby Mode RunCam Control RunCam OSD Control - VisOdom Align + Viso Align Disarm ZigZag Auto Air Mode Generator EKF Pos Source VTX Power - AUTO RTL KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Turtle - simple heading reset - ArmDisarm (4.2 and higher) - ArmDisarm with AirMode (4.2 and higher) - Optflow Calibration - Force Flying - Turbine Start(heli) Scripting1 Scripting2 Scripting3 @@ -14473,14 +13674,6 @@ BB Blue GP0 pin 6 BB Blue GP0 pin 5 BBBMini Pin P8.17 - MainOut1 - MainOut2 - MainOut3 - MainOut4 - MainOut5 - MainOut6 - MainOut7 - MainOut8 @@ -14497,14 +13690,6 @@ BB Blue GP0 pin 6 BB Blue GP0 pin 5 BBBMini Pin P8.18 - MainOut1 - MainOut2 - MainOut3 - MainOut4 - MainOut5 - MainOut6 - MainOut7 - MainOut8 @@ -14521,14 +13706,6 @@ BB Blue GP0 pin 6 BB Blue GP0 pin 5 BBBMini Pin P8.19 - MainOut1 - MainOut2 - MainOut3 - MainOut4 - MainOut5 - MainOut6 - MainOut7 - MainOut8 @@ -14545,14 +13722,6 @@ BB Blue GP0 pin 6 BB Blue GP0 pin 5 BBBMini Pin P8.34 - MainOut1 - MainOut2 - MainOut3 - MainOut4 - MainOut5 - MainOut6 - MainOut7 - MainOut8 @@ -14576,14 +13745,6 @@ BB Blue GP0 pin 6 BB Blue GP0 pin 5 BBBMini Pin P8.13 - MainOut1 - MainOut2 - MainOut3 - MainOut4 - MainOut5 - MainOut6 - MainOut7 - MainOut8 @@ -14600,19 +13761,11 @@ BB Blue GP0 pin 6 BB Blue GP0 pin 5 BBBMini Pin P8.14 - MainOut1 - MainOut2 - MainOut3 - MainOut4 - MainOut5 - MainOut6 - MainOut7 - MainOut8 - + None Analog @@ -14624,7 +13777,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -14637,7 +13790,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -14647,35 +13800,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -14685,24 +13834,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -14718,37 +13867,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -14785,15 +13934,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -14805,7 +13948,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -14818,7 +13961,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -14828,35 +13971,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -14866,24 +14005,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -14899,37 +14038,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -14966,15 +14105,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -14986,7 +14119,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -14999,7 +14132,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -15009,35 +14142,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -15047,24 +14176,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -15080,37 +14209,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -15147,15 +14276,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -15167,7 +14290,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -15180,7 +14303,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -15190,35 +14313,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -15228,24 +14347,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -15261,37 +14380,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -15328,15 +14447,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -15348,7 +14461,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -15361,7 +14474,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -15371,35 +14484,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -15409,24 +14518,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -15442,37 +14551,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -15509,15 +14618,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -15529,7 +14632,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -15542,7 +14645,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -15552,35 +14655,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -15590,24 +14689,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -15623,37 +14722,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -15690,15 +14789,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -15710,7 +14803,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -15723,7 +14816,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -15733,35 +14826,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -15771,24 +14860,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -15804,37 +14893,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -15871,15 +14960,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -15891,7 +14974,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -15904,7 +14987,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -15914,35 +14997,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -15952,24 +15031,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -15985,37 +15064,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -16052,15 +15131,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -16072,7 +15145,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -16085,7 +15158,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -16095,35 +15168,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -16133,24 +15202,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -16166,37 +15235,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -16233,15 +15302,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -16253,7 +15316,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -16266,7 +15329,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -16276,35 +15339,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -16314,24 +15373,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -16347,37 +15406,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -16414,88 +15473,63 @@ High Speed - - 0 65535 - - - 0 65535 - - - + + None - Not Used + PWM AUXPIN EFI Harmonic Notch - ESC Telemetry Motors Bitmask - + 0.001 - + 1 - + 1 - + 0.1 - + Disabled - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + PixhawkAUX1 + PixhawkAUX2 + PixhawkAUX3 + PixhawkAUX4 + PixhawkAUX5 + PixhawkAUX6 - - 0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 - - - - + None - Not Used + PWM AUXPIN EFI Harmonic Notch - ESC Telemetry Motors Bitmask - + 0.001 - - 1 - - - 1 - - - 0.1 - - + Disabled - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + PixhawkAUX1 + PixhawkAUX2 + PixhawkAUX3 + PixhawkAUX4 + PixhawkAUX5 + PixhawkAUX6 - - 0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 - @@ -16515,39 +15549,39 @@ Pixhawk ADC4 Pixhawk ADC3 Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + PixhawkAUX1 + PixhawkAUX2 + PixhawkAUX3 + PixhawkAUX4 + PixhawkAUX5 + PixhawkAUX6 Pixhawk SBUS - - 0 5.0 - 0.01 + V volt + 0.01 + 0 5.0 - - 0 5.0 - 0.01 + V volt + 0.01 + 0 5.0 0 16 - 0 2000 PWM PWM in microseconds + 0 2000 - 0 2000 PWM PWM in microseconds + 0 2000 @@ -16590,9 +15624,8 @@ 1024 True - - 0:No Scripts to run message if all scripts have stopped, 1:Runtime messages for memory usage and execution time, 2:Suppress logging scripts to dataflash, 3:log runtime memory usage and execution time - + + @@ -16600,10 +15633,6 @@ - - - - 0:ROMFS, 1:APM/scripts @@ -16666,7 +15695,7 @@ RunCam HottTelem Scripting - Crossfire VTX + Crossfire Generator Winch MSP @@ -16675,11 +15704,6 @@ ADSB AHRS SmartAudio - FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort True @@ -16731,7 +15755,7 @@ RunCam HottTelem Scripting - Crossfire VTX + Crossfire Generator Winch MSP @@ -16740,11 +15764,6 @@ ADSB AHRS SmartAudio - FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort True @@ -16796,7 +15815,7 @@ RunCam HottTelem Scripting - Crossfire VTX + Crossfire Generator Winch MSP @@ -16805,11 +15824,6 @@ ADSB AHRS SmartAudio - FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort True @@ -16861,7 +15875,7 @@ RunCam HottTelem Scripting - Crossfire VTX + Crossfire Generator Winch MSP @@ -16870,11 +15884,6 @@ ADSB AHRS SmartAudio - FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort True @@ -16926,7 +15935,7 @@ RunCam HottTelem Scripting - Crossfire VTX + Crossfire Generator Winch MSP @@ -16935,11 +15944,6 @@ ADSB AHRS SmartAudio - FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort True @@ -16991,7 +15995,7 @@ RunCam HottTelem Scripting - Crossfire VTX + Crossfire Generator Winch MSP @@ -17000,11 +16004,6 @@ ADSB AHRS SmartAudio - FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort True @@ -17028,27 +16027,27 @@ - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate + 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from True - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate + 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from True - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate + 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from True - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate + 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from True - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate + 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from True - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate + 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from True @@ -17109,7 +16108,7 @@ RunCam HottTelem Scripting - Crossfire VTX + Crossfire Generator Winch MSP @@ -17117,12 +16116,6 @@ AirSpeed ADSB AHRS - SmartAudio - FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort True @@ -17146,7 +16139,7 @@ - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate + 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from True @@ -17178,7 +16171,7 @@ RunCam HottTelem Scripting - Crossfire VTX + Crossfire Generator Winch MSP @@ -17186,16 +16179,10 @@ AirSpeed ADSB AHRS - SmartAudio - FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort True - + 1200 2400 @@ -17215,76 +16202,7 @@ - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate - True - - - - None - MAVLink1 - MAVLink2 - Frsky D - Frsky SPort - GPS - Alexmos Gimbal Serial - SToRM32 Gimbal Serial - Rangefinder - FrSky SPort Passthrough (OpenTX) - Lidar360 - Beacon - Volz servo out - SBus servo out - ESC Telemetry - Devo Telemetry - OpticalFlow - RobotisServo - NMEA Output - WindVane - SLCAN - RCIN - MegaSquirt EFI - LTM - RunCam - HottTelem - Scripting - Crossfire VTX - Generator - Winch - MSP - DJI FPV - AirSpeed - ADSB - AHRS - SmartAudio - FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort - - True - - - - 1200 - 2400 - 4800 - 9600 - 19200 - 38400 - 57600 - 111100 - 115200 - 230400 - 256000 - 460800 - 500000 - 921600 - 1500000 - - - - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate + 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from True @@ -17306,33 +16224,28 @@ None - BLHeli32/Kiss - BLHeli_S + BLHeli32/BLHeli_S/Kiss - - 0:Servo 1, 1:Servo 2, 2:Servo 3, 3:Servo 4, 4:Servo 5, 5:Servo 6, 6:Servo 7, 7:Servo 8, 8:Servo 9, 9:Servo 10, 10:Servo 11, 11:Servo 12, 12:Servo 13, 13:Servo 14, 14:Servo 15, 15:Servo 16 - True - + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -17342,7 +16255,6 @@ - GPIO Disabled RCPassThru MountPan @@ -17432,29 +16344,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -17464,7 +16374,6 @@ - GPIO Disabled RCPassThru MountPan @@ -17554,29 +16463,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -17586,7 +16493,6 @@ - GPIO Disabled RCPassThru MountPan @@ -17676,29 +16582,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -17708,7 +16612,6 @@ - GPIO Disabled RCPassThru MountPan @@ -17798,29 +16701,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -17830,7 +16731,6 @@ - GPIO Disabled RCPassThru MountPan @@ -17920,29 +16820,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -17952,7 +16850,6 @@ - GPIO Disabled RCPassThru MountPan @@ -18042,29 +16939,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -18074,7 +16969,6 @@ - GPIO Disabled RCPassThru MountPan @@ -18164,29 +17058,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -18196,7 +17088,6 @@ - GPIO Disabled RCPassThru MountPan @@ -18286,29 +17177,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -18318,7 +17207,6 @@ - GPIO Disabled RCPassThru MountPan @@ -18408,29 +17296,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -18440,7 +17326,6 @@ - GPIO Disabled RCPassThru MountPan @@ -18530,29 +17415,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -18562,7 +17445,6 @@ - GPIO Disabled RCPassThru MountPan @@ -18652,29 +17534,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -18684,7 +17564,6 @@ - GPIO Disabled RCPassThru MountPan @@ -18774,29 +17653,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -18806,7 +17683,6 @@ - GPIO Disabled RCPassThru MountPan @@ -18896,29 +17772,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -18928,7 +17802,6 @@ - GPIO Disabled RCPassThru MountPan @@ -19018,29 +17891,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -19050,7 +17921,6 @@ - GPIO Disabled RCPassThru MountPan @@ -19140,29 +18010,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -19172,7 +18040,6 @@ - GPIO Disabled RCPassThru MountPan @@ -19262,22 +18129,18 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted 0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 - True Disabled Enabled - True @@ -19293,14 +18156,14 @@ - 0 300 s seconds + 0 300 - 0 500 Hz hertz + 0 500 @@ -19319,45 +18182,28 @@ DShot600 DShot1200 - True - + Console - Mavlink Serial Channel1 - Mavlink Serial Channel2 - Mavlink Serial Channel3 - Mavlink Serial Channel4 - Mavlink Serial Channel5 + Serial1 + Serial2 + Serial3 + Serial4 + Serial5 1 127 - True 0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 - True 0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 - True 0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 - True - - - - - 0:SERVO1,1:SERVO2,2:SERVO3,3:SERVO4,4:SERVO5,5:SERVO6,6:SERVO7,7:SERVO8,8:SERVO9,9:SERVO10,10:SERVO11,11:SERVO12 - True - - - 0:SERVO1,1:SERVO2,2:SERVO3,3:SERVO4,4:SERVO5,5:SERVO6,6:SERVO7,7:SERVO8,8:SERVO9,9:SERVO10,10:SERVO11,11:SERVO12 - - - 2 50 @@ -19435,465 +18281,465 @@ - 0 100 % percent + 0 100 - 1000 2000 ms milliseconds + 1000 2000 - 0 1000 cm/s centimeters per second + 0 1000 - 0 100 % percent + 0 100 - 0 50 - 1 Hz hertz + 0 50 + 1 - - 0 50 - 1 + Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - - 0 50 - 1 + Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - - 0 50 - 1 + Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - - 0 50 - 1 + Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - - 0 50 - 1 + Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - - 0 50 - 1 + Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - - 0 50 - 1 + Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 10 m meters + 0 10 0 500 @@ -19908,19 +18754,19 @@ True - True s seconds + True - True s seconds + True - True s seconds + True @@ -19932,16 +18778,16 @@ - True - True degC degrees Celsius + True + True - True - True degC degrees Celsius + True + True True @@ -19956,23 +18802,13 @@ - 1 m meters + 1 0:Disable Download - - 0.05 50000 - m - meters - - - 0 50 - m - meters - @@ -20331,27 +19167,26 @@ None MAVLink IntelT265 - VOXL(ModalAI) True - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -20366,24 +19201,24 @@ - 0 250 ms milliseconds + 0 250 - 0.05 5.0 m/s meters per second + 0.05 5.0 - 0.1 10.0 m meters + 0.1 10.0 - 0.05 1.0 rad radians + 0.05 1.0 @@ -20410,8 +19245,8 @@ - 5000 6000 True + 5000 6000 0:Pitmode,1:Pitmode until armed,2:Pitmode when disarmed,3:Unlocked,4:Add leading zero byte to requests @@ -20439,40 +19274,40 @@ + cm/s + centimeters per second 20 2000 50 - cm/s - centimeters per second - 5 1000 - 1 cm centimeters + 5 1000 + 1 + cm/s + centimeters per second 10 1000 50 - cm/s - centimeters per second - 10 500 - 10 cm/s centimeters per second + 10 500 + 10 - 50 500 - 10 cm/s/s centimeters per square second + 50 500 + 10 - 50 500 - 10 cm/s/s centimeters per square second + 50 500 + 10 @@ -20481,14 +19316,9 @@ + m/s/s + meters per square second 1 20 - m/s/s/s - meters per cubic second - - - 0.1 100 - m - meters @@ -20505,14 +19335,14 @@ - 0 127 s seconds + 1 127 - 0.1 100 m meters + 0.1 100 diff --git a/src/FirmwarePlugin/APM/APMParameterFactMetaData.Plane.3.10.xml b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Plane.3.10.xml new file mode 100644 index 0000000..9087863 --- /dev/null +++ b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Plane.3.10.xml @@ -0,0 +1,13856 @@ + + + + + + + + +1 255 + + +1 255 + + +1 10 +1 + + +0 30 +1 +s +seconds + + +0:Roll,1:Pitch,2:Yaw,3:Steering,4:Landing + + +0 1 +0.01 + + +0 5 +0.01 + + +0 15 +0.1 +deg +degrees + + +0 1000 +1 +m +meters + + +0 100 +1 +m +meters + + + +Disabled +FBWMixing +DirectMixing + + + + +Disabled +Enabled + + + +0 30 +0.1 +m/s +meters per second + + +0 30 +0.1 +m/s/s +meters per square second + + +0 127 +1 +ds +deciseconds + + +-100 100 +1 +% +percent + + +0 30 +0.1 +m/s +meters per second + + +0 30 +0.1 +m/s +meters per second + + +-1 127 +1 +%/s +percent per second + + +0 10 +0.5 +s +seconds + + +0 100 +% +percent + + + + +0 45 +1 +deg +degrees + + +0:AUTO_ALWAYS,1:AUTO_LAND,2:AUTO_LOITER_TO_ALT,3:AUTO_LOITER_ALL,4:AUTO_WAYPOINTS,5:LOITER,6:RTL,7:CIRCLE,8:CRUISE,9:FBWB,10:GUIDED + +Never +AutoAlways +AutoLanding + + + + +Default +L1Controller + + + + +Automatic + + + +-32767 32767 +1 +m +meters + + +1 32767 +1 +m +meters + + +0 32767 +1 +m +meters + + +-32767 32767 +1 +m +meters + + +-32767 32767 +1 +m +meters + + + +None +GuidedMode +ReportOnly +GuidedModeThrPass +RTL_Mode + + + + + + + +0 32767 +1 +m +meters + + +0 32767 +1 +m +meters + + +0 32767 +1 +m +meters + + + +NoAutoEnable +AutoEnable +AutoEnableDisableFloorOnly + + + + +FenceReturnPoint +NearestRallyPoint + + + + +Disabled +Enabled + + + +5 100 +1 +m/s +meters per second + + +5 100 +1 +m/s +meters per second + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +0 10000 +m +meters + + +1 10 +0.1 +m/s +meters per second + + +-100 100 +1 +% +percent + + +0 100 +1 +% +percent + + +0 100 +1 +% +percent + + +0 127 +1 +%/s +percent per second + + +0 100 +1 +%/s +percent per second + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +925 2200 +1 + + +0 100 +1 +% +percent + + + +Disabled +Enabled + + + + +CIRCLE/no change(if already in AUTO|GUIDED|LOITER) +CIRCLE +FBWA +Disable + + + +1 100 +0.5 +s +seconds + + + +Continue +ReturnToLaunch +Glide +Deploy Parachute + + + +1 300 +0.5 +s +seconds + + + +Disabled +Heartbeat +HeartbeatAndREMRSSI +HeartbeatAndAUTO + + + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL +QAUTOTUNE + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL +QAUTOTUNE + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL +QAUTOTUNE + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL +QAUTOTUNE + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL +QAUTOTUNE + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL +QAUTOTUNE + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL +QAUTOTUNE + + + +0 9000 +1 +cdeg +centidegrees + + +0 9000 +1 +cdeg +centidegrees + + +-9000 0 +1 +cdeg +centidegrees + + +10 500 +1 +deg/s +degrees per second + + +10 500 +1 +deg/s +degrees per second + + + +Disabled +Enabled + + + +-100 100 +0.1 +m +meters + + +10 360 +1 +deg/s +degrees per second + + + +Disabled +Enabled + + + +0.5 1.2 + + + +Disabled +Enabled + + + +-1000 1000 +d% +decipercent + + +-100 100 +% +percent + + +True + + +0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:CTUN,5:NTUN,6:MODE,7:IMU,8:CMD,9:CURRENT,10:COMPASS,11:TECS,12:CAMERA,13:RC,14:SONAR,15:ARM/DISARM,19:IMU_RAW + +Disabled +All-Default + + + + + + + +cm/s +centimeters per second + + +m/s +meters per second + + +cm/s +centimeters per second + + +cdeg +centidegrees + + +cm +centimeters + + +cm +centimeters + + + + +0 100 +% +percent + + +0 100 +1 +m/s +meters per second + + +0 100 +% +percent + + +0 100 +1 +m/s +meters per second + + + + + + + +Disabled +Enabled + +True + + + +Disabled +Enabled + + + +0 90 +0.1 +deg +degrees + + + +Disable +Enable - go HOME then land +Enable - go directly to landing sequence + + + +10 127 +m/s/s +meters per square second + + +0:Disarm + + + + + +Disabled +Enabled + + + + +NotEnforced +Enforced + + + +0 100 +1 +% +percent + + +0:Chan1,1:Chan2,2:Chan3,3:Chan4,4:Chan5,5:Chan6,6:Chan7,7:Chan8,8:Chan9,9:Chan10,10:Chan11,11:Chan12,12:Chan13,13:Chan14,14:Chan15,15:Chan16 + + +-1 127 + +Never reset +Always reset + +m +meters + + +0:Rudder mixing in direct flight modes only (Manual / Stabilize / Acro),1:Use centered throttle in Cruise or FBWB to indicate trim airspeed, 2:Disable attitude check for takeoff arming, 3:Force target airspeed to trim airspeed in Cruise or FBWB + + +1 10 + + +0 100 +1 +% +percent + + +0 100 +1 +% +percent + + +0 120 +1 +s +seconds + + +0:pitch control, 1:full span, 2:Progressive crow +0: none, 1: D spoilers have pitch input, 2: use both control surfaces on each wing for roll, 4: Progressive crow, flaps only first (0-50% flap in) then crow flaps (50 - 100% flap in) + + +0 100 +1 +% +percent + + + + + +Disabled +Enabled + + + +1 100 + + +0 100000 +m +meters + + +-1 16777215 + + + +NoInfo +Light +Small +Large +HighVortexlarge +Heavy +HighlyManuv +Rotocraft +RESERVED +Glider +LightAir +Parachute +UltraLight +RESERVED +UAV +Space +RESERVED +EmergencySurface +ServiceSurface +PointObstacle + + + + +NO_DATA +L15W23 +L25W28P5 +L25W34 +L35W33 +L35W38 +L45W39P5 +L45W45 +L55W45 +L55W52 +L65W59P5 +L65W67 +L75W72P5 +L75W80 +L85W80 +L85W90 + + + + +NoData +Left2m +Left4m +Left6m +Center +Right2m +Right4m +Right6m + + + + +NO_DATA +AppliedBySensor + + + + +Disabled +Rx-Only +Tx-Only +Rx and Tx Enabled + + + +0 7777 +octal +octal + + +0:UAT_in,1:1090ES_in,2:UAT_out,3:1090ES_out + +Unknown +Rx UAT only +Rx UAT and 1090ES +Rx&Tx UAT and 1090ES + + + +0 32767 +m +meters + + + + + +no logging +log only special ID +log all + + + + + + + + + + + + + + + + + + + + + +m +meters + + +m +meters + + +mbar +millibar + + + + + + + + + + + + + + +s +seconds + + + + +0.0 1.0 +.01 + + + +Disabled +Enabled + + + +0.1 0.4 +.01 + + +0.1 0.4 +.01 + + +0 127 +1 +m/s +meters per second + + +-0.1745 +0.1745 +0.01 +rad +radians + + +-0.1745 +0.1745 +0.01 +rad +radians + + +-0.1745 +0.1745 +0.01 +rad +radians + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 +Custom + + + +0.001 0.5 +.01 + + +0 10 +1 + + + +Disabled +Enable EKF2 +Enable EKF3 + + + +-180 180 +1 +deg +degrees + + +-180 180 +1 +deg +degrees + + +-180 180 +1 +deg +degrees + + + + + +Disabled +THR_MIN PWM when disarmed +0 PWM when disarmed + + + +0:None,1:All,2:Barometer,4:Compass,8:GPS Lock,16:INS(INertial Sensors - accels & gyros),32:Parameters(unused),64:RC Channels,128:Board voltage,256:Battery Level,512:Airspeed,1024:LoggingAvailable,2048:Hardware safety switch,4096:GPS configuration,8192:System + +None +All +Barometer +Compass +GPS Lock +INS(INertial Sensors - accels & gyros) +Parameters(unused) +RC Channels +Board voltage +Battery Level +Airspeed +LoggingAvailable +Hardware safety switch +GPS configuration +System + + + +0.25 3.0 +m/s/s +meters per square second + + + +Disabled +ArmingOnly +ArmOrDisarm + + + +0:Land,1:VTOL Land,2:DO_LAND_START,3:Takeoff,4:VTOL Takeoff,5:Rallypoint + + + + + +None +I2C-MS4525D0 +Analog +I2C-MS5525 +I2C-MS5525 (0x76) +I2C-MS5525 (0x77) +I2C-SDP3X +I2C-DLVR +UAVCAN + + + + +DoNotUse +Use +UseWhenZeroThrottle + + + +0.1 + + +0.1 + + + + + + + + + +Disable +Enable + + + + + + +Bus0(internal) +Bus1(external) +Bus2(auxillary) + + + + +FirstSensor +2ndSensor + + + +0:Disable on sensor failure,1:Re-enable on sensor recovery + + + +None +I2C-MS4525D0 +Analog +I2C-MS5525 +I2C-MS5525 (0x76) +I2C-MS5525 (0x77) +I2C-SDP3X +I2C-DLVR +UAVCAN + + + + +Don't Use +use +UseWhenZeroThrottle + + + +0.1 + + +0.1 + + + + + + + + + +Disable +Enable + + + + + + +Bus0(internal) +Bus1(external) +Bus2(auxillary) + + + + + + +Disabled +Enabled + + + + +Remain in AVOID_ADSB +Resume previous flight mode +RTL +Resume if AUTO else Loiter + + + + + +s +seconds + + +s +seconds + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +RTL +Land +Terminate +QLand + + + + +None +RTL +Land +Terminate +QLand + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +RTL +Land +Terminate +QLand + + + + +None +RTL +Land +Terminate +QLand + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +RTL +Land +Terminate +QLand + + + + +None +RTL +Land +Terminate +QLand + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +RTL +Land +Terminate +QLand + + + + +None +RTL +Land +Terminate +QLand + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +RTL +Land +Terminate +QLand + + + + +None +RTL +Land +Terminate +QLand + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +RTL +Land +Terminate +QLand + + + + +None +RTL +Land +Terminate +QLand + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +RTL +Land +Terminate +QLand + + + + +None +RTL +Land +Terminate +QLand + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +RTL +Land +Terminate +QLand + + + + +None +RTL +Land +Terminate +QLand + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +RTL +Land +Terminate +QLand + + + + +None +RTL +Land +Terminate +QLand + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +No PWMs +One PWMs +Two PWMs +Three PWMs +Four PWMs +Five PWMs +Six PWMs +Seven PWMs +Eight PWMs + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled + +True + + + +Disabled +50Hz +75Hz +100Hz +150Hz +200Hz +250Hz +300Hz + +True + + +-32768 32767 + + +0:Ch1,1:Ch2,2:Ch3,3:Ch4,4:Ch5,5:Ch6,6:Ch7,7:Ch8,8:Ch9,9:Ch10,10:Ch11,11:Ch12,12:Ch13,13:Ch14 + +Disabled +Enabled + +True + + +-1 80 +degC +degrees Celsius + + + +AUTO +PX4V1 +Pixhawk +Cube/Pixhawk2 +Pixracer +PixhawkMini +Pixhawk2Slim +VRBrain 5.1 +VRBrain 5.2 +VR Micro Brain 5.1 +VR Micro Brain 5.2 +VRBrain Core 1.0 +VRBrain 5.4 +Intel Aero FC +AUAV2.1 + +True + + + +Disabled +Enabled + +True + + +0:ActiveForSafetyEnable,1:ActiveForSafetyDisable,2:ActiveWhenArmed,3:Force safety on when the aircraft disarms + + +4.0 5.5 +0.1 +V +volt + + +3.3 12.0 +0.1 +V +volt + + +0 32 +1 + + + +3.3V +5V + + + +0:Enable hardware watchdog + + + + + +None +CYRF6936 + + + + +Auto +DSM2 +DSMX + + + +0 4 + + + +NotDisabled +Disabled + + + +0 16 + + +0 16 + + + +Disabled +Enabled + + + +1 8 + + + +Disabled +MinChannel +MidChannel +MaxChannel +MinChannelCW +MidChannelCW +MaxChannelCW + + + + +Mode1 +Mode2 + + + + +Disabled +TestChan1 +TestChan2 +TestChan3 +TestChan4 +TestChan5 +TestChan6 +TestChan7 +TestChan8 + + + +0 16 + + +0 16 + + +1 8 + + +0 40 + + +0 120 + + +0 31 + + + + +0:GPS,1:MAVLINK_SYSTEM_TIME,2:HW + + + + + +Disabled +Enabled + + + + +Disabled +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 + + + + +Disabled +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 + + + + +Disabled +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 + + + + +Disabled +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 + + + +0 3600 + + + + + +Servo +Relay + + + +0 50 +ds +deciseconds + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +0 1000 +m +meters + + + +Low +High + + + +0 10000 +ms +milliseconds + + +0 180 +deg +degrees + + + +Disabled +AUX1 +AUX2 +AUX3 +AUX4 +AUX5 +AUX6 + +True + + + +TriggerLow +TriggerHigh + + + + +Always +Only when in AUTO + + + + +Default +BMMCC + + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + +0 32767 + + + + + +Disabled +Enabled + + + + +First Relay +Second Relay +Third Relay +Fourth Relay +Servo + + + +1000 2000 +1 +PWM +PWM in microseconds + + +1000 2000 +1 +PWM +PWM in microseconds + + +0 32000 +1 +m +meters + + +0 5000 +1 +ms +milliseconds + + + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-3.142 3.142 +0.01 +rad +radians + + + +Disabled +Internal-Learning +EKF-Learning +InFlight-Learning + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Use Throttle +Use Current + + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + + +FirstCompass +SecondCompass +ThirdCompass + + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +True + + +True + + +True + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +4 32 + +Very Strict +Strict +Default +Relaxed + +0.1 + + +500 3000 +1 + + +0:HMC5883,1:LSM303D,2:AK8963,3:BMM150,4:LSM9DS1,5:LIS3MDL,6:AK09916,7:IST8310,8:ICM20948,9:MMC3416,11:UAVCAN,12:QMC5883,14:MAG3110,15:IST8308 + + +0 100 +1 +% +percent + + + +Disabled +CheckOnly +CheckAndFix + + + + + + + + + + +Disabled +Enabled + + + + + + +Disabled +Enabled + + + +0 2 +0.01 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.000001 0.001 +Hz +hertz + + +0.00001 0.005 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +2.0 6.0 +0.5 +m/s +meters per second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + +0 127 +1 +ms +milliseconds +True + + + +None +Navigation +Terrain + +True + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + +True + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.00001 0.005 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +2.0 6.0 +0.5 +m/s +meters per second + + +0.5 2.5 +0.1 +m/s/s +meters per square second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + +0.05 0.5 +0.05 +m/s +meters per second + + +0.5 5.0 +0.1 +m/s +meters per second + + +0.01 1.0 +0.1 +m/s +meters per second + + + +None +Navigation +Terrain + +True + + + + + +None +PX4Flow +Pixart +Bebop +CXOF +MAVLink + +True + + +-200 +200 +1 + + +-200 +200 +1 + + +-18000 +18000 +1 + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +0 127 + + + +Disabled +Enabled + + + + + +True +True +1 +Pa +pascal + + +True +1 +degC +degrees Celsius + + +0.1 +m +meters + + + +FirstBaro +2ndBaro +3rdBaro + + + + +Disabled +Bus0 +Bus1 + + + +1.0:Freshwater,1.024:Saltwater + + +True +True +1 +Pa +pascal + + +True +True +1 +Pa +pascal + + +0 100 +1 +% +percent + + +0:BMP085,1:BMP280,2:MS5611,3:MS5607,4:MS5637,5:FBM320,6:DPS280,7:LPS25H,8:Keller + +BMP085 +BMP280 +MS5611 +MS5607 +MS5637 +FBM320 +DPS280 +LPS25H +Keller + + + + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA + +True + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA + +True + + + +Portable +Stationary +Pedestrian +Automotive +Sea +Airborne1G +Airborne2G +Airborne4G + + + + +Disabled +UseBest +Blend +UseSecond + + + + +Any +FloatRTK +IntegerRTK + +True + + + +Disabled +Enabled +NoChange + + + +-100 90 +deg +degrees + + + +send to first GPS +send to 2nd GPS +send to all + + + + +None (0x0000) +All (0xFFFF) +External only (0xFF00) + + + + +Ignore +Always log +Stop logging when disarmed (SBF only) +Only log every five samples (uBlox only) + +True + + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + + + + +Do not save config +Save config +Save only when needed + + + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + + + + +Disables automatic configuration +Enable automatic configuration + + + +50 200 + +10Hz +8Hz +5Hz + +ms +milliseconds + + +50 200 + +10Hz +8Hz +5Hz + +ms +milliseconds + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +0 250 +ms +milliseconds +True + + +0 250 +ms +milliseconds +True + + +0:Horiz Pos,1:Vert Pos,2:Speed + + +5.0 30.0 +s +seconds + + + + + +Disabled +Enabled + + + + +None +Servo +EPM + + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +0 255 +s +seconds + + +0 255 + + + + + +Disabled +Enabled + + + + +None +Chan1 +Chan2 +Chan3 +Chan4 +Chan5 +Chan6 +Chan7 +Chan8 +Chan9 +Chan10 +Chan11 +Chan12 +Chan13 +Chan14 +Chan15 +Chan16 + + + +0.1 5 +s +seconds + + +1 10 +s +seconds + + +100 100000 + + +1000 2000 + + +1000 2000 + + +1000 2000 + + +1000 2000 + + + +None +RPM1 +RPM2 + + + +0 100 + + +0 100 + + + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +0 127 +Hz +hertz + + +0 127 +Hz +hertz + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +0.05 50 + + + +Never +Start-up only + + + + +Don't adjust the trims +Assume first orientation was level +Assume ACC_BODYFIX is perfectly aligned to the vehicle + + + + +IMU 1 +IMU 2 +IMU 3 + + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +True + + +True + + +True + + +True + + +True + + +True + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU + +FirstIMUOnly +FirstAndSecondIMU + + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU + +FirstIMUOnly +FirstAndSecondIMU +FirstSecondAndThirdIMU +AllIMUs + + + + + +32 + + +0:IMU1,1:IMU2,2:IMU3 + +None +First IMU +All + + + +0:Sensor-Rate Logging (sample at full sensor rate seen by AP) + + +10 +ms +milliseconds + + +1 + + + + + +Disabled +Enabled + + + +10 200 +Hz +hertz + + +5 50 +Hz +hertz + + +5 30 +dB +decibel + + + + +0 5 +0.5 +m +meters + + +0 90 +0.1 +deg +degrees + + +cdeg +centidegrees + + +0.1 +m +meters + + +0.1 +s +seconds + + +0 30 +0.1 +m +meters + + +0 10 +0.1 +s +seconds + + +0 30 +0.1 +m/s +meters per second + + +0 127 +1 +% +percent + + +0 127 +1 +s +seconds + + + +Disabled +Servos to Neutral +Servos to Zero PWM + + + + +Disabled +Enabled + + + +0 100 +% +percent + + + +Standard Glide Slope +Deepstall + + + + + +0 20 +m/s +meters per second + + + + + + +10 200 +m +meters + + +0 20 +m/s +meters per second + + +0 2 +s +seconds + + +900 2100 +PWM +PWM in microseconds + + +5 20 +m/s +meters per second + + +5 20 +m/s +meters per second + + +5 50 +m +meters + + +0 1 + + +0 2.0 + + + + + + + + + + + + + + + +WaitForPilotInput +Retract +Deploy + + + + +Disabled +AUX1 +AUX2 +AUX3 +AUX4 +AUX5 +AUX6 + +True + + + +Low +High + + + + +Disabled +AUX1 +AUX2 +AUX3 +AUX4 +AUX5 +AUX6 + +True + + + +Low +High + + + +0 1000 +1 +m +meters + + +0 1000 +1 +m +meters + + + + +0:File,1:MAVLink,2:Block + +None +File +MAVLink +File and MAVLink +Block +Block and MAVLink + + + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +kB +kilobytes + + + + +0 32766 +1 + + + +Resume Mission +Restart Mission + + + +0:Clear Mission on reboot + + + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + +0 100 +1 + + +0.0 0.2 +.005 +s +seconds + + +0.0 0.2 +.005 +s +seconds + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + +True + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + +0.0 0.2 +.005 +s +seconds + + +0.0 0.2 +.005 +s +seconds + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + + + + + +1 60 +1 +s +seconds + + +0.6 1.0 +0.05 + + +0 0.1 +0.01 + + +0 89 +deg +degrees + + + + + +Off +Low +Medium +High + + + + +Disable +Enable + + + + +Standard +MAVLink +OutbackChallenge + + + + +Disable +ssd1306 +sh1106 + + + + +Disabled +Aircraft +Rover + + + + +Disabled + + + +0:Build in LED, 1:Internal ToshibaLED, 2:External ToshibaLED, 3:External PCA9685, 4:Oreo LED, 5:UAVCAN, 6:NCP5623 External, 7:NCP5623 Internal + + + +LowIsOn +HighIsOn + + + + + + +None +MAX7456 + +True + + + +Disable +Chan5 +Chan6 +Chan7 +Chan8 +Chan9 +Chan10 +Chan11 +Chan12 +Chan13 +Chan14 +Chan15 +Chan16 + + + +0:UseDecimalPack, 1:InvertedWindPointer, 2:InvertedAHRoll + + +True + + +0 31 +True + + +0 63 +True + + +0 99 + + +1 30 + + +0 100 + + + +Metric +Imperial +SI +Aviation + + + +1 20 + + +0 4 + + +0 4 + + +0 4 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + +0.4 1.0 +0.1 +s +seconds + + +0.1 3.0 +0.1 + + +0 0.2 +0.01 + + +0 0.5 +0.05 + + +0 100 +1 +deg/s +degrees per second + + +0 100 +1 +deg/s +degrees per second + + +0.7 1.5 +0.05 + + +0 4500 +1 + + +0.1 4.0 +0.1 + + + + + +Disable +Enable +Enable VTOL AUTO + + + +1000 8000 +cdeg +centidegrees + + +0 30000 +ms +milliseconds + + +50 500 +10 +cm/s +centimeters per second + + +50 500 +10 +cm/s/s +centimeters per square second + + +50 500 +10 +Hz +hertz + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +0 100 +0.1 +m/s +meters per second + + +50 500 +1 +deg/s +degrees per second + + +30 200 +10 +cm/s +centimeters per second + + +0.5 50 +0.1 +m +meters + + +0 30 +1 +deg +degrees + + + +Undefined +Quad +Hexa +Octa +OctaQuad +Y6 +Tri + TailSitter + + + + +Plus +X +V +H +V-Tail +A-Tail +Y6B +Y6F + + + +0 0.5 +0.01 + + +0 1 +0.01 + + +0 10 +0.1 + + +1 200 +1 +m +meters + + + +Disabled +Enabled + + + + + +10 300 +1 +deg/s +degrees per second + + +20 80 +1 +deg +degrees + + + +Disabled +Enabled + + + + +Disabled +ThrottleInput +FullInput + + + +0 10 +0.25 +m +meters + + + +Disabled +Enabled + + + +0 90 +1 +deg +degrees + + + +Continuous +Binary +VectoredYaw + + + +5 80 + + +10 300 +1 +deg/s +degrees per second + + + +MultiCopterInput +FixedWingInput +BodyFrameRoll_M +BodyFrameRoll_P + + + +0:Aileron,1:Elevator,2:Throttle,3:Rudder + + + +Disabled +Channel1 +Channel2 +Channel3 +Channel4 +Channel5 +Channel6 +Channel7 +Channel8 + + + +0 1 +0.01 + + +0 1 +0.01 + + +0 30 + + +0 4 +0.1 + + + +AUTO +FIXED_WING +QUADROTOR +COAXIAL +HELICOPTER +AIRSHIP +FREE_BALLOON +ROCKET +GROUND_ROVER +SURFACE_BOAT +SUBMARINE +FLAPPING_WING +KITE +VTOL_DUOROTOR +VTOL_QUADROTOR +VTOL_TILTROTOR + + + +0:LevelTransition,1:AllowFWTakeoff,2:AllowFWLand,3:Respect takeoff frame types,4:Use a fixed wing approach for VTOL landings + + +0.2 5 +0.1 +m/s/s +meters per square second + + +1 5 + + +-10 +10 +0.1 +deg +degrees +True + + +0 80 +deg +degrees + + +0 200 +5 +m +meters + + +0 20 +1 +s +seconds + + +0:Motor 1,1:Motor 2,2:Motor 3,3:Motor 4, 4:Motor 5,5:Motor 6,6:Motor 7,7:Motor 8 + + +0 1 +.1 + + +10 500 +1 +deg/s +degrees per second + + +10 500 +1 +deg/s +degrees per second + + +10 500 +1 +deg/s +degrees per second + + + + +500 18000 +100 +cdeg/s +centidegrees per second + + +0 72000 + +Disabled +VerySlow +Slow +Medium +Fast + +1000 +cdeg/s/s +centidegrees per square second + + + +Disabled +Enabled + + + +0 180000 + +Disabled +VerySlow +Slow +Medium +Fast + +1000 +cdeg/s/s +centidegrees per square second + + +0 180000 + +Disabled +VerySlow +Slow +Medium +Fast + +1000 +cdeg/s/s +centidegrees per square second + + + +Disabled +Enabled + + + +0.0 12.000 + + +0.0 12.000 + + +0.0 6.000 + + +0.5 10.0 + + +0 1080 + +Disabled +Slow +Medium +Fast + +1 +deg/s +degrees per second + + +0 1080 + +Disabled +Slow +Medium +Fast + +1 +deg/s +degrees per second + + +0 1080 + +Disabled +Slow +Medium +Fast + +1 +deg/s +degrees per second + + +0 1 +0.5:Very Soft, 0.2:Soft, 0.15:Medium, 0.1:Crisp, 0.05:Very Crisp +0.01 +s +seconds + + +0.05 0.5 +0.005 + + +0.01 2.0 +0.01 + + +0 1 +0.01 +% +percent + + +0.0 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz +hertz + + +0.05 0.50 +0.005 + + +0.01 2.0 +0.01 + + +0 1 +0.01 +% +percent + + +0.0 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz +hertz + + +0.10 2.50 +0.005 + + +0.010 1.0 +0.01 + + +0 1 +0.01 +% +percent + + +0.000 0.02 +0.001 + + +0 0.5 +0.001 + + +1 10 +1 +Hz +hertz + + +0.1 0.25 + + +0.5 0.9 + + +0.1 0.9 + + + + +0 45 +1 +deg +degrees + + +20 2000 +50 +cm/s +centimeters per second + + +100 981 +1 +cm/s/s +centimeters per square second + + +25 250 +1 +cm/s/s +centimeters per square second + + +500 5000 +1 +cm/s/s/s +centimeters per cubic second + + +0 2 +0.1 +s +seconds + + + + +0 500 +PWM +PWM in microseconds + + +0.25 0.8 + + +0.9:Low, 0.95:Default, 1.0:High + + +6 35 +V +volt + + +6 35 +V +volt + + +0 200 +A +ampere + + + +Normal +OneShot +OneShot125 +Brushed +DShot150 +DShot300 +DShot600 +DShot1200 + +True + + +0 2000 +PWM +PWM in microseconds + + +0 2000 +PWM +PWM in microseconds + + +0.0:Low, 0.15:Default, 0.3:High + + +0.0:Low, 0.1:Default, 0.2:High + + +0 10 +s +seconds + + +0.2 0.8 + + + +Disabled + + + + +PWM enabled while disarmed +PWM disabled while disarmed + + + +5 80 +1 +deg +degrees + + +0 2 +0.1 +s +seconds + + +0 5 +0.1 + + + +First battery +Second battery + + + +0 .5 +0.001 +s +seconds + + +0 .5 +0.001 +s +seconds + + + + +0.5 5 +0.1 +Hz +hertz + + +1.000 3.000 + + +1.000 8.000 + + +0.500 1.500 +0.05 + + +0.000 3.000 + + +0 1000 +d% +decipercent + + +0.000 0.400 + + +1.000 100.000 +Hz +hertz + + +0.500 2.000 + + +0.1 6.0 +0.1 + + +0.02 1.00 +0.01 + + +0.00 1.00 +0.001 + + +0 4500 +10 +cm/s/s +centimeters per square second + + +0 100 +Hz +hertz + + +0 100 +Hz +hertz + + +0 45 +1 +deg +degrees + + + + +20 2000 +50 +cm/s +centimeters per second + + +5 1000 +1 +cm +centimeters + + +10 1000 +50 +cm/s +centimeters per second + + +10 500 +10 +cm/s +centimeters per second + + +50 500 +10 +cm/s/s +centimeters per square second + + +50 500 +10 +cm/s/s +centimeters per square second + + + +Disable +Enable + + + + + + + +0.1 +km +kilometers + + + +DoNotIncludeHome +IncludeHome + + + + + +0.0 120.0 +s +seconds + + +0:Ignore RC Receiver, 1:Ignore MAVLink Overrides, 2:Ignore Receiver Failsafe + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Camera Trigger +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Camera Trigger +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Camera Trigger +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Camera Trigger +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Camera Trigger +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Camera Trigger +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Camera Trigger +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Camera Trigger +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Camera Trigger +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Camera Trigger +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Camera Trigger +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Camera Trigger +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Camera Trigger +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Camera Trigger +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Camera Trigger +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + +Do Nothing +Camera Trigger +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 + + + + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Off +On +NoChange + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + + +0.4 1.0 +0.1 +s +seconds + + +0.1 4.0 +0.1 + + +0 0.2 +0.01 + + +0 1.0 +0.05 + + +0 180 +1 +deg/s +degrees per second + + +0 4500 +1 + + +0.1 4.0 +0.1 + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +PX4-PWM +AUXPIN + + + +0.001 + + +1 + + +1 + + +0.1 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +None +PX4-PWM +AUXPIN + + + +0.001 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + + + +Disabled +AnalogPin +RCChannelPwmValue +ReceiverProtocol +PWMInputPin + + + + +V5 Nano +Pixracer +Pixhawk ADC4 +Pixhawk ADC3 +Pixhawk ADC6 +Pixhawk2 ADC +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 +Pixhawk SBUS + + + +0 5.0 +0.01 +V +volt + + +0 5.0 +0.01 +V +volt + + +0 16 + + +0 2000 +PWM +PWM in microseconds + + +0 2000 +PWM +PWM in microseconds + + + + + +Disabled +ShowSlips +ShowOverruns + + + + +50Hz +100Hz +200Hz +250Hz +300Hz +400Hz + +True + + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +460800 +500000 +921600 +1500000 + + + + +MAVlink1 +MAVLink2 + +True + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + +0 120 +s +seconds + + + + + +Disable +Enable + + + +25 400 +Hz +hertz + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + +Disabled +Enabled + + + + +Disabled +TestMotor1 +TestMotor2 +TestMotor3 +TestMotor4 +TestMotor5 +TestMotor6 +TestMotor7 +TestMotor8 + + + +0 300 +s +seconds + + +0 500 +Hz +hertz + + + +Disabled +Enabled + + + + +None +OneShot +OneShot125 +Brushed +DShot150 +DShot300 +DShot600 +DShot1200 + + + + +Console +Telem1 +Telem2 +Telem3 +Telem4 +Telem5 + + + +1 127 + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + + +0 4095 + + +0 4095 + + + + +25 250 +Hz +hertz + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + + + +Disabled +Enabled + + + +0 15 + + + + + +Disabled +Enabled + + + +0 15 + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + + +Normal +Reverse + + + + + + +Disabled +Enabled + + + +-90 90 +0.000001 +deg +degrees + + +-180 180 +0.000001 +deg +degrees + + +0 10000 +1 +cm +centimeters + + +-180 +180 +1 +deg +degrees + + +0 200 +Hz +hertz + + + +cylinder +cone +sphere + + + +0 100 +m +meters + + +5 100 +m +meters + + + + + +Disabled +Enabled + + + +0 15 + + +0 15 + + + + + +Disable +Enable + + + +0 10 +m/s +meters per second + + +0 100 +m +meters + + +0 32768 +s +seconds + + +0 32768 +s +seconds + + +0 0.5 +m.m/s/s +square meter per square second + + +0 1000.0 +m +meters + + +0 1000.0 +m +meters + + +0 1000.0 +m +meters + + +0 16 + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 50 +1 +Hz +hertz + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 50 +1 +Hz +hertz + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 50 +1 +Hz +hertz + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 50 +1 +Hz +hertz + + + + +True + + +True +s +seconds + + +True +s +seconds + + +True +s +seconds + + + + +0.4 1.0 +0.1 +s +seconds + + +0.1 10.0 +0.1 + + +0 1.0 +0.05 + + +0 0.1 +0.01 + + +0 4500 +1 +cdeg +centidegrees + + +0 5 +0.1 +m/s +meters per second + + +0.0 10.0 +0.1 + + +0.0 30.0 +0.1 +m/s +meters per second + + +0.0 50.0 +0.1 +deg/m/s +degrees per meter per second + + +0.0 4500.0 +0.1 +cdeg +centidegrees + + + + +0.1 20.0 +0.1 + + +0.1 10.0 +0.1 + + +3.0 10.0 +0.2 + + +0.1 1.0 +0.1 + + +0.0 0.5 +0.02 + + +1.0 10.0 +0.5 + + +1.0 5.0 +0.05 + + +0.5 2.0 +0.05 + + +5.0 30.0 +1.0 + + +0.0 2.0 +0.1 + + +0.1 1.0 +0.1 + + +0.0 20.0 +0.1 + + +-1 127 +1 + + +-1 100 +0.1 + + +-1.0 2.0 +0.1 + + +0 45 +1 + + +-45 0 +1 + + +0.0 2.0 +0.1 + + +1.0 5.0 +0.2 + + +0.1 1.0 +0.1 + + +-5 40 +1 + + +0.0 20.0 +0.1 +m/s +meters per second + + +-2.0 2.0 +0.1 +m/s/m +meters per second per meter + + +0.1 1.0 +0.1 + + +0.0 0.5 +0.02 + + +0.0 0.5 +0.02 + + +0.1 1.0 +0.1 + + + +Disable +Enable + + + + + + +Disable +Enable + + + +1 +m +meters + + + + + +None +RateRollPI +RateRollP +RateRollI +RateRollD +RatePitchPI +RatePitchP +RatePitchI +RatePitchD +RateYawPI +RateYawP +RateYawI +RateYawD +AngleRollP +AnglePitchP +AngleYawP +PosXYP +PosZP +VelXYP +VelXYI +VelZP +AccelZP +AccelZI +AccelZD +FixedWingRollP +FixedWingRollI +FixedWingRollD +FixedWingRollFF +FixedWingPitchP +FixedWingPitchI +FixedWingPitchD +FixedWingPitchFF +Set_RateRollPitch +Set_RateRoll +Set_RatePitch +Set_RateYaw +Set_AngleRollPitch +Set_VelXY +Set_AccelZ + + + + +Disable +Chan5 +Chan6 +Chan7 +Chan8 +Chan9 +Chan10 +Chan11 +Chan12 +Chan13 +Chan14 +Chan15 +Chan16 + + + +900 2100 + + +900 2100 + + + +Disable +Chan1 +Chan3 +Chan3 +Chan4 +Chan5 +Chan6 +Chan7 +Chan8 +Chan9 +Chan10 +Chan11 +Chan12 +Chan13 +Chan14 +Chan15 +Chan16 + + + + + + +Disable +Enable + + + +0 1 + + + + +0 4 +0.25 + + +0 2 +0.25 + + +0 2 +0.25 + + +0.8 1.2 +0.05 + + +0 4500 +1 + + + diff --git a/src/FirmwarePlugin/APM/APMParameterFactMetaData.Plane.3.8.xml b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Plane.3.8.xml new file mode 100644 index 0000000..bb5209c --- /dev/null +++ b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Plane.3.8.xml @@ -0,0 +1,8268 @@ + + + + + + + + +True + + +1 255 + + +1 255 + + + +Disabled +Enabled + + + +1 10 +1 + + +0 30 +1 +s +seconds + + +0:Roll,1:Pitch,2:Yaw,3:Steering,4:Landing + + +0 1 +0.01 + + +0 5 +0.01 + + +0 15 +0.1 +deg +degrees + + +0 1000 +1 +m +meters + + +0 100 +1 +m +meters + + + +Disabled +FBWMixing +DirectMixing + + + + +Disabled +Enabled + + + +0 30 +0.1 +m/s +meters per second + + +0 30 +0.1 +m/s/s +meters per square second + + +0 127 +1 +ds +deciseconds + + +-100 100 +1 +% +percent + + +0 30 +0.1 +m/s +meters per second + + +0 30 +0.1 +m/s +meters per second + + +0 127 +1 +%/s +percent per second + + +0 10 +0.5 +s +seconds + + +0 100 +% +percent + + + + +0 45 +1 +deg +degrees + + +0:AUTO_ALWAYS,1:AUTO_LAND,2:AUTO_LOITER_TO_ALT,3:AUTO_LOITER_ALL,4:AUTO_WAYPOINTS,5:LOITER,6:RTL,7:CIRCLE,8:CRUISE,9:FBWB,10:GUIDED + + + +Default +L1Controller + + + + +Automatic + + + +-32767 32767 +1 +m +meters + + +1 32767 +1 +m +meters + + +0 32767 +1 +m +meters + + +-32767 32767 +1 +m +meters + + +-32767 32767 +1 +m +meters + + + +None +GuidedMode +ReportOnly +GuidedModeThrPass +RTL_Mode + + + + + + + +0 32767 +1 +m +meters + + +0 32767 +1 +m +meters + + +0 32767 +1 +m +meters + + + +NoAutoEnable +AutoEnable +AutoEnableDisableFloorOnly + + + + +FenceReturnPoint +NearestRallyPoint + + + + +Disabled +Enabled + + + +5 100 +1 +m/s +meters per second + + +5 100 +1 +m/s +meters per second + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +0 10000 +m +meters + + +1 10 +0.1 +m/s +meters per second + + +-100 100 +1 +% +percent + + +0 100 +1 +% +percent + + +0 100 +1 +% +percent + + +0 127 +1 +%/s +percent per second + + +0 100 +1 +%/s +percent per second + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +925 2200 +1 + + +0 100 +1 +% +percent + + + +Disabled +Enabled + + + + +CIRCLE/no change(if already in AUTO|GUIDED|LOITER) +CIRCLE +FBWA + + + +1 100 +0.5 +s +seconds + + + +Continue +ReturnToLaunch +Glide +Deploy Parachute + + + +1 300 +0.5 +s +seconds + + +0.1 +V +volt + + +50 +mA.h +milliampere hour + + + +Disabled +Heartbeat +HeartbeatAndREMRSSI +HeartbeatAndAUTO + + + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL + + + +0 9000 +1 +cdeg +centidegrees + + +0 9000 +1 +cdeg +centidegrees + + +-9000 0 +1 +cdeg +centidegrees + + +10 500 +1 +deg/s +degrees per second + + +10 500 +1 +deg/s +degrees per second + + + +Disabled +Enabled + + + +-100 100 +0.1 +m +meters + + +10 360 +1 +deg/s +degrees per second + + + +Disabled +Enabled + + + +0.5 1.2 + + + +Disabled +Enabled + + + +-1000 1000 +d% +decipercent + + +-100 100 +% +percent + + +True + + +0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:CTUN,5:NTUN,6:MODE,7:IMU,8:CMD,9:CURRENT,10:COMPASS,11:TECS,12:CAMERA,13:RC,14:SONAR,15:ARM/DISARM,19:IMU_RAW + +Disabled +PX4/Pixhawk-Default + + + + + + + +cm/s +centimeters per second + + +m/s +meters per second + + +cm/s +centimeters per second + + +cdeg +centidegrees + + +cm +centimeters + + +cm +centimeters + + + +Disabled +Enabled + + + + + +0 100 +% +percent + + +0 100 +1 +m/s +meters per second + + +0 100 +% +percent + + +0 100 +1 +m/s +meters per second + + + + + + + +Disabled +Channel1 +Channel2 +Channel3 +Channel4 +Channel5 +Channel6 +Channel7 +Channel8 + + + + +Disabled +Enabled + +True + + + +Disabled +Enabled + + + +0 90 +0.1 +deg +degrees + + + +Disable +Enable - go HOME then land +Enable - go directly to landing sequence + + + +10 127 +m/s/s +meters per square second + + +0:Disarm + + + + + +Disabled +Enabled + + + + +NotEnforced +Enforced + + + +0 100 +1 +% +percent + + +0:Chan1,1:Chan2,2:Chan3,3:Chan4,4:Chan5,5:Chan6,6:Chan7,7:Chan8,8:Chan9,9:Chan10,10:Chan11,11:Chan12,12:Chan13,13:Chan14,14:Chan15,15:Chan16 + + + + + +Disabled +Enabled + + + +1 100 + + +1 100000 + + +-1 16777215 + + + +NoInfo +Light +Small +Large +HighVortexlarge +Heavy +HighlyManuv +Rotocraft +RESERVED +Glider +LightAir +Parachute +UltraLight +RESERVED +UAV +Space +RESERVED +EmergencySurface +ServiceSurface +PointObstacle + + + + +NO_DATA +L15W23 +L25W28P5 +L25W34 +L35W33 +L35W38 +L45W39P5 +L45W45 +L55W45 +L55W52 +L65W59P5 +L65W67 +L75W72P5 +L75W80 +L85W80 +L85W90 + + + + +NoData +Left2m +Left4m +Left6m +Center +Right2m +Right4m +Right6m + + + + +NO_DATA +AppliedBySensor + + + + +Disabled +Rx-Only +Tx-Only +Rx and Tx Enabled + + + + + + + + + + + + + + + + + + + + + +m +meters + + +m +meters + + +mbar +millibar + + + + + + + + + + + + + + +s +seconds + + + + +0.0 1.0 +.01 + + + +Disabled +Enabled + + + +0.1 0.4 +.01 + + +0.1 0.4 +.01 + + +0 127 +1 +m/s +meters per second + + +-0.1745 +0.1745 +0.01 +rad +radians + + +-0.1745 +0.1745 +0.01 +rad +radians + + +-0.1745 +0.1745 +0.01 +rad +radians + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw136 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 + + + +0.001 0.5 +.01 + + +0 10 +1 + + + +Disabled +Enable EKF2 +Enable EKF3 + + + + + + +Disabled +ArmingOnly +ArmOrDisarm + + + + +Disabled +THR_MIN PWM when disarmed +0 PWM when disarmed + + + +0:All,1:Barometer,2:Compass,3:GPS lock,4:INS,5:Parameters,6:RC,7:Board voltage,8:Battery Level,9:Airspeed,10:Logging Available,11:Hardware safety switch,12:GPS Configuration + +None +All +Barometer +Compass +GPS Lock +INS(INertial Sensors - accels & gyros) +Parameters(unused) +RC Failsafe +Board voltage +Battery Level +Airspeed +LoggingAvailable +Hardware safety switch +GPS configuration + + + +0.25 3.0 +m/s/s +meters per square second + + +0.1 +V +volt + + +0.1 +V +volt + + + + + +None +I2C-MS4525D0 +Analog +I2C-MS5525 +I2C-MS5525 (0x76) +I2C-MS5525 (0x77) +I2C-SDP3X + + + + +Don't Use +use +UseWhenZeroThrottle + + + +0.1 + + +0.1 + + + + + + + + + +Disable +Enable + + + + + + +Bus0(internal) +Bus1(external) +Bus2(auxillary) + + + + +FirstSensor +2ndSensor + + + + +None +I2C-MS4525D0 +Analog +I2C-MS5525 +I2C-SDP3X + + + + +Don't Use +use +UseWhenZeroThrottle + + + +0.1 + + +0.1 + + + + + + + + + +Disable +Enable + + + + + + +Bus0(internal) +Bus1(external) +Bus2(auxillary) + + + + + + +Disabled +Enabled + + + + +Remain in AVOID_ADSB +Resume previous flight mode +RTL +Resume if AUTO else Loiter + + + + + +s +seconds + + +s +seconds + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell + + + + +Disabled +A0 +A1 +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + + + + +Disabled +A1 +A2 +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + + + + + +A/V +ampere per volt + + +V +volt + + +50 +mA.h +milliampere hour + + +1 +W +watt + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell + + + + +Disabled +A0 +A1 +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + + + + +Disabled +A1 +A2 +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + + + + + +A/V +ampere per volt + + +V +volt + + +50 +mA.h +milliampere hour + + +1 +A +ampere + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + + + + +No PWMs +Two PWMs +Four PWMs +Six PWMs +Three PWMs and One Capture + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled + +True + + + +Disabled +50Hz +75Hz +100Hz +150Hz +200Hz +250Hz +300Hz + +True + + +-32768 32767 + + +0:Ch1,1:Ch2,2:Ch3,3:Ch4,4:Ch5,5:Ch6,6:Ch7,7:Ch8,8:Ch9,9:Ch10,10:Ch11,11:Ch12,12:Ch13,13:Ch14 + +Disabled +Enabled + +True + + +-1 80 +degC +degrees Celsius + + + +AUTO +PX4V1 +Pixhawk +Pixhawk2 +Pixracer +PixhawkMini +Pixhawk2Slim +VRBrain 5.1 +VRBrain 5.2 +VR Micro Brain 5.1 +VR Micro Brain 5.2 +VRBrain Core 1.0 +VRBrain 5.4 +Intel Aero FC +AUAV2.1 + +True + + + +Disabled +Enabled + +True + + +0:ActiveForSafetyEnable,1:ActiveForSafetyDisable,2:ActiveWhenDisarmed + + + + + +Disabled +Enabled + + + + +Disabled +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +0 3600 + + + + + +Servo +Relay + + + +0 50 +ds +deciseconds + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +0 1000 +m +meters + + + +Low +High + + + +0 10000 +ms +milliseconds + + +0 180 +deg +degrees + + + +Disabled +PX4 AUX1 +PX4 AUX2 +PX4 AUX3 +PX4 AUX4(fast capture) +PX4 AUX5 +PX4 AUX6 + + + + +TriggerLow +TriggerHigh + + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + +Disabled +UAVCAN + +True + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + +Disabled +UAVCAN + +True + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + +Disabled +UAVCAN + +True + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + +Disabled +UAVCAN + +True + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + +Disabled +UAVCAN + +True + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + +Disabled +UAVCAN + +True + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + + + + +Disabled +Enabled + + + + +First Relay +Second Relay +Third Relay +Fourth Relay +Servo + + + +1000 2000 +1 +PWM +PWM in microseconds + + +1000 2000 +1 +PWM +PWM in microseconds + + +0 32000 +1 +m +meters + + +0 5000 +1 +ms +milliseconds + + + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-3.142 3.142 +0.01 +rad +radians + + + +Disabled +Internal-Learning +EKF-Learning + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Use Throttle +Use Current + + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw136 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll90 + + + + +Internal +External +ForcedExternal + + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + + +FirstCompass +SecondCompass +ThirdCompass + + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + + + + + + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw136 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll90 + + + + +Internal +External +ForcedExternal + + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw136 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll90 + + + + +Internal +External +ForcedExternal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +4 32 + +Very Strict +Strict +Default +Relaxed + +0.1 + + +500 3000 +1 + + +0:HMC5883,1:LSM303D,2:AK8963,3:BMM150,4:LSM9DS1,5:LIS3MDL,6:AK09916,7:IST8310,8:ICM20948,9:MMC3416,10:QFLIGHT,11:UAVCAN,12:QMC5883 + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + +0 250 +10 +ms +milliseconds +True + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.000001 0.001 +Hz +hertz + + +0.00001 0.001 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +2.0 6.0 +0.5 +m/s +meters per second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + +True + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.00001 0.001 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +2.0 6.0 +0.5 +m/s +meters per second + + +0.5 2.5 +0.1 +m/s/s +meters per square second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + +0.05 0.5 +0.05 +m/s +meters per second + + +0.5 5.0 +0.1 +m/s +meters per second + + +0.01 1.0 +0.1 +m/s +meters per second + + + + + +Disabled +Enabled + + + +-200 +200 +1 + + +-200 +200 +1 + + +-18000 +18000 +1 + + +m +meters + + +m +meters + + +m +meters + + +0 127 + + + + +True +True +1 +Pa +pascal + + +True +1 +degC +degrees Celsius + + +0.1 +m +meters + + + +FirstBaro +2ndBaro +3rdBaro + + + + +Disabled +Bus0 +Bus1 + + + +1.0:Freshwater,1.024:Saltwater + + +True +True +1 +Pa +pascal + + +True +True +1 +Pa +pascal + + + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +QURT +ERB +MAV +NOVA + +True + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +QURT +ERB +MAV +NOVA + +True + + + +Portable +Stationary +Pedestrian +Automotive +Sea +Airborne1G +Airborne2G +Airborne4G + + + + +Disabled +UseBest +Blend + + + + +Any +FloatRTK +IntegerRTK + +True + + + +Disabled +Enabled +NoChange + + + +-100 90 +deg +degrees + + + +send to first GPS +send to 2nd GPS +send to all + + + + +None (0x0000) +All (0xFFFF) +External only (0xFF00) + + + + +Disabled +log every sample +log every 5 samples + +True + + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + + + + +Do not save config +Save config +Save only when needed + + + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + + + + +Disables automatic configuration +Enable automatic configuration + + + +50 200 + +10Hz +8Hz +5Hz + +ms +milliseconds + + +50 200 + +10Hz +8Hz +5Hz + +ms +milliseconds + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +0 250 +ms +milliseconds +True + + +0 250 +ms +milliseconds +True + + +0:Horiz Pos,1:Vert Pos,2:Speed + + +5.0 30.0 +s +seconds + + + + + +Disabled +Enabled + + + + +None +Chan1 +Chan2 +Chan3 +Chan4 +Chan5 +Chan6 +Chan7 +Chan8 +Chan9 +Chan10 +Chan11 +Chan12 +Chan13 +Chan14 +Chan15 +Chan16 + + + +0.1 5 +s +seconds + + +1 10 +s +seconds + + +100 100000 + + +1000 2000 + + +1000 2000 + + +1000 2000 + + +1000 2000 + + + +None +RPM1 +RPM2 + + + +0 100 + + + + + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +0 127 +Hz +hertz + + +0 127 +Hz +hertz + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +0.05 50 + + + +Never +Start-up only + + + + +Don't adjust the trims +Assume first orientation was level +Assume ACC_BODYFIX is perfectly aligned to the vehicle + + + + +IMU 1 +IMU 2 +IMU 3 + + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +True + + +True + + +True + + +True + + +True + + +True + + + + + + +0 5 +0.5 +m +meters + + +0 90 +0.1 +deg +degrees + + +cdeg +centidegrees + + +0.1 +m +meters + + +0.1 +s +seconds + + +0 30 +0.1 +m +meters + + +0 10 +0.1 +s +seconds + + +0 30 +0.1 +m/s +meters per second + + +0 127 +1 +% +percent + + +0 127 +1 +s +seconds + + + +Disabled +Servos to Neutral +Servos to Zero PWM + + + + +Disabled +Enabled + + + +0 100 +% +percent + + + +Standard Glide Slope +Deepstall + + + + + +0 20 +m/s +meters per second + + + + + + +10 200 +m +meters + + +0 20 +m/s +meters per second + + +0 2 +s +seconds + + +900 2100 +PWM +PWM in microseconds + + +5 20 +m/s +meters per second + + +5 20 +m/s +meters per second + + +5 50 +m +meters + + +0 1 + + + + + + + + + + + + + + + +None +File +MAVLink +BothFileAndMAVLink + + + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + + +0 32766 +1 + + + +Resume Mission +Restart Mission + + + + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + +0 100 +1 + + +0.0 0.2 +.005 +s +seconds + + +0.0 0.2 +.005 +s +seconds + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + +True + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + +0.0 0.2 +.005 +s +seconds + + +0.0 0.2 +.005 +s +seconds + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + + + + + +1 60 +1 +s +seconds + + +0.6 1.0 +0.05 + + +0 0.1 +0.01 + + +0 89 +deg +degrees + + + + + +Off +Low +Medium +High + + + + +Disable +Enable + + + + +Disable +Enable + + + + +Disable +ssd1306 +sh1106 + + + + +Disabled +Aircraft +Rover + + + + + +0.4 1.0 +0.1 +s +seconds + + +0.1 3.0 +0.1 + + +0 0.1 +0.01 + + +0 0.5 +0.05 + + +0 100 +1 +deg/s +degrees per second + + +0 100 +1 +deg/s +degrees per second + + +0.7 1.5 +0.05 + + +0 4500 +1 + + +0.1 4.0 +0.1 + + + + + +Disable +Enable +Enable VTOL AUTO + + + +1000 8000 +cdeg +centidegrees + + +0 30000 +ms +milliseconds + + +1.000 3.000 + + +0.500 2.000 + + +0.1 6.0 +0.1 + + +0.02 1.00 +0.01 + + +0 4500 +10 +cm/s/s +centimeters per square second + + +1.000 8.000 + + +0.500 1.500 + + +0.000 3.000 + + +0 1000 +d% +decipercent + + +0.000 0.400 + + +1.000 100.000 +Hz +hertz + + +50 500 +10 +cm/s +centimeters per second + + +50 500 +10 +cm/s/s +centimeters per square second + + +50 500 +10 +Hz +hertz + + +800 2200 +1 +Hz +hertz + + +800 2200 +1 +Hz +hertz + + +0 100 +0.1 +m/s +meters per second + + +50 500 +1 +deg/s +degrees per second + + +30 200 +10 +cm/s +centimeters per second + + +0.5 50 +0.1 +m +meters + + +0 30 +1 +deg +degrees + + + +Undefined +Quad +Hexa +Octa +OctaQuad +Y6 +Tri + TailSitter + + + + +Plus +X +V +H +V-Tail +A-Tail +Y6B +Y6F + + + +0 0.5 +0.01 + + +0 1 +0.01 + + +0 10 +0.1 + + +1 200 +1 +m +meters + + + +Disabled +Enabled + + + + + +10 300 +1 +deg/s +degrees per second + + +20 80 +1 +deg +degrees + + + +Disabled +Enabled + + + + +Disabled +ThrottleInput +FullInput + + + +0 10 +0.25 + + + +Disabled +Enabled + + + +0 90 +1 +deg +degrees + + + +Continuous +Binary +VectoredYaw + + + +5 80 + + +10 300 +1 +deg/s +degrees per second + + + +MultiCopterInput +FixedWingInput + + + +0:Aileron,1:Elevator,2:Throttle,3:Rudder + + + +Disabled +Channel1 +Channel2 +Channel3 +Channel4 +Channel5 +Channel6 +Channel7 +Channel8 + + + +0 1 +0.01 + + +0 1 +0.01 + + +0 30 + + +0 4 +0.1 + + + +AUTO +FIXED_WING +QUADROTOR +COAXIAL +HELICOPTER +AIRSHIP +FREE_BALLOON +ROCKET +GROUND_ROVER +SURFACE_BOAT +SUBMARINE +FLAPPING_WING +KITE +VTOL_DUOROTOR +VTOL_QUADROTOR +VTOL_TILTROTOR + + + +0:LevelTransition,1:AllowFWTakeoff,2:AllowFWLand + + +0.2 5 +0.1 +m/s/s +meters per square second + + + + +0.08 0.30 +0.005 + + +0.01 0.5 +0.01 + + +0 1 +0.01 +% +percent + + +0.0 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz +hertz + + +0.08 0.30 +0.005 + + +0.01 0.5 +0.01 + + +0 1 +0.01 +% +percent + + +0.0 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz +hertz + + +0.10 0.50 +0.005 + + +0.010 0.05 +0.01 + + +0 1 +0.01 +% +percent + + +0.000 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz +hertz + + +0.1 0.25 + + +0.5 0.9 + + +0.5 0.9 + + + + +0 500 +PWM +PWM in microseconds + + +0.25 0.8 + + +0.9:Low, 0.95:Default, 1.0:High + + +6 35 +V +volt + + +6 35 +V +volt + + +0 200 +A +ampere + + + +Normal +OneShot +OneShot125 +Brushed + +True + + +0 2000 +PWM +PWM in microseconds + + +0 2000 +PWM +PWM in microseconds + + +0.0:Low, 0.15:Default, 0.3:High + + +0.0:Low, 0.1:Default, 0.2:High + + +0 10 +s +seconds + + +0.2 0.8 + + + +Disabled +Learn +LearnAndSave + + + + +PWM enabled while disarmed +PWM disabled while disarmed + + + +5 80 +1 +deg +degrees + + +0 2 +0.1 +s +seconds + + +0 5 +0.1 + + + + +0.5 5 +0.1 +Hz +hertz + + + + +20 2000 +50 +cm/s +centimeters per second + + +10 1000 +1 +cm +centimeters + + +10 1000 +50 +cm/s +centimeters per second + + +10 500 +10 +cm/s +centimeters per second + + +20 2000 +50 +cm/s +centimeters per second + + +50 500 +10 +cm/s/s +centimeters per square second + + +50 500 +10 +cm/s/s +centimeters per square second + + +500 5000 +1 +cm/s/s/s +centimeters per cubic second + + +100 981 +1 +cm/s/s +centimeters per square second + + +25 250 +1 +cm/s/s +centimeters per square second + + + +Disable +Enable + + + + + + + +0.1 +km +kilometers + + + +DoNotIncludeHome +IncludeHome + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + + + + +Disabled +APM2 A9 pin +APM1 relay +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +APM2 A9 pin +APM1 relay +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +APM2 A9 pin +APM1 relay +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +APM2 A9 pin +APM1 relay +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Off +On +NoChange + + + + + +0.4 1.0 +0.1 +s +seconds + + +0.1 4.0 +0.1 + + +0 0.1 +0.01 + + +0 1.0 +0.05 + + +0 180 +1 +deg/s +degrees per second + + +0 4500 +1 + + +0.1 4.0 +0.1 + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TrOneI2C +LidarLiteV3-I2C +VL53L0X + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TrOneI2C +LidarLiteV3-I2C +VL53L0X + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TrOneI2C +LidarLiteV3-I2C +VL53L0X + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TrOneI2C +LidarLiteV3-I2C +VL53L0X + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + + +None +PX4-PWM +AUXPIN + + + +0.001 + + +1 + + +1 + + +0.1 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +None +PX4-PWM +AUXPIN + + + +0.001 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + + + +Disabled +AnalogPin +RCChannelPwmValue +ReceiverProtocol + + + + +APM2 A0 +APM2 A1 +APM2 A13 +Pixracer +Pixhawk ADC4 +Pixhawk ADC3 + Pixhawk ADC6 +Pixhawk SBUS + + + +0 5.0 +0.01 +V +volt + + +0 5.0 +0.01 +V +volt + + + + +0 2000 +PWM +PWM in microseconds + + +0 2000 +PWM +PWM in microseconds + + + + + +Disabled +ShowSlips +ShowOverruns + + + + +50Hz +100Hz +200Hz +250Hz +300Hz +400Hz + +True + + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +460800 +500000 +921600 +1500000 + + + + +MAVlink1 +MAVLink2 + +True + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Lidar +FrSky SPort Passthrough (OpenTX) +Lidar360 +Aerotenna uLanding +Beacon + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Lidar +FrSky SPort Passthrough (OpenTX) +Lidar360 +Aerotenna uLanding +Beacon + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Lidar +FrSky SPort Passthrough (OpenTX) +Lidar360 +Aerotenna uLanding +Beacon + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Lidar +FrSky SPort Passthrough (OpenTX) +Lidar360 +Aerotenna uLanding +Beacon + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Lidar +FrSky SPort Passthrough (OpenTX) +Lidar360 +Aerotenna uLanding +Beacon + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + + + +Disable +Enable + + + +25 400 +Hz +hertz + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 + + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 + + + + + + +Disable +Enable + + + +0 10 +m/s +meters per second + + +0 100 +m +meters + + +0 32768 +s +seconds + + +0 32768 +s +seconds + + +0 0.5 +m.m/s/s +square meter per square second + + +0 1000.0 +m +meters + + +0 1000.0 +m +meters + + +0 1000.0 +m +meters + + +0 16 + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 50 +1 +Hz +hertz + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 50 +1 +Hz +hertz + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 50 +1 +Hz +hertz + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 50 +1 +Hz +hertz + + + + +True + + +True +s +seconds + + +True +s +seconds + + +True +s +seconds + + + + +0.4 1.0 +0.1 +s +seconds + + +0.1 10.0 +0.1 + + +0 1.0 +0.05 + + +0 0.1 +0.01 + + +0 4500 +1 +cdeg +centidegrees + + +0 5 +0.1 +m/s +meters per second + + +0.0 10.0 +0.1 + + +0.0 30.0 +0.1 +m/s +meters per second + + +0.0 50.0 +0.1 +deg/m/s +degrees per meter per second + + +0.0 4500.0 +0.1 +cdeg +centidegrees + + + + +0.1 20.0 +0.1 + + +0.1 10.0 +0.1 + + +3.0 10.0 +0.2 + + +0.1 1.0 +0.1 + + +0.0 0.5 +0.02 + + +1.0 10.0 +0.5 + + +1.0 5.0 +0.05 + + +0.5 2.0 +0.05 + + +5.0 30.0 +1.0 + + +0.0 2.0 +0.1 + + +0.1 1.0 +0.1 + + +0.0 20.0 +0.1 + + +-1 127 +1 + + +-1 100 +0.1 + + +-1.0 2.0 +0.1 + + +0 45 +1 + + +-45 0 +1 + + +0.0 2.0 +0.1 + + +1.0 5.0 +0.2 + + +0.1 1.0 +0.1 + + +-5 40 +1 + + +0.0 20.0 +0.1 +m/s +meters per second + + +-2.0 2.0 +0.1 +m/s/m +meters per second per meter + + +0.1 1.0 +0.1 + + +0.0 0.5 +0.02 + + +0.0 0.5 +0.02 + + +0.1 1.0 +0.1 + + + +Disable +Enable + + + + + + +Disable +Enable + + + +1 +m +meters + + + + + +None +RateRollPI +RateRollP +RateRollI +RateRollD +RatePitchPI +RatePitchP +RatePitchI +RatePitchD +RateYawPI +RateYawP +RateYawI +RateYawD +AngleRollP +AnglePitchP +AngleYawP +PosXYP +PosZP +VelXYP +VelXYI +VelZP +AccelZP +AccelZI +AccelZD +FixedWingRollP +FixedWingRollI +FixedWingRollD +FixedWingRollFF +FixedWingPitchP +FixedWingPitchI +FixedWingPitchD +FixedWingPitchFF +Set_RateRollPitch +Set_RateRoll +Set_RatePitch +Set_RateYaw +Set_AngleRollPitch +Set_VelXY +Set_AccelZ + + + + +Disable +Chan5 +Chan6 +Chan7 +Chan8 +Chan9 +Chan10 +Chan11 +Chan12 +Chan13 +Chan14 +Chan15 +Chan16 + + + +900 2100 + + +900 2100 + + + +Disable +Chan1 +Chan3 +Chan3 +Chan4 +Chan5 +Chan6 +Chan7 +Chan8 +Chan9 +Chan10 +Chan11 +Chan12 +Chan13 +Chan14 +Chan15 +Chan16 + + + + + + +Disable +Enable + + + +0 1 + + + + +0 4 +0.25 + + +0 2 +0.25 + + +0 2 +0.25 + + +0.8 1.2 +0.05 + + +0 4500 +1 + + + diff --git a/src/FirmwarePlugin/APM/APMParameterFactMetaData.Plane.3.9.xml b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Plane.3.9.xml new file mode 100644 index 0000000..0a5b4dd --- /dev/null +++ b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Plane.3.9.xml @@ -0,0 +1,10620 @@ + + + + + + + + +1 255 + + +1 255 + + +1 10 +1 + + +0 30 +1 +s +seconds + + +0:Roll,1:Pitch,2:Yaw,3:Steering,4:Landing + + +0 1 +0.01 + + +0 5 +0.01 + + +0 15 +0.1 +deg +degrees + + +0 1000 +1 +m +meters + + +0 100 +1 +m +meters + + + +Disabled +FBWMixing +DirectMixing + + + + +Disabled +Enabled + + + +0 30 +0.1 +m/s +meters per second + + +0 30 +0.1 +m/s/s +meters per square second + + +0 127 +1 +ds +deciseconds + + +-100 100 +1 +% +percent + + +0 30 +0.1 +m/s +meters per second + + +0 30 +0.1 +m/s +meters per second + + +-1 127 +1 +%/s +percent per second + + +0 10 +0.5 +s +seconds + + +0 100 +% +percent + + + + +0 45 +1 +deg +degrees + + +0:AUTO_ALWAYS,1:AUTO_LAND,2:AUTO_LOITER_TO_ALT,3:AUTO_LOITER_ALL,4:AUTO_WAYPOINTS,5:LOITER,6:RTL,7:CIRCLE,8:CRUISE,9:FBWB,10:GUIDED + +Never +AutoAlways +AutoLanding + + + + +Default +L1Controller + + + + +Automatic + + + +-32767 32767 +1 +m +meters + + +1 32767 +1 +m +meters + + +0 32767 +1 +m +meters + + +-32767 32767 +1 +m +meters + + +-32767 32767 +1 +m +meters + + + +None +GuidedMode +ReportOnly +GuidedModeThrPass +RTL_Mode + + + + + + + +0 32767 +1 +m +meters + + +0 32767 +1 +m +meters + + +0 32767 +1 +m +meters + + + +NoAutoEnable +AutoEnable +AutoEnableDisableFloorOnly + + + + +FenceReturnPoint +NearestRallyPoint + + + + +Disabled +Enabled + + + +5 100 +1 +m/s +meters per second + + +5 100 +1 +m/s +meters per second + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +0 10000 +m +meters + + +1 10 +0.1 +m/s +meters per second + + +-100 100 +1 +% +percent + + +0 100 +1 +% +percent + + +0 100 +1 +% +percent + + +0 127 +1 +%/s +percent per second + + +0 100 +1 +%/s +percent per second + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +925 2200 +1 + + +0 100 +1 +% +percent + + + +Disabled +Enabled + + + + +CIRCLE/no change(if already in AUTO|GUIDED|LOITER) +CIRCLE +FBWA +Disable + + + +1 100 +0.5 +s +seconds + + + +Continue +ReturnToLaunch +Glide +Deploy Parachute + + + +1 300 +0.5 +s +seconds + + + +Disabled +Heartbeat +HeartbeatAndREMRSSI +HeartbeatAndAUTO + + + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL + + + +0 9000 +1 +cdeg +centidegrees + + +0 9000 +1 +cdeg +centidegrees + + +-9000 0 +1 +cdeg +centidegrees + + +10 500 +1 +deg/s +degrees per second + + +10 500 +1 +deg/s +degrees per second + + + +Disabled +Enabled + + + +-100 100 +0.1 +m +meters + + +10 360 +1 +deg/s +degrees per second + + + +Disabled +Enabled + + + +0.5 1.2 + + + +Disabled +Enabled + + + +-1000 1000 +d% +decipercent + + +-100 100 +% +percent + + +True + + +0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:CTUN,5:NTUN,6:MODE,7:IMU,8:CMD,9:CURRENT,10:COMPASS,11:TECS,12:CAMERA,13:RC,14:SONAR,15:ARM/DISARM,19:IMU_RAW + +Disabled +PX4/Pixhawk-Default + + + + + + + +cm/s +centimeters per second + + +m/s +meters per second + + +cm/s +centimeters per second + + +cdeg +centidegrees + + +cm +centimeters + + +cm +centimeters + + + +Disabled +Enabled + + + + + +0 100 +% +percent + + +0 100 +1 +m/s +meters per second + + +0 100 +% +percent + + +0 100 +1 +m/s +meters per second + + + + + + + +Disabled +Channel1 +Channel2 +Channel3 +Channel4 +Channel5 +Channel6 +Channel7 +Channel8 + + + + +Disabled +Enabled + +True + + + +Disabled +Enabled + + + +0 90 +0.1 +deg +degrees + + + +Disable +Enable - go HOME then land +Enable - go directly to landing sequence + + + +10 127 +m/s/s +meters per square second + + +0:Disarm + + + + + +Disabled +Enabled + + + + +NotEnforced +Enforced + + + +0 100 +1 +% +percent + + +0:Chan1,1:Chan2,2:Chan3,3:Chan4,4:Chan5,5:Chan6,6:Chan7,7:Chan8,8:Chan9,9:Chan10,10:Chan11,11:Chan12,12:Chan13,13:Chan14,14:Chan15,15:Chan16 + + +-1 127 + +Never reset +Always reset + +m +meters + + + + + +Disabled +Enabled + + + +1 100 + + +1 100000 + + +-1 16777215 + + + +NoInfo +Light +Small +Large +HighVortexlarge +Heavy +HighlyManuv +Rotocraft +RESERVED +Glider +LightAir +Parachute +UltraLight +RESERVED +UAV +Space +RESERVED +EmergencySurface +ServiceSurface +PointObstacle + + + + +NO_DATA +L15W23 +L25W28P5 +L25W34 +L35W33 +L35W38 +L45W39P5 +L45W45 +L55W45 +L55W52 +L65W59P5 +L65W67 +L75W72P5 +L75W80 +L85W80 +L85W90 + + + + +NoData +Left2m +Left4m +Left6m +Center +Right2m +Right4m +Right6m + + + + +NO_DATA +AppliedBySensor + + + + +Disabled +Rx-Only +Tx-Only +Rx and Tx Enabled + + + +octal +octal + + +0:UAT_in,1:1090ES_in,2:UAT_out,3:1090ES_out + +Unknown +Rx UAT only +Rx UAT and 1090ES +Rx&Tx UAT and 1090ES + + + + + + + + + + + + + + + + + + + + + +m +meters + + +m +meters + + +mbar +millibar + + + + + + + + + + + + + + +s +seconds + + + + +0.0 1.0 +.01 + + + +Disabled +Enabled + + + +0.1 0.4 +.01 + + +0.1 0.4 +.01 + + +0 127 +1 +m/s +meters per second + + +-0.1745 +0.1745 +0.01 +rad +radians + + +-0.1745 +0.1745 +0.01 +rad +radians + + +-0.1745 +0.1745 +0.01 +rad +radians + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 +Custom + + + +0.001 0.5 +.01 + + +0 10 +1 + + + +Disabled +Enable EKF2 +Enable EKF3 + + + +-180 180 +1 +deg +degrees + + +-180 180 +1 +deg +degrees + + +-180 180 +1 +deg +degrees + + + + + +Disabled +ArmingOnly +ArmOrDisarm + + + + +Disabled +THR_MIN PWM when disarmed +0 PWM when disarmed + + + +0:All,1:Barometer,2:Compass,3:GPS lock,4:INS,5:Parameters,6:RC Channels,7:Board voltage,8:Battery Level,9:Airspeed,10:Logging Available,11:Hardware safety switch,12:GPS Configuration + +None +All +Barometer +Compass +GPS Lock +INS(INertial Sensors - accels & gyros) +Parameters(unused) +RC Channels +Board voltage +Battery Level +Airspeed +LoggingAvailable +Hardware safety switch +GPS configuration + + + +0.25 3.0 +m/s/s +meters per square second + + +0.1 +V +volt + + +0.1 +V +volt + + + + + +None +I2C-MS4525D0 +Analog +I2C-MS5525 +I2C-MS5525 (0x76) +I2C-MS5525 (0x77) +I2C-SDP3X + + + + +Don't Use +use +UseWhenZeroThrottle + + + +0.1 + + +0.1 + + + + + + + + + +Disable +Enable + + + + + + +Bus0(internal) +Bus1(external) +Bus2(auxillary) + + + + +FirstSensor +2ndSensor + + + + +None +I2C-MS4525D0 +Analog +I2C-MS5525 +I2C-MS5525 (0x76) +I2C-MS5525 (0x77) +I2C-SDP3X + + + + +Don't Use +use +UseWhenZeroThrottle + + + +0.1 + + +0.1 + + + + + + + + + +Disable +Enable + + + + + + +Bus0(internal) +Bus1(external) +Bus2(auxillary) + + + + + + +Disabled +Enabled + + + + +Remain in AVOID_ADSB +Resume previous flight mode +RTL +Resume if AUTO else Loiter + + + + + +s +seconds + + +s +seconds + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC + +True + + + +Disabled +A0 +A1 +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +A1 +A2 +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None + + + + +None + + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC + +True + + + +Disabled +A0 +A1 +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +A1 +A2 +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None + + + + +None + + + + + + +No PWMs +One PWMs +Two PWMs +Three PWMs +Four PWMs +Five PWMs +Six PWMs +Seven PWMs +Eight PWMs + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled + +True + + + +Disabled +50Hz +75Hz +100Hz +150Hz +200Hz +250Hz +300Hz + +True + + +-32768 32767 + + +0:Ch1,1:Ch2,2:Ch3,3:Ch4,4:Ch5,5:Ch6,6:Ch7,7:Ch8,8:Ch9,9:Ch10,10:Ch11,11:Ch12,12:Ch13,13:Ch14 + +Disabled +Enabled + +True + + +-1 80 +degC +degrees Celsius + + + +AUTO +PX4V1 +Pixhawk +Cube/Pixhawk2 +Pixracer +PixhawkMini +Pixhawk2Slim +VRBrain 5.1 +VRBrain 5.2 +VR Micro Brain 5.1 +VR Micro Brain 5.2 +VRBrain Core 1.0 +VRBrain 5.4 +Intel Aero FC +AUAV2.1 + +True + + + +Disabled +Enabled + +True + + +0:ActiveForSafetyEnable,1:ActiveForSafetyDisable,2:ActiveWhenArmed + + +0 32 +1 + + + + + +None +CYRF6936 + + + + +Auto +DSM2 +DSMX + + + +0 4 + + + +NotDisabled +Disabled + + + +0 16 + + +0 16 + + + +Disabled +Enabled + + + +1 8 + + + +Disabled +MinChannel +MidChannel +MaxChannel +MinChannelCW +MidChannelCW +MaxChannelCW + + + + +Mode1 +Mode2 + + + + +Disabled +TestChan1 +TestChan2 +TestChan3 +TestChan4 +TestChan5 +TestChan6 +TestChan7 +TestChan8 + + + +0 16 + + +0 16 + + +1 8 + + +0 40 + + +0 120 + + +0 31 + + + + +0:GPS,1:MAVLINK_SYSTEM_TIME,2:HW + + + + + +Disabled +Enabled + + + + +Disabled +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +0 3600 + + + + + +Servo +Relay + + + +0 50 +ds +deciseconds + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +0 1000 +m +meters + + + +Low +High + + + +0 10000 +ms +milliseconds + + +0 180 +deg +degrees + + + +Disabled +PX4 AUX1 +PX4 AUX2 +PX4 AUX3 +PX4 AUX4(fast capture) +PX4 AUX5 +PX4 AUX6 + +True + + + +TriggerLow +TriggerHigh + + + + +Always +Only when in AUTO + + + + + + +Disabled +UAVCAN + +True + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +UAVCAN + +True + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +UAVCAN + +True + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +Enabled + + + + +First Relay +Second Relay +Third Relay +Fourth Relay +Servo + + + +1000 2000 +1 +PWM +PWM in microseconds + + +1000 2000 +1 +PWM +PWM in microseconds + + +0 32000 +1 +m +meters + + +0 5000 +1 +ms +milliseconds + + + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-3.142 3.142 +0.01 +rad +radians + + + +Disabled +Internal-Learning +EKF-Learning + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Use Throttle +Use Current + + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + + +FirstCompass +SecondCompass +ThirdCompass + + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + + + + + + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +4 32 + +Very Strict +Strict +Default +Relaxed + +0.1 + + +500 3000 +1 + + +0:HMC5883,1:LSM303D,2:AK8963,3:BMM150,4:LSM9DS1,5:LIS3MDL,6:AK09916,7:IST8310,8:ICM20948,9:MMC3416,11:UAVCAN,12:QMC5883 + + +0 100 +1 +% +percent + + + +Disabled +CheckOnly +CheckAndFix + + + + + + +Disabled +Enabled + + + +0 2 +0.01 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + +0 250 +10 +ms +milliseconds +True + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.000001 0.001 +Hz +hertz + + +0.00001 0.001 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +2.0 6.0 +0.5 +m/s +meters per second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + +True + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.00001 0.001 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +2.0 6.0 +0.5 +m/s +meters per second + + +0.5 2.5 +0.1 +m/s/s +meters per square second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + +0.05 0.5 +0.05 +m/s +meters per second + + +0.5 5.0 +0.1 +m/s +meters per second + + +0.01 1.0 +0.1 +m/s +meters per second + + + + + +Disabled +Enabled + + + +-200 +200 +1 + + +-200 +200 +1 + + +-18000 +18000 +1 + + +m +meters + + +m +meters + + +m +meters + + +0 127 + + + + +True +True +1 +Pa +pascal + + +True +1 +degC +degrees Celsius + + +0.1 +m +meters + + + +FirstBaro +2ndBaro +3rdBaro + + + + +Disabled +Bus0 +Bus1 + + + +1.0:Freshwater,1.024:Saltwater + + +True +True +1 +Pa +pascal + + +True +True +1 +Pa +pascal + + +0 100 +1 +% +percent + + + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA + +True + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA + +True + + + +Portable +Stationary +Pedestrian +Automotive +Sea +Airborne1G +Airborne2G +Airborne4G + + + + +Disabled +UseBest +Blend + + + + +Any +FloatRTK +IntegerRTK + +True + + + +Disabled +Enabled +NoChange + + + +-100 90 +deg +degrees + + + +send to first GPS +send to 2nd GPS +send to all + + + + +None (0x0000) +All (0xFFFF) +External only (0xFF00) + + + + +Ignore +Always log +Stop logging when disarmed (SBF only) +Only log every five samples (uBlox only) + +True + + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + + + + +Do not save config +Save config +Save only when needed + + + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + + + + +Disables automatic configuration +Enable automatic configuration + + + +50 200 + +10Hz +8Hz +5Hz + +ms +milliseconds + + +50 200 + +10Hz +8Hz +5Hz + +ms +milliseconds + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +0 250 +ms +milliseconds +True + + +0 250 +ms +milliseconds +True + + +0:Horiz Pos,1:Vert Pos,2:Speed + + +5.0 30.0 +s +seconds + + + + + +Disabled +Enabled + + + + +None +Servo +EPM + + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +0 255 +s +seconds + + +0 255 + + + + + +Disabled +Enabled + + + + +None +Chan1 +Chan2 +Chan3 +Chan4 +Chan5 +Chan6 +Chan7 +Chan8 +Chan9 +Chan10 +Chan11 +Chan12 +Chan13 +Chan14 +Chan15 +Chan16 + + + +0.1 5 +s +seconds + + +1 10 +s +seconds + + +100 100000 + + +1000 2000 + + +1000 2000 + + +1000 2000 + + +1000 2000 + + + +None +RPM1 +RPM2 + + + +0 100 + + + + + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +0 127 +Hz +hertz + + +0 127 +Hz +hertz + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +0.05 50 + + + +Never +Start-up only + + + + +Don't adjust the trims +Assume first orientation was level +Assume ACC_BODYFIX is perfectly aligned to the vehicle + + + + +IMU 1 +IMU 2 +IMU 3 + + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +True + + +True + + +True + + +True + + +True + + +True + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU + +FirstIMUOnly +FirstAndSecondIMU + + + + + +32 + + +0:IMU1,1:IMU2,2:IMU3 + +None +First IMU +All + + + +0:Sensor-Rate Logging (sample at full sensor rate seen by AP) + + +ms +milliseconds +10 + + +1 + + + + + +Disabled +Enabled + + + +10 200 +Hz +hertz + + +5 50 +Hz +hertz + + +5 30 +dB +decibel + + + + +0 5 +0.5 +m +meters + + +0 90 +0.1 +deg +degrees + + +cdeg +centidegrees + + +0.1 +m +meters + + +0.1 +s +seconds + + +0 30 +0.1 +m +meters + + +0 10 +0.1 +s +seconds + + +0 30 +0.1 +m/s +meters per second + + +0 127 +1 +% +percent + + +0 127 +1 +s +seconds + + + +Disabled +Servos to Neutral +Servos to Zero PWM + + + + +Disabled +Enabled + + + +0 100 +% +percent + + + +Standard Glide Slope +Deepstall + + + + + +0 20 +m/s +meters per second + + + + + + +10 200 +m +meters + + +0 20 +m/s +meters per second + + +0 2 +s +seconds + + +900 2100 +PWM +PWM in microseconds + + +5 20 +m/s +meters per second + + +5 20 +m/s +meters per second + + +5 50 +m +meters + + +0 1 + + +0 2.0 + + + + + + + + + + + + + + + +None +File +MAVLink +BothFileAndMAVLink + + + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +kB +kilobytes + + + + +0 32766 +1 + + + +Resume Mission +Restart Mission + + + +0:Clear Mission on reboot + + + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + +0 100 +1 + + +0.0 0.2 +.005 +s +seconds + + +0.0 0.2 +.005 +s +seconds + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + +True + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + +0.0 0.2 +.005 +s +seconds + + +0.0 0.2 +.005 +s +seconds + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + + + + + +1 60 +1 +s +seconds + + +0.6 1.0 +0.05 + + +0 0.1 +0.01 + + +0 89 +deg +degrees + + + + + +Off +Low +Medium +High + + + + +Disable +Enable + + + + +Disable +Enable + + + + +Disable +ssd1306 +sh1106 + + + + +Disabled +Aircraft +Rover + + + + +Disabled + + + +0:Build in LED, 1:Internal ToshibaLED, 2:External ToshibaLED, 3:External PCA9685, 4:Oreo LED, 5:UAVCAN, 6:NCP5623 External, 7:NCP5623 Internal + + + + + +None +MAX7456 + +True + + + +Disable +Chan5 +Chan6 +Chan7 +Chan8 +Chan9 +Chan10 +Chan11 +Chan12 +Chan13 +Chan14 +Chan15 +Chan16 + + + +0:UseDecimalPack, 1:InvertedWindPointer, 2:InvertedAHRoll + + +True + + +0 31 +True + + +0 63 +True + + +0 99 + + +1 30 + + +0 100 + + + +Metric +Imperial +SI +Aviation + + + +1 20 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + +0.4 1.0 +0.1 +s +seconds + + +0.1 3.0 +0.1 + + +0 0.1 +0.01 + + +0 0.5 +0.05 + + +0 100 +1 +deg/s +degrees per second + + +0 100 +1 +deg/s +degrees per second + + +0.7 1.5 +0.05 + + +0 4500 +1 + + +0.1 4.0 +0.1 + + + + + +Disable +Enable +Enable VTOL AUTO + + + +1000 8000 +cdeg +centidegrees + + +0 30000 +ms +milliseconds + + +50 500 +10 +cm/s +centimeters per second + + +50 500 +10 +cm/s/s +centimeters per square second + + +50 500 +10 +Hz +hertz + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +0 100 +0.1 +m/s +meters per second + + +50 500 +1 +deg/s +degrees per second + + +30 200 +10 +cm/s +centimeters per second + + +0.5 50 +0.1 +m +meters + + +0 30 +1 +deg +degrees + + + +Undefined +Quad +Hexa +Octa +OctaQuad +Y6 +Tri + TailSitter + + + + +Plus +X +V +H +V-Tail +A-Tail +Y6B +Y6F + + + +0 0.5 +0.01 + + +0 1 +0.01 + + +0 10 +0.1 + + +1 200 +1 +m +meters + + + +Disabled +Enabled + + + + + +10 300 +1 +deg/s +degrees per second + + +20 80 +1 +deg +degrees + + + +Disabled +Enabled + + + + +Disabled +ThrottleInput +FullInput + + + +0 10 +0.25 + + + +Disabled +Enabled + + + +0 90 +1 +deg +degrees + + + +Continuous +Binary +VectoredYaw + + + +5 80 + + +10 300 +1 +deg/s +degrees per second + + + +MultiCopterInput +FixedWingInput + + + +0:Aileron,1:Elevator,2:Throttle,3:Rudder + + + +Disabled +Channel1 +Channel2 +Channel3 +Channel4 +Channel5 +Channel6 +Channel7 +Channel8 + + + +0 1 +0.01 + + +0 1 +0.01 + + +0 30 + + +0 4 +0.1 + + + +AUTO +FIXED_WING +QUADROTOR +COAXIAL +HELICOPTER +AIRSHIP +FREE_BALLOON +ROCKET +GROUND_ROVER +SURFACE_BOAT +SUBMARINE +FLAPPING_WING +KITE +VTOL_DUOROTOR +VTOL_QUADROTOR +VTOL_TILTROTOR + + + +0:LevelTransition,1:AllowFWTakeoff,2:AllowFWLand + + +0.2 5 +0.1 +m/s/s +meters per square second + + +1 5 + + + + +500 18000 +100 +cdeg/s +centidegrees per second + + +0 72000 + +Disabled +VerySlow +Slow +Medium +Fast + +1000 +cdeg/s/s +centidegrees per square second + + + +Disabled +Enabled + + + +0 180000 + +Disabled +VerySlow +Slow +Medium +Fast + +1000 +cdeg/s/s +centidegrees per square second + + +0 180000 + +Disabled +VerySlow +Slow +Medium +Fast + +1000 +cdeg/s/s +centidegrees per square second + + + +Disabled +Enabled + + + +0.0 12.000 + + +0.0 12.000 + + +0.0 6.000 + + +0.5 10.0 + + +0 1080 + +Disabled +Slow +Medium +Fast + +1 +deg/s +degrees per second + + +0 1080 + +Disabled +Slow +Medium +Fast + +1 +deg/s +degrees per second + + +0 1080 + +Disabled +Slow +Medium +Fast + +1 +deg/s +degrees per second + + +0 1 +0.5:Very Soft, 0.2:Soft, 0.15:Medium, 0.1:Crisp, 0.05:Very Crisp +0.01 +s +seconds + + +0.05 0.5 +0.005 + + +0.01 2.0 +0.01 + + +0 1 +0.01 +% +percent + + +0.0 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz +hertz + + +0.05 0.50 +0.005 + + +0.01 2.0 +0.01 + + +0 1 +0.01 +% +percent + + +0.0 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz +hertz + + +0.10 2.50 +0.005 + + +0.010 1.0 +0.01 + + +0 1 +0.01 +% +percent + + +0.000 0.02 +0.001 + + +0 0.5 +0.001 + + +1 10 +1 +Hz +hertz + + +0.1 0.25 + + +0.5 0.9 + + +0.1 0.9 + + + + +0 45 +1 +deg +degrees + + +20 2000 +50 +cm/s +centimeters per second + + +100 981 +1 +cm/s/s +centimeters per square second + + +25 250 +1 +cm/s/s +centimeters per square second + + +500 5000 +1 +cm/s/s/s +centimeters per cubic second + + +0 2 +0.1 +s +seconds + + + + +0 500 +PWM +PWM in microseconds + + +0.25 0.8 + + +0.9:Low, 0.95:Default, 1.0:High + + +6 35 +V +volt + + +6 35 +V +volt + + +0 200 +A +ampere + + + +Normal +OneShot +OneShot125 +Brushed +DShot150 +DShot300 +DShot600 +DShot1200 + +True + + +0 2000 +PWM +PWM in microseconds + + +0 2000 +PWM +PWM in microseconds + + +0.0:Low, 0.15:Default, 0.3:High + + +0.0:Low, 0.1:Default, 0.2:High + + +0 10 +s +seconds + + +0.2 0.8 + + + +Disabled +Learn +LearnAndSave + + + + +PWM enabled while disarmed +PWM disabled while disarmed + + + +5 80 +1 +deg +degrees + + +0 2 +0.1 +s +seconds + + +0 5 +0.1 + + + +First battery +Second battery + + + + + +0.5 5 +0.1 +Hz +hertz + + +1.000 3.000 + + +1.000 8.000 + + +0.500 1.500 +0.05 + + +0.000 3.000 + + +0 1000 +d% +decipercent + + +0.000 0.400 + + +1.000 100.000 +Hz +hertz + + +0.500 2.000 + + +0.1 6.0 +0.1 + + +0.02 1.00 +0.01 + + +0.00 1.00 +0.001 + + +0 4500 +10 +cm/s/s +centimeters per square second + + +0 100 +Hz +hertz + + +0 100 +Hz +hertz + + +0 45 +1 +deg +degrees + + + + +20 2000 +50 +cm/s +centimeters per second + + +10 1000 +1 +cm +centimeters + + +10 1000 +50 +cm/s +centimeters per second + + +10 500 +10 +cm/s +centimeters per second + + +50 500 +10 +cm/s/s +centimeters per square second + + +50 500 +10 +cm/s/s +centimeters per square second + + + +Disable +Enable + + + + + + + +0.1 +km +kilometers + + + +DoNotIncludeHome +IncludeHome + + + + + +0.0 120.0 +s +seconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + + + + +Disabled +APM2 A9 pin +APM1 relay +BB Blue GP0 pin 4 +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +BB Blue GP0 pin 3 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1/BB Blue GP0 pin 6 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2/BB Blue GP0 pin 5 + + + + +Disabled +APM2 A9 pin +APM1 relay +BB Blue GP0 pin 4 +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +BB Blue GP0 pin 3 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1/BB Blue GP0 pin 6 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2/BB Blue GP0 pin 5 + + + + +Disabled +APM2 A9 pin +APM1 relay +BB Blue GP0 pin 4 +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +BB Blue GP0 pin 3 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1/BB Blue GP0 pin 6 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2/BB Blue GP0 pin 5 + + + + +Disabled +APM2 A9 pin +APM1 relay +BB Blue GP0 pin 4 +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +BB Blue GP0 pin 3 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1/BB Blue GP0 pin 6 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2/BB Blue GP0 pin 5 + + + + +Off +On +NoChange + + + + + +0.4 1.0 +0.1 +s +seconds + + +0.1 4.0 +0.1 + + +0 0.1 +0.01 + + +0 1.0 +0.05 + + +0 180 +1 +deg/s +degrees per second + + +0 4500 +1 + + +0.1 4.0 +0.1 + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLiteV3HP-I2C + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLiteV3HP-I2C + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLiteV3HP-I2C + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLiteV3HP-I2C + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +PX4-PWM +AUXPIN + + + +0.001 + + +1 + + +1 + + +0.1 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +None +PX4-PWM +AUXPIN + + + +0.001 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + + + +Disabled +AnalogPin +RCChannelPwmValue +ReceiverProtocol + + + + +APM2 A0 +APM2 A1 +APM2 A13 +Pixracer +Pixhawk ADC4 +Pixhawk ADC3 +Pixhawk ADC6 +Pixhawk SBUS +Pixhawk2 ADC + + + +0 5.0 +0.01 +V +volt + + +0 5.0 +0.01 +V +volt + + + + +0 2000 +PWM +PWM in microseconds + + +0 2000 +PWM +PWM in microseconds + + + + + +Disabled +ShowSlips +ShowOverruns + + + + +50Hz +100Hz +200Hz +250Hz +300Hz +400Hz + +True + + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +460800 +500000 +921600 +1500000 + + + + +MAVlink1 +MAVLink2 + +True + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + + + +Disable +Enable + + + +25 400 +Hz +hertz + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + +Disabled +Enabled + + + + +Disabled +TestMotor1 +TestMotor2 +TestMotor3 +TestMotor4 +TestMotor5 +TestMotor6 +TestMotor7 +TestMotor8 + + + +0 300 +s +seconds + + +0 500 +Hz +hertz + + + +Disabled +Enabled + + + + +None +OneShot +OneShot125 +Brushed +DShot150 +DShot300 +DShot600 +DShot1200 + + + + +Console +Telem1 +Telem2 +Telem3 +Telem4 +Telem5 + + + + + +25 250 +Hz +hertz + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + + + +Disable +Enable + + + +0 10 +m/s +meters per second + + +0 100 +m +meters + + +0 32768 +s +seconds + + +0 32768 +s +seconds + + +0 0.5 +m.m/s/s +square meter per square second + + +0 1000.0 +m +meters + + +0 1000.0 +m +meters + + +0 1000.0 +m +meters + + +0 16 + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 50 +1 +Hz +hertz + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 50 +1 +Hz +hertz + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 50 +1 +Hz +hertz + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 50 +1 +Hz +hertz + + + + +True + + +True +s +seconds + + +True +s +seconds + + +True +s +seconds + + + + +0.4 1.0 +0.1 +s +seconds + + +0.1 10.0 +0.1 + + +0 1.0 +0.05 + + +0 0.1 +0.01 + + +0 4500 +1 +cdeg +centidegrees + + +0 5 +0.1 +m/s +meters per second + + +0.0 10.0 +0.1 + + +0.0 30.0 +0.1 +m/s +meters per second + + +0.0 50.0 +0.1 +deg/m/s +degrees per meter per second + + +0.0 4500.0 +0.1 +cdeg +centidegrees + + + + +0.1 20.0 +0.1 + + +0.1 10.0 +0.1 + + +3.0 10.0 +0.2 + + +0.1 1.0 +0.1 + + +0.0 0.5 +0.02 + + +1.0 10.0 +0.5 + + +1.0 5.0 +0.05 + + +0.5 2.0 +0.05 + + +5.0 30.0 +1.0 + + +0.0 2.0 +0.1 + + +0.1 1.0 +0.1 + + +0.0 20.0 +0.1 + + +-1 127 +1 + + +-1 100 +0.1 + + +-1.0 2.0 +0.1 + + +0 45 +1 + + +-45 0 +1 + + +0.0 2.0 +0.1 + + +1.0 5.0 +0.2 + + +0.1 1.0 +0.1 + + +-5 40 +1 + + +0.0 20.0 +0.1 +m/s +meters per second + + +-2.0 2.0 +0.1 +m/s/m +meters per second per meter + + +0.1 1.0 +0.1 + + +0.0 0.5 +0.02 + + +0.0 0.5 +0.02 + + +0.1 1.0 +0.1 + + + +Disable +Enable + + + + + + +Disable +Enable + + + +1 +m +meters + + + + + +None +RateRollPI +RateRollP +RateRollI +RateRollD +RatePitchPI +RatePitchP +RatePitchI +RatePitchD +RateYawPI +RateYawP +RateYawI +RateYawD +AngleRollP +AnglePitchP +AngleYawP +PosXYP +PosZP +VelXYP +VelXYI +VelZP +AccelZP +AccelZI +AccelZD +FixedWingRollP +FixedWingRollI +FixedWingRollD +FixedWingRollFF +FixedWingPitchP +FixedWingPitchI +FixedWingPitchD +FixedWingPitchFF +Set_RateRollPitch +Set_RateRoll +Set_RatePitch +Set_RateYaw +Set_AngleRollPitch +Set_VelXY +Set_AccelZ + + + + +Disable +Chan5 +Chan6 +Chan7 +Chan8 +Chan9 +Chan10 +Chan11 +Chan12 +Chan13 +Chan14 +Chan15 +Chan16 + + + +900 2100 + + +900 2100 + + + +Disable +Chan1 +Chan3 +Chan3 +Chan4 +Chan5 +Chan6 +Chan7 +Chan8 +Chan9 +Chan10 +Chan11 +Chan12 +Chan13 +Chan14 +Chan15 +Chan16 + + + + + + +Disable +Enable + + + +0 1 + + + + +0 4 +0.25 + + +0 2 +0.25 + + +0 2 +0.25 + + +0.8 1.2 +0.05 + + +0 4500 +1 + + + diff --git a/src/FirmwarePlugin/APM/APMParameterFactMetaData.Plane.4.0.xml b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Plane.4.0.xml new file mode 100644 index 0000000..27872b3 --- /dev/null +++ b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Plane.4.0.xml @@ -0,0 +1,14946 @@ + + + + + + + + +1 255 + + +1 255 + + +1 10 +1 + + +s +seconds +0 30 +1 + + +0:Roll,1:Pitch,2:Yaw,3:Steering,4:Landing + + +0 1 +0.01 + + +0 5 +0.01 + + +0 15 +0.1 +deg +degrees + + +0 1000 +1 +m +meters + + +0 100 +1 +m +meters + + + +Disabled +FBWMixing +DirectMixing + + + + +Disabled +Enabled + + + +m/s +meters per second +0 30 +0.1 + + +m/s/s +meters per square second +0 30 +0.1 + + +ds +deciseconds +0 127 +1 + + +% +percent +-100 100 +1 + + +m/s +meters per second +0 30 +0.1 + + +m/s +meters per second +0 30 +0.1 + + +%/s +percent per second +-1 127 +1 + + +s +seconds +0 10 +0.5 + + +0 100 +% +percent + + + + +deg +degrees +0 45 +1 + + + +Never +AutoAlways +AutoLanding + +0:AUTO_ALWAYS,1:AUTO_LAND,2:AUTO_LOITER_TO_ALT,3:AUTO_LOITER_ALL,4:AUTO_WAYPOINTS,5:LOITER,6:RTL,7:CIRCLE,8:CRUISE,9:FBWB,10:GUIDED + + + +Default +L1Controller + + + + +Automatic + + + +m +meters +-32767 32767 +1 + + +m +meters +1 32767 +1 + + +m +meters +0 32767 +1 + + +m +meters +-32767 32767 +1 + + +m +meters +-32767 32767 +1 + + + +None +GuidedMode +ReportOnly +GuidedModeThrPass +RTL_Mode + + + + + + + +m +meters +0 32767 +1 + + +m +meters +0 32767 +1 + + +m +meters +0 32767 +1 + + + +NoAutoEnable +AutoEnable +AutoEnableDisableFloorOnly +EnableWhenArmed + + + + +FenceReturnPoint +NearestRallyPoint + + + + +Disabled +Enabled + + + +m/s +meters per second +5 100 +1 + + +m/s +meters per second +5 100 +1 + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +0 10000 +m +meters + + +1 10 +m/s +meters per second +0.1 + + +% +percent +-100 100 +1 + + +% +percent +0 100 +1 + + +% +percent +0 100 +1 + + +%/s +percent per second +0 127 +1 + + +%/s +percent per second +0 100 +1 + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled +EnabledNoFailsafe + + + +925 2200 +1 + + +% +percent +0 100 +1 + + + +Disabled +Enabled + + + + +CIRCLE/no change(if already in AUTO|GUIDED|LOITER) +CIRCLE +FBWA +Disable + + + +s +seconds +1 100 +0.5 + + + +Continue +ReturnToLaunch +Glide +Deploy Parachute + + + +s +seconds +1 300 +0.5 + + + +Disabled +Heartbeat +HeartbeatAndREMRSSI +HeartbeatAndAUTO + + + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +TAKEOFF +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL +QAUTOTUNE +QACRO + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +TAKEOFF +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL +QAUTOTUNE +QACRO + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +TAKEOFF +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL +QAUTOTUNE +QACRO + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +TAKEOFF +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL +QAUTOTUNE +QACRO + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +TAKEOFF +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL +QAUTOTUNE +QACRO + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +TAKEOFF +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL +QAUTOTUNE +QACRO + + + + +Manual +CIRCLE +STABILIZE +TRAINING +ACRO +FBWA +FBWB +CRUISE +AUTOTUNE +Auto +RTL +Loiter +TAKEOFF +AVOID_ADSB +Guided +QSTABILIZE +QHOVER +QLOITER +QLAND +QRTL +QAUTOTUNE +QACRO + + + +cdeg +centidegrees +0 9000 +1 + + +cdeg +centidegrees +0 9000 +1 + + +cdeg +centidegrees +-9000 0 +1 + + +deg/s +degrees per second +10 500 +1 + + +deg/s +degrees per second +10 500 +1 + + + +Disabled +Enabled + + + +m +meters +-100 100 +0.1 + + +deg/s +degrees per second +10 360 +1 + + + +Disabled +Enabled + + + +0.5 1.2 + + + +Disabled +Enabled + + + +d% +decipercent +-1000 1000 + + +% +percent +-100 100 + + +True + + + +Disabled +All-Default + +0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:CTUN,5:NTUN,6:MODE,7:IMU,8:CMD,9:CURRENT,10:COMPASS,11:TECS,12:CAMERA,13:RC,14:SONAR,15:ARM/DISARM,19:IMU_RAW + + + + + + +cm/s +centimeters per second + + +m/s +meters per second + + +cm/s +centimeters per second + + +cdeg +centidegrees + + +cm +centimeters + + +cm +centimeters + + + + +0 100 +% +percent + + +0 100 +1 +m/s +meters per second + + +0 100 +% +percent + + +0 100 +m/s +meters per second +1 + + + + + + + +Disabled +Enabled + +True + + + +Disabled +Enabled + + + +deg +degrees +0 90 +0.1 + + + +Disable +Enable - go HOME then land +Enable - go directly to landing sequence + + + +m/s/s +meters per square second +10 127 + + +0:Disarm + + + + + +Disabled +Enabled + + + + +NotEnforced +Enforced + + + +0 100 +% +percent +1 + + +0:Chan1,1:Chan2,2:Chan3,3:Chan4,4:Chan5,5:Chan6,6:Chan7,7:Chan8,8:Chan9,9:Chan10,10:Chan11,11:Chan12,12:Chan13,13:Chan14,14:Chan15,15:Chan16 + + + +Never reset +Always reset + +-1 127 +m +meters + + +0:Rudder mixing in direct flight modes only (Manual / Stabilize / Acro),1:Use centered throttle in Cruise or FBWB to indicate trim airspeed, 2:Disable attitude check for takeoff arming, 3:Force target airspeed to trim airspeed in Cruise or FBWB + + +1 10 + + +0 100 +% +percent +1 + + +0 100 +% +percent +1 + + +0 120 +1 +s +seconds + + +0: none, 1: D spoilers have pitch input, 2: use both control surfaces on each wing for roll, 4: Progressive crow flaps only first (0-50% flap in) then crow flaps (50 - 100% flap in) +0:pitch control, 1:full span, 2:Progressive crow + + +0 100 +% +percent +1 + + +6 35 +V +volt + + +6 35 +V +volt + + + +First battery +Second battery + + + +m +meters +0 30 +1 + + + + + +Disabled +Enabled + + + +1 100 + + +0 100000 +m +meters + + +-1 16777215 + + + +NoInfo +Light +Small +Large +HighVortexlarge +Heavy +HighlyManuv +Rotocraft +RESERVED +Glider +LightAir +Parachute +UltraLight +RESERVED +UAV +Space +RESERVED +EmergencySurface +ServiceSurface +PointObstacle + + + + +NO_DATA +L15W23 +L25W28P5 +L25W34 +L35W33 +L35W38 +L45W39P5 +L45W45 +L55W45 +L55W52 +L65W59P5 +L65W67 +L75W72P5 +L75W80 +L85W80 +L85W90 + + + + +NoData +Left2m +Left4m +Left6m +Center +Right2m +Right4m +Right6m + + + + +NO_DATA +AppliedBySensor + + + + +Disabled +Rx-Only +Tx-Only +Rx and Tx Enabled + + + +0 7777 +octal +octal + + + +Unknown +Rx UAT only +Rx UAT and 1090ES +Rx&Tx UAT and 1090ES + +0:UAT_in,1:1090ES_in,2:UAT_out,3:1090ES_out + + +0 32767 +m +meters + + + + + +no logging +log only special ID +log all + + + + + + + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + + + + + + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + +m +meters + + +m +meters + + +mbar +millibar + + + + + + + + + + + + + + +s +seconds + + +km +kilometers + + + + +0.0 1.0 +.01 + + + +Disabled +Enabled + + + +0.1 0.4 +.01 + + +0.1 0.4 +.01 + + +0 127 +m/s +meters per second +1 + + +rad +radians +-0.1745 +0.1745 +0.01 + + +rad +radians +-0.1745 +0.1745 +0.01 + + +rad +radians +-0.1745 +0.1745 +0.01 + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 +Custom + + + +0.001 0.5 +.01 + + +0 10 +1 + + + +Disabled +Enable EKF2 +Enable EKF3 + + + +-180 180 +deg +degrees +1 + + +-180 180 +deg +degrees +1 + + +-180 180 +deg +degrees +1 + + + + + +Disabled +THR_MIN PWM when disarmed +0 PWM when disarmed + + + +m/s/s +meters per square second +0.25 3.0 + + + +Disabled +ArmingOnly +ArmOrDisarm + + + +0:Land,1:VTOL Land,2:DO_LAND_START,3:Takeoff,4:VTOL Takeoff,5:Rallypoint + + + +None +All +Barometer +Compass +GPS Lock +INS(INertial Sensors - accels & gyros) +Parameters(unused) +RC Channels +Board voltage +Battery Level +Airspeed +LoggingAvailable +Hardware safety switch +GPS configuration +System +Mission +RangeFinder + +0:All,1:Barometer,2:Compass,3:GPS lock,4:INS,5:Parameters,6:RC Channels,7:Board voltage,8:Battery Level,9:Airspeed,10:Logging Available,11:Hardware safety switch,12:GPS Configuration,13:System,14:Mission,15:Rangefinder + + + + + +None +I2C-MS4525D0 +Analog +I2C-MS5525 +I2C-MS5525 (0x76) +I2C-MS5525 (0x77) +I2C-SDP3X +I2C-DLVR-5in +UAVCAN +I2C-DLVR-10in +I2C-DLVR-20in +I2C-DLVR-30in +I2C-DLVR-60in + + + + +DoNotUse +Use +UseWhenZeroThrottle + + + +0.1 + + +0.1 + + + + + + + + + +Disable +Enable + + + + + + +Bus0(internal) +Bus1(external) +Bus2(auxillary) + + + + +FirstSensor +2ndSensor + + + +0:Disable on sensor failure,1:Re-enable on sensor recovery + + + +None +I2C-MS4525D0 +Analog +I2C-MS5525 +I2C-MS5525 (0x76) +I2C-MS5525 (0x77) +I2C-SDP3X +I2C-DLVR-5in +UAVCAN +I2C-DLVR-10in +I2C-DLVR-20in +I2C-DLVR-30in +I2C-DLVR-60in + + + + +Don't Use +use +UseWhenZeroThrottle + + + +0.1 + + +0.1 + + + + + + + + + +Disable +Enable + + + + + + +Bus0(internal) +Bus1(external) +Bus2(auxillary) + + + + + + +Disabled +Enabled + + + + +Remain in AVOID_ADSB +Resume previous flight mode +RTL +Resume if AUTO else Loiter + + + + + +s +seconds + + +s +seconds + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Land +Terminate +QLand + + + + +None +RTL +Land +Terminate +QLand +Parachute + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Land +Terminate +QLand + + + + +None +RTL +Land +Terminate +QLand +Parachute + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Land +Terminate +QLand + + + + +None +RTL +Land +Terminate +QLand +Parachute + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Land +Terminate +QLand + + + + +None +RTL +Land +Terminate +QLand +Parachute + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Land +Terminate +QLand + + + + +None +RTL +Land +Terminate +QLand +Parachute + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Land +Terminate +QLand + + + + +None +RTL +Land +Terminate +QLand +Parachute + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Land +Terminate +QLand + + + + +None +RTL +Land +Terminate +QLand +Parachute + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Land +Terminate +QLand + + + + +None +RTL +Land +Terminate +QLand +Parachute + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Land +Terminate +QLand + + + + +None +RTL +Land +Terminate +QLand +Parachute + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + + + + +No PWMs +One PWMs +Two PWMs +Three PWMs +Four PWMs +Five PWMs +Six PWMs +Seven PWMs +Eight PWMs + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled + +True + + + +Disabled +50Hz +75Hz +100Hz +150Hz +200Hz +250Hz +300Hz + +True + + +-32768 32767 + + + +Disabled +Enabled + +0:Ch1,1:Ch2,2:Ch3,3:Ch4,4:Ch5,5:Ch6,6:Ch7,7:Ch8,8:Ch9,9:Ch10,10:Ch11,11:Ch12,12:Ch13,13:Ch14 +True + + +-1 80 +degC +degrees Celsius + + + +AUTO +PX4V1 +Pixhawk +Cube/Pixhawk2 +Pixracer +PixhawkMini +Pixhawk2Slim +VRBrain 5.1 +VRBrain 5.2 +VR Micro Brain 5.1 +VR Micro Brain 5.2 +VRBrain Core 1.0 +VRBrain 5.4 +Intel Aero FC +AUAV2.1 + +True + + + +Disabled +Enabled + +True + + +0:ActiveForSafetyEnable,1:ActiveForSafetyDisable,2:ActiveWhenArmed,3:Force safety on when the aircraft disarms + + +V +volt +4.0 5.5 +0.1 + + +V +volt +3.3 12.0 +0.1 + + +0 32 +1 + + + +3.3V +5V + + + +0:Enable hardware watchdog + + +0 10000 +ms +milliseconds + + +1 500 +1 + + +0 1 +0.1 + + +0 100 +1 + + +0 10 +1 +True + + + + + +None +CYRF6936 +CC2500 +BK2425 + + + + +Auto +DSM2 +DSMX + + + +0 4 + + + +NotDisabled +Disabled + + + +0 16 + + +0 16 + + + +Disabled +Enabled + + + +1 8 + + + +Disabled +MinChannel +MidChannel +MaxChannel +MinChannelCW +MidChannelCW +MaxChannelCW + + + + +Mode1 +Mode2 + + + + +Disabled +TestChan1 +TestChan2 +TestChan3 +TestChan4 +TestChan5 +TestChan6 +TestChan7 +TestChan8 + + + +0 16 + + +0 16 + + +1 8 + + +0 40 + + +0 120 + + +0 31 + + + + +0:GPS,1:MAVLINK_SYSTEM_TIME,2:HW + + +-720 +840 + + + + + +Disabled +Enabled + + + + +Disabled +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 + + + + +Disabled +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 + + + + +Disabled +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 + + + + +Disabled +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 + + + +0 3600 + + + + + +Servo +Relay +GoPro in Solo Gimbal + + + +ds +deciseconds +0 50 + + +PWM +PWM in microseconds +1000 2000 + + +PWM +PWM in microseconds +1000 2000 + + +m +meters +0 1000 + + + +Low +High + + + +ms +milliseconds +0 10000 + + +deg +degrees +0 180 + + + +Disabled +AUX1 +AUX2 +AUX3 +AUX4 +AUX5 +AUX6 + +True + + + +TriggerLow +TriggerHigh + + + + +Always +Only when in AUTO + + + + +Default +BMMCC + + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + +0 32767 + + + + + +Disabled +Enabled + + + + +First Relay +Second Relay +Third Relay +Fourth Relay +Servo + + + +1000 2000 +PWM +PWM in microseconds +1 + + +1000 2000 +PWM +PWM in microseconds +1 + + +0 32000 +m +meters +1 + + +0 5000 +ms +milliseconds +1 + + +0 15 +m/s +meters per second +1 + + + + +-400 400 +mGauss +milligauss +1 +1 + + +-400 400 +mGauss +milligauss +1 +1 + + +-400 400 +mGauss +milligauss +1 + + +-3.142 3.142 +rad +radians +0.01 + + + +Disabled +Internal-Learning +EKF-Learning +InFlight-Learning + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Use Throttle +Use Current + +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 +Custom + + + + +Internal +External +ForcedExternal + + + +-400 400 +mGauss +milligauss +1 +1 + + +-400 400 +mGauss +milligauss +1 +1 + + +-400 400 +mGauss +milligauss +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-400 400 +mGauss +milligauss +1 +1 + + +-400 400 +mGauss +milligauss +1 +1 + + +-400 400 +mGauss +milligauss +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +True + + +True + + +True + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 +Custom + + + + +Internal +External +ForcedExternal + + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 +Custom + + + + +Internal +External +ForcedExternal + + + +1 + + +1 + + + + +1 + + +1 + + + + +1 + + +1 + + + + +1 + + +1 + + + + +1 + + +1 + + + + +1 + + +1 + + + + +4 32 + +Very Strict +Strict +Default +Relaxed + +0.1 + + +500 3000 +1 + + +0:HMC5883,1:LSM303D,2:AK8963,3:BMM150,4:LSM9DS1,5:LIS3MDL,6:AK09916,7:IST8310,8:ICM20948,9:MMC3416,11:UAVCAN,12:QMC5883,14:MAG3110,15:IST8308 + + +% +percent +0 100 +1 + + + +Disabled +CheckOnly +CheckAndFix + + + +True + + +True + + +True + + + +Disabled +Enabled + + + +0 1.3 + + +0 1.3 + + +0 1.3 + + +0:CalRequireGPS + + +True + + +True + + +True + + +True + + +True + + +-180 180 +deg +degrees +1 +True + + +-180 180 +deg +degrees +1 +True + + +-180 180 +deg +degrees +1 +True + + + + + +Disabled +Enabled + + + +0 2 +0.01 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.000001 0.001 +Hz +hertz + + +0.00001 0.005 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +2.0 6.0 +0.5 +m/s +meters per second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + +0 127 +1 +ms +milliseconds +True + + + +None +Navigation +Terrain + +True + + +0 500 +mGauss +milligauss + + +0.1 30.0 +Hz +hertz +False + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +True +ms +milliseconds + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always +Use external yaw sensor + +True + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 250 +10 +True +ms +milliseconds + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.00001 0.005 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +True +ms +milliseconds + + +2.0 6.0 +0.5 +m/s +meters per second + + +0.5 2.5 +0.1 +m/s/s +meters per square second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + +0.05 0.5 +0.05 +m/s +meters per second + + +0.5 5.0 +0.1 +m/s +meters per second + + +0.01 1.0 +0.1 +m/s +meters per second + + + +None +Navigation +Terrain + +True + + +0.1 30.0 +Hz +hertz +False + + +0 500 +mGauss +milligauss + + + + + +None +PX4Flow +Pixart +Bebop +CXOF +MAVLink +UAVCAN + +True + + +-200 +200 +1 + + +-200 +200 +1 + + +-18000 +18000 +1 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +0 127 + + + +Disabled +Enabled + + + + + +Pa +pascal +1 +True +True + + +degC +degrees Celsius +1 +True + + +m +meters +0.1 + + + +FirstBaro +2ndBaro +3rdBaro + + + + +Disabled +Bus0 +Bus1 + + + +1.0:Freshwater,1.024:Saltwater + + +Pa +pascal +1 +True +True + + +Pa +pascal +1 +True +True + + +% +percent +0 100 +1 + + +0:BMP085,1:BMP280,2:MS5611,3:MS5607,4:MS5637,5:FBM320,6:DPS280,7:LPS25H,8:Keller,9:MS5837,10:BMP388 + +BMP085 +BMP280 +MS5611 +MS5607 +MS5637 +FBM320 +DPS280 +LPS25H +Keller +MS5837 +BMP388 + + + + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA +HemisphereNMEA +uBlox-MovingBaseline-Base +uBlox-MovingBaseline-Rover + +True + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA +HemisphereNMEA +uBlox-MovingBaseline-Base +uBlox-MovingBaseline-Rover + +True + + + +Portable +Stationary +Pedestrian +Automotive +Sea +Airborne1G +Airborne2G +Airborne4G + + + + +Disabled +UseBest +Blend +UseSecond + + + + +Any +FloatRTK +IntegerRTK + +True + + + +Disabled +Enabled +NoChange + + + +-100 90 +deg +degrees + + + +send to first GPS +send to 2nd GPS +send to all + + + + +None (0x0000) +All (0xFFFF) +External only (0xFF00) + + + + +Ignore +Always log +Stop logging when disarmed (SBF only) +Only log every five samples (uBlox only) + +True + + + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + + + +Do not save config +Save config +Save only when needed + + + + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + + + +Disables automatic configuration +Enable automatic configuration + + + +ms +milliseconds + +10Hz +8Hz +5Hz + +50 200 + + +ms +milliseconds + +10Hz +8Hz +5Hz + +50 200 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +ms +milliseconds +0 250 +True + + +ms +milliseconds +0 250 +True + + +0:Horiz Pos,1:Vert Pos,2:Speed + + +s +seconds +5.0 30.0 + + +0:Use UART2 for moving baseline on ublox + + + + + +Disabled +Enabled + + + + +None +Servo +EPM + + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +0 255 +s +seconds + + +0 255 + + + + + +Disabled +Enabled + + + + +None +Chan1 +Chan2 +Chan3 +Chan4 +Chan5 +Chan6 +Chan7 +Chan8 +Chan9 +Chan10 +Chan11 +Chan12 +Chan13 +Chan14 +Chan15 +Chan16 + + + +s +seconds +0.1 5 + + +s +seconds +1 10 + + +100 100000 + + +1000 2000 + + +1000 2000 + + +1000 2000 + + +1000 2000 + + + +None +RPM1 +RPM2 + + + +0 100 + + +0 100 + + + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +Hz +hertz +0 256 + + +Hz +hertz +0 256 + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +0.05 50 + + + +Never +Start-up only + + + + +Don't adjust the trims +Assume first orientation was level +Assume ACC_BODYFIX is perfectly aligned to the vehicle + + + + +IMU 1 +IMU 2 +IMU 3 + + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +True + + +True + + +True + + +True + + +True + + +True + + + +FirstIMUOnly +FirstAndSecondIMU + +0:FirstIMU,1:SecondIMU,2:ThirdIMU + + + +FirstIMUOnly +FirstAndSecondIMU +FirstSecondAndThirdIMU +AllIMUs + +0:FirstIMU,1:SecondIMU,2:ThirdIMU + + + + + +Disabled +Enabled + + + +10 495 +Hz +hertz + + +5 250 +Hz +hertz + + +5 50 +dB +decibel + + +0:1st harmonic,1:2nd harmonic,2:3rd harmonic,3:4th hamronic,4:5th harmonic,5:6th harmonic,6:7th harmonic,7:8th harmonic +True + + +0.0 1.0 +True + + +0 3 + +Disabled +Throttle +RPM Sensor +ESC Telemetry + + + + + +32 +True + + + +None +First IMU +All + +0:IMU1,1:IMU2,2:IMU3 +True + + +0:Sensor-Rate Logging (sample at full sensor rate seen by AP), 1: Sample post-filtering + + +ms +milliseconds +10 + + +1 + + + + + +Disabled +Enabled + + + +5 30 +dB +decibel + + +10 400 +Hz +hertz + + +5 100 +Hz +hertz + + + + +0 5 +m +meters +0.5 + + +0 90 +deg +degrees +0.1 + + +cdeg +centidegrees + + +m +meters +0.1 + + +s +seconds +0.1 + + +m +meters +0 30 +0.1 + + +s +seconds +0 10 +0.1 + + +m/s +meters per second +0 30 +0.1 + + +% +percent +0 127 +1 + + +s +seconds +1 +0 127 + + + +Disabled +Servos to Neutral +Servos to Zero PWM + + + + +Disabled +Enabled + + + +0 100 +% +percent + + + +Standard Glide Slope +Deepstall + + + + + +0 20 +m/s +meters per second + + + + + + +10 200 +m +meters + + +0 20 +m/s +meters per second + + +0 2 +s +seconds + + +900 2100 +PWM +PWM in microseconds + + +5 20 +m/s +meters per second + + +5 20 +m/s +meters per second + + +5 50 +m +meters + + +0 1 + + +0 2.0 + + + + + + + + + + + + + + + +WaitForPilotInput +Retract +Deploy + + + + +Disabled +AUX1 +AUX2 +AUX3 +AUX4 +AUX5 +AUX6 + +True + + + +Low +High + + + + +Disabled +AUX1 +AUX2 +AUX3 +AUX4 +AUX5 +AUX6 + +True + + + +Low +High + + + +m +meters +0 1000 +1 + + +m +meters +0 1000 +1 + + + +Retract after Takeoff +Deploy during Land +Retract after Takeoff AND deploy during Land + +0:Retract after Takeoff,1:Deploy during Land + + + + + +None +File +MAVLink +File and MAVLink +Block +Block and MAVLink + +0:File,1:MAVLink,2:Block + + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +kB +kilobytes + + +s +seconds + + + + +0 32766 +1 +True + + + +Resume Mission +Restart Mission + + + +0:Clear Mission on reboot + + + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + +0 100 +1 + + +s +seconds +0.0 0.2 +.005 + + +s +seconds +0.0 0.2 +.005 + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + +True + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + +s +seconds +0.0 0.2 +.005 + + +s +seconds +0.0 0.2 +.005 + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + + + + + +s +seconds +1 60 +1 + + +0.6 1.0 +0.05 + + +0 0.1 +0.01 + + +deg +degrees +0 89 + + + + + +Off +Low +Medium +High + + + + +Disable +Enable + + + + +Standard +MAVLink +OutbackChallenge +TrafficLight + + + + +Disable +ssd1306 +sh1106 +SITL + + + + +Disabled +Aircraft +Rover + + + + +Disabled + + + +0:Build in LED, 1:Internal ToshibaLED, 2:External ToshibaLED, 3:External PCA9685, 4:Oreo LED, 5:UAVCAN, 6:NCP5623 External, 7:NCP5623 Internal, 8:NeoPixel, 9:ProfiLED + + + +LowIsOn +HighIsOn + + + +0 100 +% +percent + + +1 32 + + + + + +None +MAX7456 + +True + + + +Disable +Chan5 +Chan6 +Chan7 +Chan8 +Chan9 +Chan10 +Chan11 +Chan12 +Chan13 +Chan14 +Chan15 +Chan16 + + + +0:UseDecimalPack, 1:InvertedWindPointer, 2:InvertedAHRoll + + +True + + +0 31 +True + + +0 63 +True + + +0 99 + + +1 30 + + +0 100 + + + +Metric +Imperial +SI +Aviation + + + +1 20 + + +0 4 + + +0 4 + + +0 4 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + +0.4 1.0 +s +seconds +0.1 + + +0.1 3.0 +0.1 + + +0 0.2 +0.01 + + +0 0.5 +0.05 + + +0 100 +deg/s +degrees per second +1 + + +0 100 +deg/s +degrees per second +1 + + +0.7 1.5 +0.05 + + +0 4500 +1 + + +0.1 4.0 +0.1 + + + + + +Disable +Enable +Enable VTOL AUTO + + + +cdeg +centidegrees +1000 8000 + + +ms +milliseconds +0 30000 + + +cm/s +centimeters per second +50 500 +10 + + +cm/s/s +centimeters per square second +50 500 +10 + + +Hz +hertz +50 500 +10 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +m/s +meters per second +0 100 +0.1 + + +deg/s +degrees per second +50 500 +1 + + +cm/s +centimeters per second +30 200 +10 + + +m +meters +0.5 50 +0.1 + + +0 30 +deg +degrees +1 + + + +Undefined +Quad +Hexa +Octa +OctaQuad +Y6 +Tri + TailSitter + + + + +Plus +X +V +H +V-Tail +A-Tail +Y6B +Y6F +BetaFlightX +DJIX +ClockwiseX + I + + + +0 0.5 +0.01 + + +0 1 +0.01 + + +0 10 +0.1 + + +m +meters +1 200 +1 + + + +Disabled +Enabled + + + + + +deg/s +degrees per second +1 +10 300 + + +deg +degrees +1 +20 80 + + + +Disabled +Enabled + + + + +Disabled +ThrottleInput +FullInput + + + +m +meters +0 10 +0.25 + + + +Disabled +Enabled + + + +deg +degrees +0 90 +1 + + + +Continuous +Binary +VectoredYaw +Bicopter + + + +5 80 + + +deg/s +degrees per second +1 +10 300 + + + +MultiCopterInput +FixedWingInput +BodyFrameRoll_M +BodyFrameRoll_P + + + +0:Aileron,1:Elevator,2:Throttle,3:Rudder + + + +Disabled +Channel1 +Channel2 +Channel3 +Channel4 +Channel5 +Channel6 +Channel7 +Channel8 + + + +0 1 +0.01 + + +0 1 +0.01 + + +0 30 + + +0 4 +0.1 + + + +AUTO +FIXED_WING +QUADROTOR +COAXIAL +HELICOPTER +AIRSHIP +FREE_BALLOON +ROCKET +GROUND_ROVER +SURFACE_BOAT +SUBMARINE +FLAPPING_WING +KITE +VTOL_DUOROTOR +VTOL_QUADROTOR +VTOL_TILTROTOR + + + +0:LevelTransition,1:AllowFWTakeoff,2:AllowFWLand,3:Respect takeoff frame types,4:Use a fixed wing approach for VTOL landings,5:Use QRTL instead of QLAND for failsafe when in VTOL modes. + + +m/s/s +meters per square second +0.1 +0.2 5 + + +1 5 + + +deg +degrees +-10 +10 +0.1 +True + + +deg +degrees +0 80 + + +m +meters +0 200 +5 + + +s +seconds +0 20 +1 + + +0:Motor 1,1:Motor 2,2:Motor 3,3:Motor 4, 4:Motor 5,5:Motor 6,6:Motor 7,7:Motor 8 + + +0 1 +.1 + + +deg/s +degrees per second +10 500 +1 + + +deg/s +degrees per second +10 500 +1 + + +deg/s +degrees per second +10 500 +1 + + +1.1 5.0 +5.1 + + +m/s +meters per second +0 20 +1 + + +m +meters +0 120 +1 + + + + +cdeg/s +centidegrees per second +500 18000 +100 + + +cdeg/s/s +centidegrees per square second +0 72000 + +Disabled +VerySlow +Slow +Medium +Fast + +1000 + + + +Disabled +Enabled + + + +cdeg/s/s +centidegrees per square second +0 180000 +1000 + +Disabled +VerySlow +Slow +Medium +Fast + + + +cdeg/s/s +centidegrees per square second +0 180000 +1000 + +Disabled +VerySlow +Slow +Medium +Fast + + + + +Disabled +Enabled + + + +0.0 12.000 + + +0.0 12.000 + + +0.0 6.000 + + +0.5 10.0 + + +deg/s +degrees per second +0 1080 +1 + +Disabled +Slow +Medium +Fast + + + +deg/s +degrees per second +0 1080 +1 + +Disabled +Slow +Medium +Fast + + + +deg/s +degrees per second +0 1080 +1 + +Disabled +Slow +Medium +Fast + + + +s +seconds +0 1 +0.01 +0.5:Very Soft, 0.2:Soft, 0.15:Medium, 0.1:Crisp, 0.05:Very Crisp + + +0.01 0.5 +0.005 + + +0.01 2.0 +0.01 + + +0 1 +0.01 +% +percent + + +0.0 0.05 +0.001 + + +0 0.5 +0.001 + + +5 100 +1 +Hz +hertz + + +0 100 +1 +Hz +hertz + + +5 100 +1 +Hz +hertz + + +0.01 0.50 +0.005 + + +0.01 2.0 +0.01 + + +0 1 +0.01 +% +percent + + +0.0 0.05 +0.001 + + +0 0.5 +0.001 + + +5 100 +1 +Hz +hertz + + +0 100 +1 +Hz +hertz + + +5 100 +1 +Hz +hertz + + +0.10 2.50 +0.005 + + +0.010 1.0 +0.01 + + +0 1 +0.01 +% +percent + + +0.000 0.02 +0.001 + + +0 0.5 +0.001 + + +1 50 +1 +Hz +hertz + + +0 20 +1 +Hz +hertz + + +5 50 +1 +Hz +hertz + + +0.1 0.25 + + +0.5 0.9 + + +0.1 0.9 + + +1 100 +1 +Hz +hertz + + +1 100 +1 +Hz +hertz + + +1 10 +1 +Hz +hertz + + + + +deg +degrees +0 45 +1 + + +cm/s +centimeters per second +20 2000 +50 + + +cm/s/s +centimeters per square second +100 981 +1 + + +cm/s/s +centimeters per square second +25 250 +1 + + +cm/s/s/s +centimeters per cubic second +500 5000 +1 + + +s +seconds +0 2 +0.1 + + + + +0 500 +PWM +PWM in microseconds + + +0.25 0.8 + + +0.9:Low, 0.95:Default, 1.0:High + + +6 35 +V +volt + + +6 35 +V +volt + + +0 200 +A +ampere + + + +Normal +OneShot +OneShot125 +Brushed +DShot150 +DShot300 +DShot600 +DShot1200 + +True + + +PWM +PWM in microseconds +0 2000 + + +PWM +PWM in microseconds +0 2000 + + +0.0:Low, 0.15:Default, 0.3:High + + +0.0:Low, 0.1:Default, 0.2:High + + +0 10 +s +seconds + + +0.2 0.8 + + + +Disabled +Learn +Learn and Save + + + + +PWM enabled while disarmed +PWM disabled while disarmed + + + +5 80 +deg +degrees +1 + + +0 2 +s +seconds +0.1 + + +0 5 +0.1 + + + +First battery +Second battery + + + +0 .5 +s +seconds +0.001 + + +0 .5 +s +seconds +0.001 + + +0 5 +s +seconds +0.001 + + + + +Hz +hertz +0.5 5 +0.1 + + +1.000 3.000 + + +1.000 8.000 + + +0.500 1.500 +0.05 + + +0.000 3.000 + + +0 1000 +d% +decipercent + + +0.000 0.400 + + +0 0.5 +0.001 + + +1 50 +1 +Hz +hertz + + +1 100 +1 +Hz +hertz + + +1 100 +1 +Hz +hertz + + +0.500 2.000 + + +0.1 6.0 +0.1 + + +0.02 1.00 +0.01 + + +0.00 1.00 +0.001 + + +0 4500 +10 +cm/s/s +centimeters per square second + + +0 100 +Hz +hertz + + +0 100 +Hz +hertz + + +deg +degrees +0 45 +1 + + + + +cm/s +centimeters per second +20 2000 +50 + + +cm +centimeters +5 1000 +1 + + +cm/s +centimeters per second +10 1000 +50 + + +cm/s +centimeters per second +10 500 +10 + + +cm/s/s +centimeters per square second +50 500 +10 + + +cm/s/s +centimeters per square second +50 500 +10 + + + +Disable +Enable + + + + + + + +km +kilometers +0.1 + + + +DoNotIncludeHome +IncludeHome + + + + + +0.0 120.0 +s +seconds + + +0:Ignore RC Receiver, 1:Ignore MAVLink Overrides, 2:Ignore Receiver Failsafe + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +ModeTakeoff +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +ModeTakeoff +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +ModeTakeoff +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +ModeTakeoff +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +ModeTakeoff +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +ModeTakeoff +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +ModeTakeoff +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +ModeTakeoff +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +ModeTakeoff +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +ModeTakeoff +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +ModeTakeoff +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +ModeTakeoff +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +ModeTakeoff +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +ModeTakeoff +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +ModeTakeoff +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +ModeTakeoff +KillIMU1 +KillIMU2 +Camera Mode Toggle + + + + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True +1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8 + + +1 8 +1 +True +1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8 + + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Off +On +NoChange + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + + +0.4 1.0 +s +seconds +0.1 + + +0.1 4.0 +0.1 + + +0 0.2 +0.01 + + +0 1.0 +0.05 + + +0 180 +deg/s +degrees per second +1 + + +0 4500 +1 + + +0.1 4.0 +0.1 + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +PWM +AUXPIN + + + +0.001 + + +1 + + +1 + + +0.1 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +None +PWM +AUXPIN + + + +0.001 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + + + +Disabled +AnalogPin +RCChannelPwmValue +ReceiverProtocol +PWMInputPin + + + + +V5 Nano +Pixracer +Pixhawk ADC4 +Pixhawk ADC3 +Pixhawk ADC6 +Pixhawk2 ADC +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 +Pixhawk SBUS + + + +V +volt +0.01 +0 5.0 + + +V +volt +0.01 +0 5.0 + + +0 16 + + +PWM +PWM in microseconds +0 2000 + + +PWM +PWM in microseconds +0 2000 + + + + + +Disabled +ShowSlips +ShowOverruns + + + + +50Hz +100Hz +200Hz +250Hz +300Hz +400Hz + +True + + + + + +None +Lua Scripts + +True + + +1000 1000000 +10000 + + +1024 1048576 +1024 +True + + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +460800 +500000 +921600 +1500000 + + + + +MAVlink1 +MAVLink2 + +True + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + +0 120 +s +seconds + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + + + + +Disable +Enable + + + +25 400 +Hz +hertz + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +ProfiLED 1 +ProfiLED 2 +ProfiLED 3 +ProfiLED Clock + + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + +Disabled +Enabled + + + + +Disabled +TestMotor1 +TestMotor2 +TestMotor3 +TestMotor4 +TestMotor5 +TestMotor6 +TestMotor7 +TestMotor8 + + + +s +seconds +0 300 + + +Hz +hertz +0 500 + + + +Disabled +Enabled + + + + +None +OneShot +OneShot125 +Brushed +DShot150 +DShot300 +DShot600 +DShot1200 + + + + +Console +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 + + + +1 127 + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + + +0 4095 + + +0 4095 + + + + +25 250 +Hz +hertz + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + + + +Disabled +Enabled + + + +0 15 + + + + + +Disabled +Enabled + + + +0 15 + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + + +Normal +Reverse + + + + + + +Disabled +Enabled + + + +deg +degrees +0.000001 +-90 90 + + +deg +degrees +0.000001 +-180 180 + + +cm +centimeters +1 +0 10000 + + +deg +degrees +1 +-180 +180 + + +Hz +hertz +0 200 + + + +cylinder +cone +sphere + + + +m +meters +0 100 + + +m +meters +5 100 + + + + + +Disabled +Enabled + + + +0 15 + + +0 15 + + + + + +Disable +Enable + + + +m/s +meters per second +0 10 + + +m +meters +0 100 + + +s +seconds +0 32768 + + +s +seconds +0 32768 + + +m.m/s/s +square meter per square second +0 0.5 + + +m +meters +0 1000.0 + + +m +meters +0 1000.0 + + +m +meters +0 1000.0 + + +0 16 + + + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 50 +1 + + + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 50 +1 + + + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 50 +1 + + + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 50 +1 + + + + +True + + +s +seconds +True + + +s +seconds +True + + +s +seconds +True + + + + +0.4 1.0 +s +seconds +0.1 + + +0.1 10.0 +0.1 + + +0 1.0 +0.05 + + +0 0.1 +0.01 + + +0 4500 +1 +cdeg +centidegrees + + +0 5 +0.1 +m/s +meters per second + + +0.0 10.0 +0.1 + + +0.0 30.0 +0.1 +m/s +meters per second + + +0.0 50.0 +0.1 +deg/m/s +degrees per meter per second + + +0.0 4500.0 +0.1 +cdeg +centidegrees + + + + +0.1 +0.1 20.0 + + +0.1 +0.1 10.0 + + +3.0 10.0 +0.2 + + +0.1 1.0 +0.1 + + +0.0 0.5 +0.02 + + +1.0 10.0 +0.5 + + +1.0 5.0 +0.05 + + +0.5 2.0 +0.05 + + +5.0 30.0 +1.0 + + +0.0 2.0 +0.1 + + +0.1 1.0 +0.1 + + +0.1 +0.0 20.0 + + +-1 127 +1 + + +-1 100 +0.1 + + +-1.0 2.0 +0.1 + + +0 45 +1 + + +-45 0 +1 + + +0.0 2.0 +0.1 + + +1.0 5.0 +0.2 + + +0.1 1.0 +0.1 + + +-5 40 +1 + + +0.0 20.0 +m/s +meters per second +0.1 + + +-2.0 2.0 +m/s/m +meters per second per meter +0.1 + + +0.1 1.0 +0.1 + + +0.0 0.5 +0.02 + + +0.0 0.5 +0.02 + + +0.1 1.0 +0.1 + + + +Disable +Enable + + + +0:GliderOnly + + + + + +Disable +Enable + + + +m +meters +1 + + +0:Disable Download + + + + +0 200 +1 +m +meters + + +0 50 +1 +m +meters + + +0 30 +1 +deg +degrees + + +0 500 +1 +m +meters + + + + + +None +RateRollPI +RateRollP +RateRollI +RateRollD +RatePitchPI +RatePitchP +RatePitchI +RatePitchD +RateYawPI +RateYawP +RateYawI +RateYawD +AngleRollP +AnglePitchP +AngleYawP +PosXYP +PosZP +VelXYP +VelXYI +VelZP +AccelZP +AccelZI +AccelZD +FixedWingRollP +FixedWingRollI +FixedWingRollD +FixedWingRollFF +FixedWingPitchP +FixedWingPitchI +FixedWingPitchD +FixedWingPitchFF +Set_RateRollPitch +Set_RateRoll +Set_RatePitch +Set_RateYaw +Set_AngleRollPitch +Set_VelXY +Set_AccelZ + + + + +Disable +Chan5 +Chan6 +Chan7 +Chan8 +Chan9 +Chan10 +Chan11 +Chan12 +Chan13 +Chan14 +Chan15 +Chan16 + + + +900 2100 + + +900 2100 + + + +Disable +Chan1 +Chan3 +Chan3 +Chan4 +Chan5 +Chan6 +Chan7 +Chan8 +Chan9 +Chan10 +Chan11 +Chan12 +Chan13 +Chan14 +Chan15 +Chan16 + + + + + + +Disable +Enable + + + +0 1 + + + + +0 4 +0.25 + + +0 2 +0.25 + + +0 2 +0.25 + + +0.8 1.2 +0.05 + + +0 4500 +1 + + + diff --git a/src/FirmwarePlugin/APM/APMParameterFactMetaData.Plane.4.2.xml b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Plane.4.1.xml similarity index 89% rename from src/FirmwarePlugin/APM/APMParameterFactMetaData.Plane.4.2.xml rename to src/FirmwarePlugin/APM/APMParameterFactMetaData.Plane.4.1.xml index 4221e38..6f364cb 100644 --- a/src/FirmwarePlugin/APM/APMParameterFactMetaData.Plane.4.2.xml +++ b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Plane.4.1.xml @@ -16,10 +16,10 @@ 1 - 0 30 - 1 s seconds + 0 30 + 1 0:Roll,1:Pitch,2:Yaw,3:Steering,4:Landing @@ -58,103 +58,120 @@ VTOL Yaw only + + + Disabled + Enabled + + - 0 30 - 0.1 m/s meters per second + 0 30 + 0.1 - 0 30 - 0.1 m/s/s meters per square second + 0 30 + 0.1 - 0 127 - 1 ds deciseconds + 0 127 + 1 - -100 100 - 1 % percent + -100 100 + 1 - 0 30 - 0.1 m/s meters per second + 0 30 + 0.1 - 0 30 - 0.1 m/s meters per second + 0 30 + 0.1 - -1 127 - 1 %/s percent per second + -1 127 + 1 - 0 10 - 0.5 s seconds + 0 10 + 0.5 0 100 - 1 % percent + 1 - 0 45 - 1 deg degrees + 0 45 + 1 - 0:AUTO_ALWAYS,1:AUTO_LAND,2:AUTO_LOITER_TO_ALT,3:AUTO_LOITER_ALL,4:AUTO_WAYPOINTS,5:LOITER,6:RTL,7:CIRCLE,8:CRUISE,9:FBWB,10:GUIDED,11:AUTO_LANDING_PATTERN,12:FBWA,13:ACRO,14:STABILIZE,15:THERMAL MANUAL ONLY AutoAlways AutoLanding + 0:AUTO_ALWAYS,1:AUTO_LAND,2:AUTO_LOITER_TO_ALT,3:AUTO_LOITER_ALL,4:AUTO_WAYPOINTS,5:LOITER,6:RTL,7:CIRCLE,8:CRUISE,9:FBWB,10:GUIDED,11:AUTO_LANDING_PATTERN,12:FBWA,13:ACRO,14:STABILIZE,15:THERMAL + + + + Default + L1Controller + + + + + Automatic + - -32767 32767 - 1 m meters + -32767 32767 + 1 + m + meters 1 32767 1 - m - meters + m + meters 0 32767 1 - m - meters - -32767 32767 - 1 m meters + -32767 32767 + 1 - -32767 32767 - 1 m meters + -32767 32767 + 1 @@ -163,16 +180,16 @@ - 5 100 - 1 m/s meters per second + 5 100 + 1 - 5 100 - 1 m/s meters per second + 5 100 + 1 @@ -181,11 +198,11 @@ - 0: Enable all modes, 1:FBWB, 2:Cruise, 3:Auto, 4:RTL, 5:Avoid_ADSB, 6:Guided, 7:Loiter, 8:Circle, 9:QRTL, 10:QLand, 11:Qloiter Disabled Enabled + 0: Enable all modes, 1:FBWB, 2:Cruise, 3:Auto, 4:RTL, 5:Avoid_ADSB, 6:Guided, 7:Loiter, 8:Circle, 9:QRTL, 10:QLand, 11:Qloiter 0 10000 @@ -194,39 +211,39 @@ 1 10 - 0.1 m/s meters per second + 0.1 + % + percent -100 100 1 - % - percent - 0 100 - 1 % percent + 0 100 + 1 - 0 100 - 1 % percent - - - 0 127 - 1 - %/s - percent per second - - 0 100 1 + + %/s percent per second + 0 127 + 1 + + + %/s + percent per second + 0 100 + 1 @@ -252,10 +269,10 @@ 1 - 0 100 - 1 % percent + 0 100 + 1 @@ -263,20 +280,19 @@ Enabled - + CIRCLE/no change(if already in AUTO|GUIDED|LOITER) CIRCLE - FBWA at zero throttle + FBWA Disable - FBWB - 1 100 - 0.5 s seconds + 1 100 + 0.5 @@ -287,10 +303,10 @@ - 1 300 - 0.5 s seconds + 1 300 + 0.5 @@ -329,7 +345,6 @@ QAUTOTUNE QACRO THERMAL - Loiter to QLand @@ -357,7 +372,6 @@ QAUTOTUNE QACRO THERMAL - Loiter to QLand @@ -385,7 +399,6 @@ QAUTOTUNE QACRO THERMAL - Loiter to QLand @@ -413,7 +426,6 @@ QAUTOTUNE QACRO THERMAL - Loiter to QLand @@ -441,7 +453,6 @@ QAUTOTUNE QACRO THERMAL - Loiter to QLand @@ -469,7 +480,6 @@ QAUTOTUNE QACRO THERMAL - Loiter to QLand @@ -497,44 +507,37 @@ QAUTOTUNE QACRO THERMAL - Loiter to QLand - 0 9000 - 10 cdeg centidegrees + 0 9000 + 10 + cdeg + centidegrees 0 9000 10 - cdeg - centidegrees - -9000 0 - 10 cdeg centidegrees + -9000 0 + 10 - 10 500 - 1 deg/s degrees per second + 10 500 + 1 + deg/s + degrees per second 10 500 1 - deg/s - degrees per second - - - 0 500 - 1 - deg/s - degrees per second @@ -543,16 +546,22 @@ - -100 100 - 0.1 m meters + -100 100 + 0.1 - 10 360 - 1 deg/s degrees per second + 10 360 + 1 + + + + Disabled + Enabled + 0.5 1.2 @@ -564,40 +573,40 @@ - -1000 1000 d% decipercent + -1000 1000 - -100 100 % percent + -100 100 True - 0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:CTUN,5:NTUN,6:MODE,7:IMU,8:CMD,9:CURRENT,10:COMPASS,11:TECS,12:CAMERA,13:RC,14:SONAR,15:ARM/DISARM,19:IMU_RAW,20:ATTITUDE_FULLRATE,21:VideoStabilization + 0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:CTUN,5:NTUN,6:MODE,7:IMU,8:CMD,9:CURRENT,10:COMPASS,11:TECS,12:CAMERA,13:RC,14:SONAR,15:ARM/DISARM,19:IMU_RAW cm/s centimeters per second - 0 50 - 0.1 m/s meters per second + 0 50 + 0.1 cm/s centimeters per second - -4500 4500 - 10 cdeg centidegrees + -4500 4500 + 10 cm @@ -621,39 +630,40 @@ 0 100 - 1 % percent + 1 0 100 - 1 m/s meters per second + 1 - + 0 16 1 - + + + Disable - Fly HOME then land - Go directly to landing sequence - OnlyForGoAround + Enable - go HOME then land + Enable - go directly to landing sequence - 10 127 - 1 m/s/s meters per square second + 10 127 + 1 - 0:Disarm Disabled + 0:Disarm @@ -669,39 +679,39 @@ 0 100 - 1 % percent + 1 0:Chan1,1:Chan2,2:Chan3,3:Chan4,4:Chan5,5:Chan6,6:Chan7,7:Chan8,8:Chan9,9:Chan10,10:Chan11,11:Chan12,12:Chan13,13:Chan14,14:Chan15,15:Chan16 - -1 127 Never reset Always reset + -1 127 m meters - 0:Rudder mixing in direct flight modes only (Manual / Stabilize / Acro),1:Use centered throttle in Cruise or FBWB to indicate trim airspeed, 2:Disable attitude check for takeoff arming, 3:Force target airspeed to trim airspeed in Cruise or FBWB, 4: Climb to ALT_HOLD_RTL before turning for RTL, 5: Enable yaw damper in acro mode, 6: Surpress speed scaling during auto takeoffs to be 1 or less to prevent oscillations without airpseed sensor., 7:EnableDefaultAirspeed for takeoff, 8: Remove the TRIM_PITCH_CD on the GCS horizon, 9: Remove the TRIM_PITCH_CD on the OSD horizon, 10: Adjust mid-throttle to be TRIM_THROTTLE in non-auto throttle modes except MANUAL, 11:Disable suppression of fixed wing rate gains in ground mode + 0:Rudder mixing in direct flight modes only (Manual / Stabilize / Acro),1:Use centered throttle in Cruise or FBWB to indicate trim airspeed, 2:Disable attitude check for takeoff arming, 3:Force target airspeed to trim airspeed in Cruise or FBWB, 4: Climb to ALT_HOLD_RTL before turning for RTL, 5: Enable yaw damper in acro mode, 6: Surpress speed scaling during auto takeoffs to be 1 or less to prevent oscillations without airpseed sensor. 1 10 0 100 - 1 % percent + 1 0 100 - 1 % percent + 1 0 120 @@ -710,31 +720,31 @@ seconds - 0:pitch control, 1:full span, 2:Progressive crow none D spoilers have pitch input use both control surfaces on each wing for roll Progressive crow flaps only first (0-50% flap in) then crow flaps (50 - 100% flap in) + 0:pitch control, 1:full span, 2:Progressive crow 0 100 - 1 % percent + 1 6 35 - 0.1 V volt + 0.1 6 35 - 0.1 V volt + 0.1 @@ -743,33 +753,14 @@ - - Strict - Default - Relaxed - + 0.6:Strict,0.8:Default,1.0:Relaxed - 0 30 - 1 m meters - - - 0 100 + 0 30 1 - - 0 100 - 1 - - - 0 100 - 1 - - - 0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 - @@ -779,7 +770,6 @@ Disabled uAvionix-MAVLink Sagetech - uAvionix-UCP True @@ -792,7 +782,7 @@ m meters - + -1 16777215 @@ -882,9 +872,6 @@ log all - - 0:Ping200X Send GPS,1:Squawk 7400 on RC failsafe,2:Squawk 7400 on GCS failsafe - @@ -967,11 +954,10 @@ 0.0 1.0 .01 - + Disabled - Use GPS for DCM position - Use GPS for DCM position and height + Enabled @@ -984,29 +970,29 @@ 0 127 - 1 m/s meters per second + 1 - -0.1745 +0.1745 - 0.01 rad radians + -0.1745 +0.1745 + 0.01 - -0.1745 +0.1745 - 0.01 rad radians + -0.1745 +0.1745 + 0.01 - -0.1745 +0.1745 - 0.01 rad radians + -0.1745 +0.1745 + 0.01 - + None Yaw45 @@ -1017,40 +1003,38 @@ Yaw270 Yaw315 Roll180 - Yaw45Roll180 - Yaw90Roll180 - Yaw135Roll180 + Roll180Yaw45 + Roll180Yaw90 + Roll180Yaw135 Pitch180 - Yaw225Roll180 - Yaw270Roll180 - Yaw315Roll180 + Roll180Yaw225 + Roll180Yaw270 + Roll180Yaw315 Roll90 - Yaw45Roll90 - Yaw90Roll90 - Yaw135Roll90 + Roll90Yaw45 + Roll90Yaw90 + Roll90Yaw135 Roll270 - Yaw45Roll270 - Yaw90Roll270 - Yaw135Roll270 + Roll270Yaw45 + Roll270Yaw90 + Roll270Yaw135 Pitch90 Pitch270 - Yaw90Pitch180 - Yaw270Pitch180 - Pitch90Roll90 - Pitch90Roll180 - Pitch90Roll270 - Pitch180Roll90 - Pitch180Roll270 - Pitch270Roll90 - Pitch270Roll180 - Pitch270Roll270 - Yaw90Pitch180Roll90 - Yaw270Roll90 + Pitch180Yaw90 + Pitch180Yaw270 + Roll90Pitch90 + Roll180Pitch90 + Roll270Pitch90 + Roll90Pitch180 + Roll270Pitch180 + Roll90Pitch270 + Roll180Pitch270 + Roll270Pitch270 + Roll90Pitch180Yaw90 + Roll90Yaw270 Yaw293Pitch68Roll180 Pitch315 - Pitch315Roll90 - Roll45 - Roll315 + Roll90Pitch315 Custom @@ -1072,21 +1056,21 @@ -180 180 - 1 deg degrees + 1 -180 180 - 1 deg degrees + 1 -180 180 - 1 deg degrees + 1 @@ -1098,9 +1082,9 @@ - 0.25 3.0 m/s/s meters per square second + 0.25 3.0 @@ -1127,7 +1111,7 @@ I2C-MS5525 (0x77) I2C-SDP3X I2C-DLVR-5in - DroneCAN + UAVCAN I2C-DLVR-10in I2C-DLVR-20in I2C-DLVR-30in @@ -1137,9 +1121,6 @@ ASP5033 - - True - DoNotUse @@ -1157,13 +1138,8 @@ - - - Normal - Swapped - Auto Detect - - + + Disable @@ -1185,8 +1161,8 @@ 2ndSensor - - 0:SpeedMismatchDisable, 1:AllowSpeedMismatchRecovery, 2:DisableVoltageCorrection + + 0:Disable sensor, 1:Re-enable sensor m/s @@ -1206,7 +1182,7 @@ I2C-MS5525 (0x77) I2C-SDP3X I2C-DLVR-5in - DroneCAN + UAVCAN I2C-DLVR-10in I2C-DLVR-20in I2C-DLVR-30in @@ -1233,13 +1209,8 @@ - - - Normal - Swapped - Auto Detect - - + + Disable @@ -1255,9 +1226,6 @@ Bus2(auxillary) - - True - @@ -1324,22 +1292,22 @@ - True - True - 1 Pa pascal + 1 + True + True - True - 1 degC degrees Celsius + 1 + True - 0.1 m meters + 0.1 @@ -1356,30 +1324,27 @@ - - Freshwater - Saltwater - + 1.0:Freshwater,1.024:Saltwater - True - True - 1 Pa pascal + 1 + True + True - True - True - 1 Pa pascal + 1 + True + True - 0 100 - 1 % percent + 0 100 + 1 0:BMP085,1:BMP280,2:MS5611,3:MS5607,4:MS5637,5:FBM320,6:DPS280,7:LPS25H,8:Keller,9:MS5837,10:BMP388,11:SPL06,12:MSP @@ -1475,9 +1440,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -1487,96 +1452,13 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - 1 - W - watt - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - RTL - Land - Terminate - QLand - Loiter to QLand - - - - - None - RTL - Land - Terminate - QLand - Parachute - Loiter to QLand - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - Navigator Pixhawk2_PM2/CubeOrange_PM2 CubeOrange Durandal @@ -1588,7 +1470,7 @@ Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - CubeOrange_PM2/Navigator + CubeOrange_PM2 Pixhawk2_PM2 CubeOrange Durandal @@ -1606,23 +1488,84 @@ V volt - + + mAh + milliampere hour + 50 + + + W + watt + 1 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + RTL + Land + Terminate + QLand + + + + + None + RTL + Land + Terminate + QLand + Parachute + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -1634,9 +1577,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -1646,96 +1589,13 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - 1 - W - watt - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - RTL - Land - Terminate - QLand - Loiter to QLand - - - - - None - RTL - Land - Terminate - QLand - Parachute - Loiter to QLand - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - Navigator Pixhawk2_PM2/CubeOrange_PM2 CubeOrange Durandal @@ -1747,7 +1607,7 @@ Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - CubeOrange_PM2/Navigator + CubeOrange_PM2 Pixhawk2_PM2 CubeOrange Durandal @@ -1765,23 +1625,84 @@ V volt - + + mAh + milliampere hour + 50 + + + W + watt + 1 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + RTL + Land + Terminate + QLand + + + + + None + RTL + Land + Terminate + QLand + Parachute + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -1793,9 +1714,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -1805,96 +1726,13 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - 1 - W - watt - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - RTL - Land - Terminate - QLand - Loiter to QLand - - - - - None - RTL - Land - Terminate - QLand - Parachute - Loiter to QLand - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - Navigator Pixhawk2_PM2/CubeOrange_PM2 CubeOrange Durandal @@ -1906,7 +1744,7 @@ Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - CubeOrange_PM2/Navigator + CubeOrange_PM2 Pixhawk2_PM2 CubeOrange Durandal @@ -1924,23 +1762,84 @@ V volt - + + mAh + milliampere hour + 50 + + + W + watt + 1 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + RTL + Land + Terminate + QLand + + + + + None + RTL + Land + Terminate + QLand + Parachute + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -1952,9 +1851,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -1964,96 +1863,13 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - 1 - W - watt - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - RTL - Land - Terminate - QLand - Loiter to QLand - - - - - None - RTL - Land - Terminate - QLand - Parachute - Loiter to QLand - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - Navigator Pixhawk2_PM2/CubeOrange_PM2 CubeOrange Durandal @@ -2065,7 +1881,7 @@ Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - CubeOrange_PM2/Navigator + CubeOrange_PM2 Pixhawk2_PM2 CubeOrange Durandal @@ -2083,23 +1899,84 @@ V volt - + + mAh + milliampere hour + 50 + + + W + watt + 1 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + RTL + Land + Terminate + QLand + + + + + None + RTL + Land + Terminate + QLand + Parachute + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -2111,9 +1988,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -2123,96 +2000,13 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - 1 - W - watt - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - RTL - Land - Terminate - QLand - Loiter to QLand - - - - - None - RTL - Land - Terminate - QLand - Parachute - Loiter to QLand - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - Navigator Pixhawk2_PM2/CubeOrange_PM2 CubeOrange Durandal @@ -2224,7 +2018,7 @@ Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - CubeOrange_PM2/Navigator + CubeOrange_PM2 Pixhawk2_PM2 CubeOrange Durandal @@ -2242,23 +2036,84 @@ V volt - + + mAh + milliampere hour + 50 + + + W + watt + 1 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + RTL + Land + Terminate + QLand + + + + + None + RTL + Land + Terminate + QLand + Parachute + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -2270,9 +2125,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -2282,96 +2137,13 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - 1 - W - watt - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - RTL - Land - Terminate - QLand - Loiter to QLand - - - - - None - RTL - Land - Terminate - QLand - Parachute - Loiter to QLand - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - Navigator Pixhawk2_PM2/CubeOrange_PM2 CubeOrange Durandal @@ -2383,7 +2155,7 @@ Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - CubeOrange_PM2/Navigator + CubeOrange_PM2 Pixhawk2_PM2 CubeOrange Durandal @@ -2401,23 +2173,84 @@ V volt - + + mAh + milliampere hour + 50 + + + W + watt + 1 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + RTL + Land + Terminate + QLand + + + + + None + RTL + Land + Terminate + QLand + Parachute + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -2429,9 +2262,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -2441,96 +2274,13 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - 1 - W - watt - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - RTL - Land - Terminate - QLand - Loiter to QLand - - - - - None - RTL - Land - Terminate - QLand - Parachute - Loiter to QLand - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - Navigator Pixhawk2_PM2/CubeOrange_PM2 CubeOrange Durandal @@ -2542,7 +2292,7 @@ Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - CubeOrange_PM2/Navigator + CubeOrange_PM2 Pixhawk2_PM2 CubeOrange Durandal @@ -2560,23 +2310,84 @@ V volt - + + mAh + milliampere hour + 50 + + + W + watt + 1 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + RTL + Land + Terminate + QLand + + + + + None + RTL + Land + Terminate + QLand + Parachute + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -2588,9 +2399,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -2600,96 +2411,13 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - 1 - W - watt - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - RTL - Land - Terminate - QLand - Loiter to QLand - - - - - None - RTL - Land - Terminate - QLand - Parachute - Loiter to QLand - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - Navigator Pixhawk2_PM2/CubeOrange_PM2 CubeOrange Durandal @@ -2701,7 +2429,7 @@ Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - CubeOrange_PM2/Navigator + CubeOrange_PM2 Pixhawk2_PM2 CubeOrange Durandal @@ -2719,23 +2447,84 @@ V volt - + + mAh + milliampere hour + 50 + + + W + watt + 1 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + RTL + Land + Terminate + QLand + + + + + None + RTL + Land + Terminate + QLand + Parachute + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -2747,9 +2536,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -2759,96 +2548,13 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - 1 - W - watt - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - RTL - Land - Terminate - QLand - Loiter to QLand - - - - - None - RTL - Land - Terminate - QLand - Parachute - Loiter to QLand - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - Navigator Pixhawk2_PM2/CubeOrange_PM2 CubeOrange Durandal @@ -2860,7 +2566,7 @@ Disabled Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 - CubeOrange_PM2/Navigator + CubeOrange_PM2 Pixhawk2_PM2 CubeOrange Durandal @@ -2878,27 +2584,102 @@ V volt - + + mAh + milliampere hour + 50 + + + W + watt + 1 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + RTL + Land + Terminate + QLand + + + + + None + RTL + Land + Terminate + QLand + Parachute + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC - + + + No PWMs + One PWMs + Two PWMs + Three PWMs + Four PWMs + Five PWMs + Six PWMs + Seven PWMs + Eight PWMs + + True + + Disabled Enabled @@ -2906,7 +2687,7 @@ True - + Disabled Enabled @@ -2965,7 +2746,7 @@ 0:Output1,1:Output2,2:Output3,3:Output4,4:Output5,5:Output6,6:Output7,7:Output8,8:Output9,9:Output10,10:Output11,11:Output12,12:Output13,13:Output14 True - + -1 80 degC degrees Celsius @@ -3009,16 +2790,16 @@ 0:ActiveForSafetyEnable,1:ActiveForSafetyDisable,2:ActiveWhenArmed,3:Force safety on when the aircraft disarms + V + volt 4.0 5.5 0.1 - V - volt - 3.3 12.0 - 0.1 V volt + 3.3 12.0 + 0.1 0 32 @@ -3031,22 +2812,22 @@ - 0:Enable hardware watchdog, 1:Disable MAVftp, 2:Enable set of internal parameters, 3:Enable Debug Pins, 4:Unlock flash on reboot, 5:Write protect firmware flash on reboot, 6:Write protect bootloader flash on reboot + 0:Enable hardware watchdog, 1:Disable MAVftp, 2:Enable set of internal parameters 0 10000 ms milliseconds - + 1 500 1 - + 0 1 0.1 - + 0 100 1 @@ -3055,11 +2836,6 @@ 1 True - - 0 20 - degC - degrees Celsius - @@ -3229,9 +3005,7 @@ Do Nothing ModeRTL Camera Trigger - Fence ModeAuto - Parachute Release Auto Mission Reset Retract Mount Relay On/Off @@ -3242,19 +3016,18 @@ Relay3 On/Off Relay4 On/Off ADSB Avoidance En - ArmDisarm (4.1 and lower) + ArmDisarm InvertedFlight RC Override Enable ModeManual - ModeACRO ModeGuided ModeLoiter Clear Waypoints Compass Learn Reverse Throttle GPS Disable - Relay5 On/Off - Relay6 On/Off + Relay5 + Relay6 ModeCircle ModeTakeoff RunCam Control @@ -3270,24 +3043,10 @@ EKF Pos Source Airspeed Ratio Calibration FBWA - VTX Power - FBWA taildragger takeoff mode - trigger re-reading of mode switch - ModeTraining KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Disable Airspeed Use - EnableFixedWingAutotune - ModeQRTL - CRUISE - ArmDisarm (4.2 and higher) - ArmDisarm with Quadplane AirMode (4.2 and higher) - set roll pitch and yaw trim to current servo and RC - Force FS Action to FBWA - Optflow Calibration - Weathervane Enable Flap Forward Throttle Scripting1 @@ -3305,9 +3064,7 @@ Do Nothing ModeRTL Camera Trigger - Fence ModeAuto - Parachute Release Auto Mission Reset Retract Mount Relay On/Off @@ -3318,19 +3075,18 @@ Relay3 On/Off Relay4 On/Off ADSB Avoidance En - ArmDisarm (4.1 and lower) + ArmDisarm InvertedFlight RC Override Enable ModeManual - ModeACRO ModeGuided ModeLoiter Clear Waypoints Compass Learn Reverse Throttle GPS Disable - Relay5 On/Off - Relay6 On/Off + Relay5 + Relay6 ModeCircle ModeTakeoff RunCam Control @@ -3346,24 +3102,10 @@ EKF Pos Source Airspeed Ratio Calibration FBWA - VTX Power - FBWA taildragger takeoff mode - trigger re-reading of mode switch - ModeTraining KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Disable Airspeed Use - EnableFixedWingAutotune - ModeQRTL - CRUISE - ArmDisarm (4.2 and higher) - ArmDisarm with Quadplane AirMode (4.2 and higher) - set roll pitch and yaw trim to current servo and RC - Force FS Action to FBWA - Optflow Calibration - Weathervane Enable Flap Forward Throttle Scripting1 @@ -3381,9 +3123,7 @@ Do Nothing ModeRTL Camera Trigger - Fence ModeAuto - Parachute Release Auto Mission Reset Retract Mount Relay On/Off @@ -3394,19 +3134,18 @@ Relay3 On/Off Relay4 On/Off ADSB Avoidance En - ArmDisarm (4.1 and lower) + ArmDisarm InvertedFlight RC Override Enable ModeManual - ModeACRO ModeGuided ModeLoiter Clear Waypoints Compass Learn Reverse Throttle GPS Disable - Relay5 On/Off - Relay6 On/Off + Relay5 + Relay6 ModeCircle ModeTakeoff RunCam Control @@ -3422,24 +3161,10 @@ EKF Pos Source Airspeed Ratio Calibration FBWA - VTX Power - FBWA taildragger takeoff mode - trigger re-reading of mode switch - ModeTraining KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Disable Airspeed Use - EnableFixedWingAutotune - ModeQRTL - CRUISE - ArmDisarm (4.2 and higher) - ArmDisarm with Quadplane AirMode (4.2 and higher) - set roll pitch and yaw trim to current servo and RC - Force FS Action to FBWA - Optflow Calibration - Weathervane Enable Flap Forward Throttle Scripting1 @@ -3457,9 +3182,7 @@ Do Nothing ModeRTL Camera Trigger - Fence ModeAuto - Parachute Release Auto Mission Reset Retract Mount Relay On/Off @@ -3470,19 +3193,18 @@ Relay3 On/Off Relay4 On/Off ADSB Avoidance En - ArmDisarm (4.1 and lower) + ArmDisarm InvertedFlight RC Override Enable ModeManual - ModeACRO ModeGuided ModeLoiter Clear Waypoints Compass Learn Reverse Throttle GPS Disable - Relay5 On/Off - Relay6 On/Off + Relay5 + Relay6 ModeCircle ModeTakeoff RunCam Control @@ -3498,24 +3220,10 @@ EKF Pos Source Airspeed Ratio Calibration FBWA - VTX Power - FBWA taildragger takeoff mode - trigger re-reading of mode switch - ModeTraining KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Disable Airspeed Use - EnableFixedWingAutotune - ModeQRTL - CRUISE - ArmDisarm (4.2 and higher) - ArmDisarm with Quadplane AirMode (4.2 and higher) - set roll pitch and yaw trim to current servo and RC - Force FS Action to FBWA - Optflow Calibration - Weathervane Enable Flap Forward Throttle Scripting1 @@ -3538,24 +3246,24 @@ - 0 50 ds deciseconds + 0 50 - 1000 2000 PWM PWM in microseconds + 1000 2000 - 1000 2000 PWM PWM in microseconds + 1000 2000 - 0 1000 m meters + 0 1000 @@ -3564,14 +3272,14 @@ - 0 10000 ms milliseconds + 0 10000 - 0 180 deg degrees + 0 180 @@ -3643,15 +3351,12 @@ Disabled - DroneCAN + UAVCAN ToshibaCAN PiccoloCAN CANTester - EFI_NWPMU - USD1 KDECAN - Scripting - Benewake + PacketDigitalCAN True @@ -3665,17 +3370,17 @@ 0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 - 1 500 Hz hertz + 1 500 0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15, 15: Servo 16 - 1 500 Hz hertz + 1 500 @@ -3700,10 +3405,10 @@ 1 250 - + 0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 - + 0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 @@ -3711,34 +3416,17 @@ Hz hertz - - 0:ClearDNADatabase,1:IgnoreDNANodeConflicts - - - 1 200 - Hz - hertz - - - 0 18 - - - 1024 16384 - Disabled - DroneCAN + UAVCAN ToshibaCAN PiccoloCAN CANTester - EFI_NWPMU - USD1 KDECAN - Scripting - Benewake + PacketDigitalCAN True @@ -3752,17 +3440,17 @@ 0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 - 1 500 Hz hertz + 1 500 0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15, 15: Servo 16 - 1 500 Hz hertz + 1 500 @@ -3787,10 +3475,10 @@ 1 250 - + 0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 - + 0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 @@ -3798,34 +3486,17 @@ Hz hertz - - 0:ClearDNADatabase,1:IgnoreDNANodeConflicts - - - 1 200 - Hz - hertz - - - 0 18 - - - 1024 16384 - Disabled - DroneCAN + UAVCAN ToshibaCAN PiccoloCAN CANTester - EFI_NWPMU - USD1 KDECAN - Scripting - Benewake + PacketDigitalCAN True @@ -3839,17 +3510,17 @@ 0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 - 1 500 Hz hertz + 1 500 0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15, 15: Servo 16 - 1 500 Hz hertz + 1 500 @@ -3874,10 +3545,10 @@ 1 250 - + 0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 - + 0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 @@ -3885,20 +3556,6 @@ Hz hertz - - 0:ClearDNADatabase,1:IgnoreDNANodeConflicts - - - 1 200 - Hz - hertz - - - 0 18 - - - 1024 16384 - @@ -3906,7 +3563,6 @@ Disabled First driver Second driver - Third driver True @@ -3920,7 +3576,6 @@ Disabled First driver Second driver - Third driver True @@ -3934,7 +3589,6 @@ Disabled First driver Second driver - Third driver True @@ -3988,64 +3642,61 @@ 1000 2000 - 1 PWM PWM in microseconds + 1 1000 2000 - 1 PWM PWM in microseconds + 1 0 32000 - 1 m meters + 1 0 5000 - 1 ms milliseconds + 1 0 15 - 1 m/s meters per second - - - 0:hold open forever after release + 1 - 1 -400 400 - 1 mGauss milligauss + 1 + 1 - 1 -400 400 - 1 mGauss milligauss + 1 + 1 -400 400 - 1 mGauss milligauss + 1 -3.142 3.142 - 0.01 rad radians + 0.01 @@ -4068,34 +3719,34 @@ - 1 Disabled Use Throttle Use Current + 1 - 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 + 1 - 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 + 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 - + None Yaw45 @@ -4106,44 +3757,42 @@ Yaw270 Yaw315 Roll180 - Yaw45Roll180 - Yaw90Roll180 - Yaw135Roll180 + Roll180Yaw45 + Roll180Yaw90 + Roll180Yaw135 Pitch180 - Yaw225Roll180 - Yaw270Roll180 - Yaw315Roll180 + Roll180Yaw225 + Roll180Yaw270 + Roll180Yaw315 Roll90 - Yaw45Roll90 - Yaw90Roll90 - Yaw135Roll90 + Roll90Yaw45 + Roll90Yaw90 + Roll90Yaw135 Roll270 - Yaw45Roll270 - Yaw90Roll270 - Yaw135Roll270 + Roll270Yaw45 + Roll270Yaw90 + Roll270Yaw135 Pitch90 Pitch270 - Yaw90Pitch180 - Yaw270Pitch180 - Pitch90Roll90 - Pitch90Roll180 - Pitch90Roll270 - Pitch180Roll90 - Pitch180Roll270 - Pitch270Roll90 - Pitch270Roll180 - Pitch270Roll270 - Yaw90Pitch180Roll90 - Yaw270Roll90 + Pitch180Yaw90 + Pitch180Yaw270 + Roll90Pitch90 + Roll180Pitch90 + Roll270Pitch90 + Roll90Pitch180 + Roll270Pitch180 + Roll90Pitch270 + Roll180Pitch270 + Roll270Pitch270 + Roll90Pitch180Yaw90 + Roll90Yaw270 Yaw293Pitch68Roll180 Pitch315 - Pitch315Roll90 - Roll45 - Roll315 + Roll90Pitch315 Custom - + Internal External @@ -4151,84 +3800,84 @@ - 1 -400 400 - 1 mGauss milligauss + 1 + 1 - 1 -400 400 - 1 mGauss milligauss + 1 + 1 -400 400 - 1 mGauss milligauss + 1 - 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 + 1 - 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 + 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 - 1 -400 400 - 1 mGauss milligauss + 1 + 1 - 1 -400 400 - 1 mGauss milligauss + 1 + 1 -400 400 - 1 mGauss milligauss + 1 - 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 + 1 - 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 + 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 True @@ -4288,12 +3937,10 @@ Yaw293Pitch68Roll180 Pitch315 Roll90Pitch315 - Roll45 - Roll315 Custom - + Internal External @@ -4349,12 +3996,10 @@ Yaw293Pitch68Roll180 Pitch315 Roll90Pitch315 - Roll45 - Roll315 Custom - + Internal External @@ -4424,20 +4069,19 @@ 1 - 0:HMC5883,1:LSM303D,2:AK8963,3:BMM150,4:LSM9DS1,5:LIS3MDL,6:AK09916,7:IST8310,8:ICM20948,9:MMC3416,11:DroneCAN,12:QMC5883,14:MAG3110,15:IST8308,16:RM3100,17:MSP,18:ExternalAHRS + 0:HMC5883,1:LSM303D,2:AK8963,3:BMM150,4:LSM9DS1,5:LIS3MDL,6:AK09916,7:IST8310,8:ICM20948,9:MMC3416,11:UAVCAN,12:QMC5883,14:MAG3110,15:IST8308,16:RM3100,17:MSP,18:ExternalAHRS - 0 100 - 1 % percent + 0 100 + 1 Disabled CheckOnly CheckAndFix - use same tolerance to auto rotate 45 deg rotations @@ -4454,7 +4098,6 @@ Disabled Enabled - True 0 1.3 @@ -4485,23 +4128,23 @@ -180 180 - 1 deg degrees + 1 True -180 180 - 1 deg degrees + 1 True -180 180 - 1 deg degrees + 1 True @@ -4541,46 +4184,11 @@ - - - - Disabled - Enabled - - - - - Disabled - Serial0 - Serial1 - Serial2 - Serial3 - Serial4 - Serial5 - Serial6 - - - - - Disabled - Driver1 - Driver2 - - - - 0:EnforceArming - - - m - meters - - None VectorNav - LORD @@ -4594,15 +4202,16 @@ None Serial-MS NWPMU - Serial-Lutan True 0 1 + False 0 10 + False @@ -4633,7 +4242,7 @@ m/s meters per second - + 100 1000 25 @@ -4879,16 +4488,24 @@ 0.1 30.0 Hz hertz + False - + 0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF True - + 0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF True - + + 500 5000 + 100 + ms + milliseconds + True + + 1 10 1 True @@ -4914,7 +4531,7 @@ m/s meters per second - + 100 1000 25 @@ -4947,9 +4564,9 @@ 0 250 10 + True ms milliseconds - True 0.01 0.5 @@ -5012,9 +4629,9 @@ 0 250 10 + True ms milliseconds - True 0.0001 0.1 @@ -5039,13 +4656,13 @@ meters per cubic second - 0.01 2.0 + 0.01 1.0 0.1 m/s/s meters per square second - 0.0 2.0 + 0.0 1.0 0.1 @@ -5095,7 +4712,7 @@ Gauss/s gauss per second - + -1 70 1 % @@ -5118,9 +4735,9 @@ 0 250 10 + True ms milliseconds - True 2.0 6.0 @@ -5172,21 +4789,29 @@ 0.1 30.0 Hz hertz + False 0 500 mGauss milligauss - + 0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF True - + 0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF True - + + 500 5000 + 100 + ms + milliseconds + True + + 1 10 1 True @@ -5229,10 +4854,6 @@ 0.0 10.0 0.5 - - 0 2 - 1 - @@ -5396,53 +5017,53 @@ + m + meters 10 1000 1 - m - meters - 30 10000 m meters + 30 10000 - 1 10 m meters + 1 10 1 20 - -100 100 - 1 m meters + -100 100 + 1 - 0 1 Fence Return Point Nearest Rally Point + 0 1 1 - 0 32767 - 1 m meters + 0 32767 + 1 0 3 + 1 AutoEnableOff AutoEnableOnTakeoff AutoEnableDisableFloorOnLanding AutoEnableOnlyWhenArmed - 1 @@ -5514,7 +5135,7 @@ Bebop CXOF MAVLink - DroneCAN + UAVCAN MSP UPFLOW @@ -5529,91 +5150,33 @@ 1 - -17999 +18000 - 10 cdeg centidegrees + -17999 +18000 + 10 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 0 127 - - - - Disabled - Enabled - - - - 0 255 - - - 1 1000 - m - meters - - - - North-East-Down - Relative to lead vehicle heading - - - - -100 100 - 1 - m - meters - - - -100 100 - 1 - m - meters - - - -100 100 - 1 - m - meters - - - - None - Face Lead Vehicle - Same as Lead vehicle - Direction of Flight - - - - 0.01 1.00 - 0.01 - - - - absolute - relative - - - @@ -5716,9 +5279,6 @@ 27 - - 0:EnableAirspeedAndGroundspeed - @@ -5737,11 +5297,13 @@ None AUTO uBlox + MTK + MTK19 NMEA SiRF HIL SwiftNav - DroneCAN + UAVCAN SBF GSOF ERB @@ -5753,8 +5315,6 @@ MSP AllyStar ExternalAHRS - DroneCAN-MovingBaseline-Base - DroneCAN-MovingBaseline-Rover True @@ -5763,11 +5323,13 @@ None AUTO uBlox + MTK + MTK19 NMEA SiRF HIL SwiftNav - DroneCAN + UAVCAN SBF GSOF ERB @@ -5779,8 +5341,6 @@ MSP AllyStar ExternalAHRS - DroneCAN-MovingBaseline-Base - DroneCAN-MovingBaseline-Rover True @@ -5863,88 +5423,87 @@ Disables automatic configuration - Enable automatic configuration for Serial GPSes only - Enable automatic configuration for DroneCAN as well + Enable automatic configuration - 50 200 + ms + milliseconds 10Hz 8Hz 5Hz - ms - milliseconds + 50 200 - 50 200 + ms + milliseconds 10Hz 8Hz 5Hz - ms - milliseconds + 50 200 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - 0 250 ms milliseconds + 0 250 True - 0 250 ms milliseconds + 0 250 True 0:Horiz Pos,1:Vert Pos,2:Speed - 5.0 30.0 s seconds + 5.0 30.0 - 0:Use UART2 for moving baseline on ublox,1:Use base station for GPS yaw on SBF,2:Use baudrate 115200,3:Use dedicated CAN port b/w GPSes for moving baseline + 0:Use UART2 for moving baseline on ublox,1:Use base station for GPS yaw on SBF 0 10 @@ -5957,11 +5516,11 @@ True + 1 FirstGPS SecondGPS - 1 True @@ -5969,9 +5528,9 @@ True - + - + @@ -5983,22 +5542,22 @@ True - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -6010,22 +5569,22 @@ True - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -6062,7 +5621,7 @@ s seconds - + 0 255 @@ -6101,7 +5660,7 @@ Enabled - + None Chan1 @@ -6123,14 +5682,14 @@ - 0.1 5 s seconds + 0.1 5 - 1 10 s seconds + 1 10 100 100000 @@ -6167,7 +5726,7 @@ - 0:DisableIgnitionRCFailsafe,2:ThrottleWhileDisarmed + 0:DisableIgnitionRCFailsafe 0 1300 @@ -6175,149 +5734,149 @@ - 1 rad/s radians per second + 1 - 1 rad/s radians per second + 1 - 1 rad/s radians per second + 1 - 1 rad/s radians per second + 1 - 1 rad/s radians per second + 1 - 1 rad/s radians per second + 1 - 1 rad/s radians per second + 1 - 1 rad/s radians per second + 1 - 1 rad/s radians per second + 1 - 1 0.8 1.2 + 1 - 1 0.8 1.2 + 1 - 1 0.8 1.2 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 1 0.8 1.2 + 1 - 1 0.8 1.2 + 1 - 1 0.8 1.2 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 1 0.8 1.2 + 1 - 1 0.8 1.2 + 1 - 1 0.8 1.2 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 0 256 Hz hertz + 0 256 - 0 256 Hz hertz + 0 256 @@ -6361,57 +5920,57 @@ - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -10 10 m meters + -10 10 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 True @@ -6435,7 +5994,7 @@ 0:FirstIMU,1:SecondIMU,2:ThirdIMU - 0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU,6:SeventhIMU + 0:FirstIMU,1:SecondIMU,2:ThirdIMU @@ -6447,85 +6006,39 @@ True - 1 degC degrees Celsius + 1 - 1 degC degrees Celsius + 1 - 1 degC degrees Celsius + 1 - 1 degC degrees Celsius + 1 - 1 degC degrees Celsius + 1 - 1 degC degrees Celsius + 1 0:PersistParams - - - - Disabled - Enabled - - - - 10 495 - Hz - hertz - - - 5 250 - Hz - hertz - - - 5 50 - dB - decibel - - - 0:1st harmonic,1:2nd harmonic,2:3rd harmonic,3:4th hamronic,4:5th harmonic,5:6th harmonic,6:7th harmonic,7:8th harmonic - True - - - 0.0 1.0 - True - - - 0 4 - - Disabled - Throttle - RPM Sensor - ESC Telemetry - Dynamic FFT - Second RPM Sensor - - - - 0:Double notch,1:Dynamic harmonic,2:Update at loop rate - True - - @@ -6548,7 +6061,7 @@ dB decibel - + 0:1st harmonic,1:2nd harmonic,2:3rd harmonic,3:4th hamronic,4:5th harmonic,5:6th harmonic,6:7th harmonic,7:8th harmonic True @@ -6564,7 +6077,6 @@ RPM Sensor ESC Telemetry Dynamic FFT - Second RPM Sensor @@ -6585,14 +6097,37 @@ 0:Sensor-Rate Logging (sample at full sensor rate seen by AP), 1: Sample post-filtering - 10 ms milliseconds + 10 1 + + + + Disabled + Enabled + + + + 5 30 + dB + decibel + + + 10 400 + Hz + hertz + + + 5 100 + Hz + hertz + + @@ -6603,16 +6138,16 @@ True - 1 -70 80 degC degrees Celsius + 1 - 1 -70 80 degC degrees Celsius + 1 1 @@ -6679,16 +6214,16 @@ True - 1 -70 80 degC degrees Celsius + 1 - 1 -70 80 degC degrees Celsius + 1 1 @@ -6755,16 +6290,16 @@ True - 1 -70 80 degC degrees Celsius + 1 - 1 -70 80 degC degrees Celsius + 1 1 @@ -6824,63 +6359,63 @@ 0 5 - 0.5 m meters + 0.5 0 90 - 0.1 deg degrees + 0.1 - -2000 2000 - 10 cdeg centidegrees + -2000 2000 + 10 - 0 30 - 0.1 m meters + 0 30 + 0.1 - 0 10 - 0.1 s seconds + 0 10 + 0.1 - 0 30 - 0.1 m meters - - - 0 10 - 0.1 - s - seconds - - 0 30 0.1 - m/s - meters per second - - 0 127 - 1 - % - percent - - - 0 127 - 1 + s seconds + 0 10 + 0.1 + + + m/s + meters per second + 0 30 + 0.1 + + + % + percent + 0 127 + 1 + + + s + seconds + 1 + 0 127 @@ -6897,12 +6432,9 @@ 0 100 - 1 % percent - - - 0: honor min throttle during landing flare + 1 @@ -6910,6 +6442,9 @@ Deepstall + + 0: honor min throttle during landing flare + @@ -6987,12 +6522,6 @@ - - - Disabled - Enabled - - WaitForPilotInput @@ -7037,16 +6566,16 @@ - 0 1000 - 1 m meters + 0 1000 + 1 - 0 1000 - 1 m meters + 0 1000 + 1 0:Retract after Takeoff,1:Deploy during Land @@ -7085,31 +6614,16 @@ seconds - 10 1000 MB megabyte - - - 0 1000 - Hz - hertz - - - 0 1000 - Hz - hertz - - - 0 1000 - Hz - hertz + 10 1000 - True 0 32766 1 + True @@ -7143,40 +6657,40 @@ - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 @@ -7210,16 +6724,16 @@ - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 @@ -7235,16 +6749,16 @@ - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 @@ -7260,32 +6774,32 @@ - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 0 100 1 - 0.0 0.2 - .005 s seconds + 0.0 0.2 + .005 - 0.0 0.2 - .005 s seconds + 0.0 0.2 + .005 @@ -7297,40 +6811,40 @@ - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 @@ -7364,16 +6878,16 @@ - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 @@ -7389,16 +6903,16 @@ - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 @@ -7414,28 +6928,28 @@ - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 - 0.0 0.2 - .005 s seconds + 0.0 0.2 + .005 - 0.0 0.2 - .005 s seconds + 0.0 0.2 + .005 @@ -7469,15 +6983,15 @@ - 0:EnableTelemetryMode, 1: DisableDJIWorkarounds, 2:EnableBTFLFonts + 0:EnableTelemetryMode - 1 60 - 1 s seconds + 1 60 + 1 0.6 1.0 @@ -7488,9 +7002,9 @@ 0.01 - 0 89 deg degrees + 0 89 @@ -7503,7 +7017,7 @@ - 0:Built-in buzzer, 1:DShot, 2:DroneCAN + 0:Built-in buzzer, 1:DShot, 2:UAVCAN @@ -7534,7 +7048,7 @@ - 0:Built-in LED, 1:Internal ToshibaLED, 2:External ToshibaLED, 3:External PCA9685, 4:Oreo LED, 5:DroneCAN, 6:NCP5623 External, 7:NCP5623 Internal, 8:NeoPixel, 9:ProfiLED, 10:Scripting, 11:DShot, 12:ProfiLED_SPI + 0:Built-in LED, 1:Internal ToshibaLED, 2:External ToshibaLED, 3:External PCA9685, 4:Oreo LED, 5:UAVCAN, 6:NCP5623 External, 7:NCP5623 Internal, 8:NeoPixel, 9:ProfiLED, 10:Scripting, 11:DShot @@ -7588,7 +7102,7 @@ - 0:UseDecimalPack, 1:InvertedWindPointer, 2:InvertedAHRoll, 3:Convert feet to miles at 5280ft instead of 10000ft, 4:DisableCrosshair + 0:UseDecimalPack, 1:InvertedWindPointer, 2:InvertedAHRoll True @@ -7865,40 +7379,40 @@ 0 15 - + Disabled Enabled - + 0 29 - + 0 15 - + Disabled Enabled - + 0 29 - + 0 15 - + Disabled Enabled - + 0 29 - + 0 15 @@ -8141,16 +7655,16 @@ 0 15 - + Disabled Enabled - + 0 29 - + 0 15 @@ -8345,18 +7859,6 @@ 0 15 - - - Disabled - Enabled - - - - 0 29 - - - 0 15 - @@ -8575,40 +8077,40 @@ 0 15 - + Disabled Enabled - + 0 29 - + 0 15 - + Disabled Enabled - + 0 29 - + 0 15 - + Disabled Enabled - + 0 29 - + 0 15 @@ -8851,16 +8353,16 @@ 0 15 - + Disabled Enabled - + 0 29 - + 0 15 @@ -9055,18 +8557,6 @@ 0 15 - - - Disabled - Enabled - - - - 0 29 - - - 0 15 - @@ -9285,40 +8775,40 @@ 0 15 - + Disabled Enabled - + 0 29 - + 0 15 - + Disabled Enabled - + 0 29 - + 0 15 - + Disabled Enabled - + 0 29 - + 0 15 @@ -9561,16 +9051,16 @@ 0 15 - + Disabled Enabled - + 0 29 - + 0 15 @@ -9765,18 +9255,6 @@ 0 15 - - - Disabled - Enabled - - - - 0 29 - - - 0 15 - @@ -9995,40 +9473,40 @@ 0 15 - + Disabled Enabled - + 0 29 - + 0 15 - + Disabled Enabled - + 0 29 - + 0 15 - + Disabled Enabled - + 0 29 - + 0 15 @@ -10271,16 +9749,16 @@ 0 15 - + Disabled Enabled - + 0 29 - + 0 15 @@ -10475,18 +9953,6 @@ 0 15 - - - Disabled - Enabled - - - - 0 29 - - - 0 15 - @@ -11035,21 +10501,21 @@ 0.4 1.0 - 0.1 s seconds + 0.1 - + 0 100 - 1 deg/s degrees per second - - - 0 100 1 + + + 0 100 deg/s degrees per second + 1 0.7 1.5 @@ -11105,72 +10571,83 @@ Enable Enable VTOL AUTO - True - 1000 8000 - 10 cdeg centidegrees + 10 + 1000 8000 - 1 30000 ms milliseconds + 0 30000 - 50 500 - 10 cm/s centimeters per second + 50 500 + 10 - 50 500 - 10 cm/s centimeters per second + 50 500 + 10 - 50 500 - 10 cm/s/s centimeters per square second + 50 500 + 10 - 50 500 - 10 Hz hertz + 50 500 + 10 - - 0 100 - 0.1 + + PWM + PWM in microseconds + 800 2200 + 1 + + + PWM + PWM in microseconds + 800 2200 + 1 + + m/s meters per second + 0 100 + 0.1 - 50 500 - 1 deg/s degrees per second + 50 500 + 1 - 30 200 - 10 cm/s centimeters per second + 30 200 + 10 - 0.5 50 - 0.1 m meters + 0.5 50 + 0.1 0 30 - 1 deg degrees + 1 @@ -11181,11 +10658,10 @@ OctaQuad Y6 Tri - Single/Dual + TailSitter DodecaHexa Deca Scripting Matrix - Dynamic Scripting Matrix @@ -11211,11 +10687,19 @@ 0 0.5 0.01 + + 0 1 + 0.01 + + + 0 10 + 0.1 + - 1 200 - 1 m meters + 1 200 + 1 @@ -11225,6 +10709,20 @@ QRTL Always + + + + deg/s + degrees per second + 1 + 10 300 + + + deg + degrees + 1 + 20 80 + Disabled @@ -11239,10 +10737,10 @@ - 0 10 - 0.25 m meters + 0 10 + 0.25 @@ -11251,10 +10749,68 @@ - 0 90 - 1 deg degrees + 0 90 + 1 + + + + Continuous + Binary + VectoredYaw + Bicopter + + + + deg + degrees + 5 80 + + + deg + degrees + 5 80 + + + deg/s + degrees per second + 1 + 10 300 + + + 0:PlaneMode,1:BodyFrameRoll + + + 0:Aileron,1:Elevator,2:Throttle,3:Rudder + + + + Disabled + Channel1 + Channel2 + Channel3 + Channel4 + Channel5 + Channel6 + Channel7 + Channel8 + + + + 0 1 + 0.01 + + + 0 1 + 0.01 + + + 0 30 + + + 0 4 + 0.1 @@ -11276,101 +10832,121 @@ VTOL_TILTROTOR - - 0:Level Transition,1:Allow FW Takeoff,2:Allow FW Land,3:Vtol Takeoff Frame,4:Use FW Approach,5:Use QRTL,6:Use Governor,7:Force Qassist,8:Mtrs_Only_Qassist,10:Disarmed Yaw Tilt,11:Delay Spoolup,12:disable Qassist based on synthetic airspeed,13:Disable Ground Effect Compensation,14:Ignore forward flight angle limits in Qmodes,15:ThrLandControl,16:DisableApproach,17:EnableLandResponsition,18:ARMVtol, 19: CompleteTransition if Q_TRANS_FAIL, 20: Force RTL mode on VTOL failsafes overriding bit 5(USE QRTL) + + 0:Level Transition,1:Allow FW Takeoff,2:Allow FW Land,3:Vtol Takeoff Frame,4:Use FW Approach,5:Use QRTL,6:Use Governor,7:Force Qassist,8:Mtrs_Only_Qassist,9:Airmode_On_Arm,10:Disarmed Yaw Tilt,11:Delay Spoolup,12:disable Qassist based on synthetic airspeed,13:Disable Ground Effect Compensation,14:Ignore forward flight angle limits in Qmodes,15:ThrLandControl,16:DisableApproach,17:EnableLandResponsition - 0.2 5 - 0.1 m/s/s meters per square second - - - -10 +10 0.1 + 0.2 5 + + + 1 5 + + deg degrees + -10 +10 + 0.1 True + + deg + degrees + 0 80 + - 0 200 - 5 m meters + 0 200 + 5 - - 0 20 - 1 + s seconds + 0 20 + 1 + + + 0:Motor 1,1:Motor 2,2:Motor 3,3:Motor 4, 4:Motor 5,5:Motor 6,6:Motor 7,7:Motor 8 0 1 .1 - 10 500 - 1 deg/s degrees per second + 10 500 + 1 - 10 500 - 1 deg/s degrees per second + 10 500 + 1 - 10 500 - 1 deg/s degrees per second + 10 500 + 1 1.1 5.0 5.1 - 0 20 - 1 m/s meters per second + 0 20 + 1 - 0 120 - 1 m meters + 0 120 + 1 + + + 0:Throttle,1:ATT_THR,2:Disk Theory,3:Altitude correction + + + 0.1 1 - 0 2 - 0.1 s seconds + 0 2 + 0.1 0 100 + False - - 0 10000 - ms - milliseconds + + kg/m/m + kilograms per square meter + 0 50 - - - Warn only - QLand - QRTL - + + deg + degrees + 0 30 - - 0.1 0.6 - 0.05 - m - meters + + 0 1 - - 0 5 + + deg/s + degrees per second + 10 500 + + + deg/s + degrees per second + 10 500 @@ -11386,12 +10962,14 @@ - 500 18000 - 100 cdeg/s centidegrees per second + 500 18000 + 100 + cdeg/s/s + centidegrees per square second 0 72000 Disabled @@ -11401,8 +10979,6 @@ Fast 1000 - cdeg/s/s - centidegrees per square second @@ -11411,7 +10987,10 @@ + cdeg/s/s + centidegrees per square second 0 180000 + 1000 Disabled VerySlow @@ -11419,12 +10998,12 @@ Medium Fast - 1000 - cdeg/s/s - centidegrees per square second + cdeg/s/s + centidegrees per square second 0 180000 + 1000 Disabled VerySlow @@ -11432,9 +11011,6 @@ Medium Fast - 1000 - cdeg/s/s - centidegrees per square second @@ -11455,53 +11031,47 @@ 0.5 10.0 - 0 1080 - - Disabled - Slow - Medium - Fast - - 1 deg/s degrees per second + 0 1080 + 1 + + Disabled + Slow + Medium + Fast + - 0 1080 - - Disabled - Slow - Medium - Fast - - 1 deg/s degrees per second + 0 1080 + 1 + + Disabled + Slow + Medium + Fast + - 0 1080 - - Disabled - Slow - Medium - Fast - - 1 deg/s degrees per second + 0 1080 + 1 + + Disabled + Slow + Medium + Fast + - 0 1 - - Very Soft - Soft - Medium - Crisp - Very Crisp - - 0.01 s seconds + 0 1 + 0.01 + 0.5:Very Soft,0.2:Soft,0.15:Medium,0.1:Crisp,0.05:Very Crisp 0.01 0.5 @@ -11640,41 +11210,41 @@ - - 0 45 - 1 + deg degrees + 0 45 + 1 - 20 3500 - 50 cm/s centimeters per second + 20 3500 + 50 + cm/s/s + centimeters per square second 100 981 1 - cm/s/s - centimeters per square second - 25 250 - 1 cm/s/s centimeters per square second + 25 250 + 1 - 500 5000 - 1 cm/s/s/s centimeters per cubic second + 500 5000 + 1 - 0 2 - 0.1 s seconds + 0 2 + 0.1 @@ -11687,11 +11257,7 @@ -1.0 1.0 - - Low - Default - High - + 0.9:Low,0.95:Default,1.0:High 6 53 @@ -11718,33 +11284,24 @@ DShot300 DShot600 DShot1200 - PWMRange True - - 0 2000 + PWM PWM in microseconds + 0 2000 - - 0 2000 + PWM PWM in microseconds + 0 2000 - - Low - Default - High - + 0.0:Low,0.15:Default,0.3:High - - Low - Default - High - + 0.0:Low,0.1:Default,0.2:High 0 10 @@ -11769,15 +11326,15 @@ 5 80 - 1 deg degrees + 1 0 2 - 0.1 s seconds + 0.1 0 5 @@ -11791,29 +11348,29 @@ 0 .5 - 0.001 s seconds + 0.001 0 .5 - 0.001 s seconds + 0.001 0 5 - 0.001 s seconds + 0.001 - 0.5 5 - 0.1 Hz hertz + 0.5 5 + 0.1 1.000 3.000 @@ -11908,12 +11465,12 @@ cm/s/s centimeters per square second - + 0 100 Hz hertz - + 0 100 Hz hertz @@ -11923,198 +11480,60 @@ 0.01 + deg + degrees 0 45 1 - deg - degrees - - 1 20 - 1 - m/s/s/s - meters per cubic second - - - 5 50 - 1 - m/s/s/s - meters per cubic second - - - - - - Disable - Enable - Enable Always - - True - - - 5 80 - deg - degrees - - - 5 80 - deg - degrees - - - 0:PlaneMode,1:BodyFrameRoll - - - 0 1 + + s + seconds + 0.25 2 0.01 - - 0 1 - 0.01 - - - 0 4 - 0.1 - - - 1 5 - - - 0 80 - deg - degrees - - - 0:Motor 1,1:Motor 2,2:Motor 3,3:Motor 4, 4:Motor 5,5:Motor 6,6:Motor 7,7:Motor 8 - - - 0:Throttle,1:ATT_THR,2:Disk Theory,3:Altitude correction - - + + s + seconds 0.1 1 - - - 0 50 - kg/m/m - kilograms per square meter - - - 10 500 - deg/s - degrees per second - - - 10 500 - deg/s - degrees per second - - - -1 100 - % - percent - - - 0 2 - - - 0 2 - - - 0 2 - - - 0 15 - - - - - - Disable - Enable - - True - - - - - 10 300 - 1 - deg/s - degrees per second - - - 20 80 - 1 - deg - degrees - - - - Continuous - Binary - VectoredYaw - Bicopter - - - - 10 300 - 1 - deg/s - degrees per second - - - 0 30 - - - 0 30 - deg - degrees - - - 0 1 - - - 0 15 - 1 - deg - degrees + 0.01 + cm/s + centimeters per second 20 2000 50 - cm/s - centimeters per second - 5 1000 - 1 cm centimeters + 5 1000 + 1 + cm/s + centimeters per second 10 1000 50 - cm/s - centimeters per second - 10 500 - 10 cm/s centimeters per second + 10 500 + 10 - 50 500 - 10 cm/s/s centimeters per square second + 50 500 + 10 - 50 500 - 10 cm/s/s centimeters per square second + 50 500 + 10 @@ -12123,85 +11542,18 @@ + m/s/s + meters per square second 1 20 - m/s/s/s - meters per cubic second - - - 0.1 100 - m - meters - - - - - - Disabled - Nose into wind - Nose or tail into wind - Side into wind - tail into wind - - - - 0.5 4 - 0.1 - - - 0 10 - 0.1 - deg - degrees - - - 0 50 - 1 - m - meters - - - 0 50 - 0.1 - m/s - meters per second - - - 0 5 - 0.1 - m/s - meters per second - - - - No override - Disabled - Nose into wind - Nose or tail into wind - Side into wind - tail into wind - - - - - No override - Disabled - Nose into wind - Nose or tail into wind - Side into wind - tail into wind - - - - 0:Use pitch when nose or tail-in for faster weathervaning - 0.1 km kilometers + 0.1 @@ -12217,30 +11569,30 @@ seconds - 0:Ignore RC Receiver, 1:Ignore MAVLink Overrides, 2:Ignore Receiver Failsafe bit but allow other RC failsafes if setup, 3:FPort Pad, 4:Log RC input bytes, 5:Arming check throttle for 0 input, 6:Skip the arming check for neutral Roll/Pitch/Yaw sticks, 7:Allow Switch reverse, 8:Use passthrough for CRSF telemetry, 9:Suppress CRSF mode/rate message for ELRS systems,10:Enable multiple receiver support, 11:CRSF RSSI shows Link Quality + 0:Ignore RC Receiver, 1:Ignore MAVLink Overrides, 2:Ignore Receiver Failsafe bit but allow other RC failsafes if setup, 3:FPort Pad, 4:Log RC input bytes, 5:Arming check throttle for 0 input, 6:Skip the arming check for neutral Roll/Pitch/Yay sticks, 7:Allow Switch reverse, 8:Use passthrough for CRSF telemetry - 0:All,1:PPM,2:IBUS,3:SBUS,4:SBUS_NI,5:DSM,6:SUMD,7:SRXL,8:SRXL2,9:CRSF,10:ST24,11:FPORT,12:FPORT2,13:FastSBUS + 0:All,1:PPM,2:IBUS,3:SBUS,4:SBUS_NI,5:DSM,6:SUMD,7:SRXL,8:SRXL2,9:CRSF,10:ST24,11:FPORT,12:FPORT2 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -12249,9 +11601,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -12260,7 +11612,6 @@ Camera Trigger Fence ModeAuto - Parachute Release Auto Mission Reset Retract Mount Relay On/Off @@ -12271,11 +11622,10 @@ Relay3 On/Off Relay4 On/Off ADSB Avoidance En - ArmDisarm (4.1 and lower) + ArmDisarm InvertedFlight RC Override Enable ModeManual - ModeACRO ModeGuided ModeLoiter Clear Waypoints @@ -12302,21 +11652,11 @@ VTX Power FBWA taildragger takeoff mode trigger re-reading of mode switch - ModeTraining KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - EnableFixedWingAutotune - ModeQRTL - CRUISE - ArmDisarm (4.2 and higher) - ArmDisarm with Quadplane AirMode (4.2 and higher) - set roll pitch and yaw trim to current servo and RC - Force FS Action to FBWA - Optflow Calibration - Weathervane Enable Flap Forward Throttle Scripting1 @@ -12332,22 +11672,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -12356,9 +11696,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -12367,7 +11707,6 @@ Camera Trigger Fence ModeAuto - Parachute Release Auto Mission Reset Retract Mount Relay On/Off @@ -12378,11 +11717,10 @@ Relay3 On/Off Relay4 On/Off ADSB Avoidance En - ArmDisarm (4.1 and lower) + ArmDisarm InvertedFlight RC Override Enable ModeManual - ModeACRO ModeGuided ModeLoiter Clear Waypoints @@ -12409,21 +11747,11 @@ VTX Power FBWA taildragger takeoff mode trigger re-reading of mode switch - ModeTraining KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - EnableFixedWingAutotune - ModeQRTL - CRUISE - ArmDisarm (4.2 and higher) - ArmDisarm with Quadplane AirMode (4.2 and higher) - set roll pitch and yaw trim to current servo and RC - Force FS Action to FBWA - Optflow Calibration - Weathervane Enable Flap Forward Throttle Scripting1 @@ -12439,22 +11767,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -12463,9 +11791,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -12474,7 +11802,6 @@ Camera Trigger Fence ModeAuto - Parachute Release Auto Mission Reset Retract Mount Relay On/Off @@ -12485,11 +11812,10 @@ Relay3 On/Off Relay4 On/Off ADSB Avoidance En - ArmDisarm (4.1 and lower) + ArmDisarm InvertedFlight RC Override Enable ModeManual - ModeACRO ModeGuided ModeLoiter Clear Waypoints @@ -12516,21 +11842,11 @@ VTX Power FBWA taildragger takeoff mode trigger re-reading of mode switch - ModeTraining KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - EnableFixedWingAutotune - ModeQRTL - CRUISE - ArmDisarm (4.2 and higher) - ArmDisarm with Quadplane AirMode (4.2 and higher) - set roll pitch and yaw trim to current servo and RC - Force FS Action to FBWA - Optflow Calibration - Weathervane Enable Flap Forward Throttle Scripting1 @@ -12546,22 +11862,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -12570,9 +11886,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -12581,7 +11897,6 @@ Camera Trigger Fence ModeAuto - Parachute Release Auto Mission Reset Retract Mount Relay On/Off @@ -12592,11 +11907,10 @@ Relay3 On/Off Relay4 On/Off ADSB Avoidance En - ArmDisarm (4.1 and lower) + ArmDisarm InvertedFlight RC Override Enable ModeManual - ModeACRO ModeGuided ModeLoiter Clear Waypoints @@ -12623,21 +11937,11 @@ VTX Power FBWA taildragger takeoff mode trigger re-reading of mode switch - ModeTraining KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - EnableFixedWingAutotune - ModeQRTL - CRUISE - ArmDisarm (4.2 and higher) - ArmDisarm with Quadplane AirMode (4.2 and higher) - set roll pitch and yaw trim to current servo and RC - Force FS Action to FBWA - Optflow Calibration - Weathervane Enable Flap Forward Throttle Scripting1 @@ -12653,22 +11957,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -12677,9 +11981,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -12688,7 +11992,6 @@ Camera Trigger Fence ModeAuto - Parachute Release Auto Mission Reset Retract Mount Relay On/Off @@ -12699,11 +12002,10 @@ Relay3 On/Off Relay4 On/Off ADSB Avoidance En - ArmDisarm (4.1 and lower) + ArmDisarm InvertedFlight RC Override Enable ModeManual - ModeACRO ModeGuided ModeLoiter Clear Waypoints @@ -12730,21 +12032,11 @@ VTX Power FBWA taildragger takeoff mode trigger re-reading of mode switch - ModeTraining KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - EnableFixedWingAutotune - ModeQRTL - CRUISE - ArmDisarm (4.2 and higher) - ArmDisarm with Quadplane AirMode (4.2 and higher) - set roll pitch and yaw trim to current servo and RC - Force FS Action to FBWA - Optflow Calibration - Weathervane Enable Flap Forward Throttle Scripting1 @@ -12760,22 +12052,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -12784,9 +12076,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -12795,7 +12087,6 @@ Camera Trigger Fence ModeAuto - Parachute Release Auto Mission Reset Retract Mount Relay On/Off @@ -12806,11 +12097,10 @@ Relay3 On/Off Relay4 On/Off ADSB Avoidance En - ArmDisarm (4.1 and lower) + ArmDisarm InvertedFlight RC Override Enable ModeManual - ModeACRO ModeGuided ModeLoiter Clear Waypoints @@ -12837,21 +12127,11 @@ VTX Power FBWA taildragger takeoff mode trigger re-reading of mode switch - ModeTraining KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - EnableFixedWingAutotune - ModeQRTL - CRUISE - ArmDisarm (4.2 and higher) - ArmDisarm with Quadplane AirMode (4.2 and higher) - set roll pitch and yaw trim to current servo and RC - Force FS Action to FBWA - Optflow Calibration - Weathervane Enable Flap Forward Throttle Scripting1 @@ -12867,22 +12147,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -12891,9 +12171,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -12902,7 +12182,6 @@ Camera Trigger Fence ModeAuto - Parachute Release Auto Mission Reset Retract Mount Relay On/Off @@ -12913,11 +12192,10 @@ Relay3 On/Off Relay4 On/Off ADSB Avoidance En - ArmDisarm (4.1 and lower) + ArmDisarm InvertedFlight RC Override Enable ModeManual - ModeACRO ModeGuided ModeLoiter Clear Waypoints @@ -12944,21 +12222,11 @@ VTX Power FBWA taildragger takeoff mode trigger re-reading of mode switch - ModeTraining KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - EnableFixedWingAutotune - ModeQRTL - CRUISE - ArmDisarm (4.2 and higher) - ArmDisarm with Quadplane AirMode (4.2 and higher) - set roll pitch and yaw trim to current servo and RC - Force FS Action to FBWA - Optflow Calibration - Weathervane Enable Flap Forward Throttle Scripting1 @@ -12974,22 +12242,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -12998,9 +12266,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -13009,7 +12277,6 @@ Camera Trigger Fence ModeAuto - Parachute Release Auto Mission Reset Retract Mount Relay On/Off @@ -13020,11 +12287,10 @@ Relay3 On/Off Relay4 On/Off ADSB Avoidance En - ArmDisarm (4.1 and lower) + ArmDisarm InvertedFlight RC Override Enable ModeManual - ModeACRO ModeGuided ModeLoiter Clear Waypoints @@ -13051,21 +12317,11 @@ VTX Power FBWA taildragger takeoff mode trigger re-reading of mode switch - ModeTraining KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - EnableFixedWingAutotune - ModeQRTL - CRUISE - ArmDisarm (4.2 and higher) - ArmDisarm with Quadplane AirMode (4.2 and higher) - set roll pitch and yaw trim to current servo and RC - Force FS Action to FBWA - Optflow Calibration - Weathervane Enable Flap Forward Throttle Scripting1 @@ -13081,22 +12337,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -13105,9 +12361,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -13116,7 +12372,6 @@ Camera Trigger Fence ModeAuto - Parachute Release Auto Mission Reset Retract Mount Relay On/Off @@ -13127,11 +12382,10 @@ Relay3 On/Off Relay4 On/Off ADSB Avoidance En - ArmDisarm (4.1 and lower) + ArmDisarm InvertedFlight RC Override Enable ModeManual - ModeACRO ModeGuided ModeLoiter Clear Waypoints @@ -13158,21 +12412,11 @@ VTX Power FBWA taildragger takeoff mode trigger re-reading of mode switch - ModeTraining KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - EnableFixedWingAutotune - ModeQRTL - CRUISE - ArmDisarm (4.2 and higher) - ArmDisarm with Quadplane AirMode (4.2 and higher) - set roll pitch and yaw trim to current servo and RC - Force FS Action to FBWA - Optflow Calibration - Weathervane Enable Flap Forward Throttle Scripting1 @@ -13188,22 +12432,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -13212,9 +12456,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -13223,7 +12467,6 @@ Camera Trigger Fence ModeAuto - Parachute Release Auto Mission Reset Retract Mount Relay On/Off @@ -13234,11 +12477,10 @@ Relay3 On/Off Relay4 On/Off ADSB Avoidance En - ArmDisarm (4.1 and lower) + ArmDisarm InvertedFlight RC Override Enable ModeManual - ModeACRO ModeGuided ModeLoiter Clear Waypoints @@ -13265,21 +12507,11 @@ VTX Power FBWA taildragger takeoff mode trigger re-reading of mode switch - ModeTraining KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - EnableFixedWingAutotune - ModeQRTL - CRUISE - ArmDisarm (4.2 and higher) - ArmDisarm with Quadplane AirMode (4.2 and higher) - set roll pitch and yaw trim to current servo and RC - Force FS Action to FBWA - Optflow Calibration - Weathervane Enable Flap Forward Throttle Scripting1 @@ -13295,22 +12527,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -13319,9 +12551,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -13330,7 +12562,6 @@ Camera Trigger Fence ModeAuto - Parachute Release Auto Mission Reset Retract Mount Relay On/Off @@ -13341,11 +12572,10 @@ Relay3 On/Off Relay4 On/Off ADSB Avoidance En - ArmDisarm (4.1 and lower) + ArmDisarm InvertedFlight RC Override Enable ModeManual - ModeACRO ModeGuided ModeLoiter Clear Waypoints @@ -13372,21 +12602,11 @@ VTX Power FBWA taildragger takeoff mode trigger re-reading of mode switch - ModeTraining KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - EnableFixedWingAutotune - ModeQRTL - CRUISE - ArmDisarm (4.2 and higher) - ArmDisarm with Quadplane AirMode (4.2 and higher) - set roll pitch and yaw trim to current servo and RC - Force FS Action to FBWA - Optflow Calibration - Weathervane Enable Flap Forward Throttle Scripting1 @@ -13402,22 +12622,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -13426,9 +12646,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -13437,7 +12657,6 @@ Camera Trigger Fence ModeAuto - Parachute Release Auto Mission Reset Retract Mount Relay On/Off @@ -13448,11 +12667,10 @@ Relay3 On/Off Relay4 On/Off ADSB Avoidance En - ArmDisarm (4.1 and lower) + ArmDisarm InvertedFlight RC Override Enable ModeManual - ModeACRO ModeGuided ModeLoiter Clear Waypoints @@ -13479,21 +12697,11 @@ VTX Power FBWA taildragger takeoff mode trigger re-reading of mode switch - ModeTraining KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - EnableFixedWingAutotune - ModeQRTL - CRUISE - ArmDisarm (4.2 and higher) - ArmDisarm with Quadplane AirMode (4.2 and higher) - set roll pitch and yaw trim to current servo and RC - Force FS Action to FBWA - Optflow Calibration - Weathervane Enable Flap Forward Throttle Scripting1 @@ -13509,22 +12717,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -13533,9 +12741,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -13544,7 +12752,6 @@ Camera Trigger Fence ModeAuto - Parachute Release Auto Mission Reset Retract Mount Relay On/Off @@ -13555,11 +12762,10 @@ Relay3 On/Off Relay4 On/Off ADSB Avoidance En - ArmDisarm (4.1 and lower) + ArmDisarm InvertedFlight RC Override Enable ModeManual - ModeACRO ModeGuided ModeLoiter Clear Waypoints @@ -13586,21 +12792,11 @@ VTX Power FBWA taildragger takeoff mode trigger re-reading of mode switch - ModeTraining KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - EnableFixedWingAutotune - ModeQRTL - CRUISE - ArmDisarm (4.2 and higher) - ArmDisarm with Quadplane AirMode (4.2 and higher) - set roll pitch and yaw trim to current servo and RC - Force FS Action to FBWA - Optflow Calibration - Weathervane Enable Flap Forward Throttle Scripting1 @@ -13616,22 +12812,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -13640,9 +12836,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -13651,7 +12847,6 @@ Camera Trigger Fence ModeAuto - Parachute Release Auto Mission Reset Retract Mount Relay On/Off @@ -13662,11 +12857,10 @@ Relay3 On/Off Relay4 On/Off ADSB Avoidance En - ArmDisarm (4.1 and lower) + ArmDisarm InvertedFlight RC Override Enable ModeManual - ModeACRO ModeGuided ModeLoiter Clear Waypoints @@ -13693,21 +12887,11 @@ VTX Power FBWA taildragger takeoff mode trigger re-reading of mode switch - ModeTraining KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - EnableFixedWingAutotune - ModeQRTL - CRUISE - ArmDisarm (4.2 and higher) - ArmDisarm with Quadplane AirMode (4.2 and higher) - set roll pitch and yaw trim to current servo and RC - Force FS Action to FBWA - Optflow Calibration - Weathervane Enable Flap Forward Throttle Scripting1 @@ -13723,22 +12907,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -13747,9 +12931,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -13758,7 +12942,6 @@ Camera Trigger Fence ModeAuto - Parachute Release Auto Mission Reset Retract Mount Relay On/Off @@ -13769,11 +12952,10 @@ Relay3 On/Off Relay4 On/Off ADSB Avoidance En - ArmDisarm (4.1 and lower) + ArmDisarm InvertedFlight RC Override Enable ModeManual - ModeACRO ModeGuided ModeLoiter Clear Waypoints @@ -13800,21 +12982,11 @@ VTX Power FBWA taildragger takeoff mode trigger re-reading of mode switch - ModeTraining KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - EnableFixedWingAutotune - ModeQRTL - CRUISE - ArmDisarm (4.2 and higher) - ArmDisarm with Quadplane AirMode (4.2 and higher) - set roll pitch and yaw trim to current servo and RC - Force FS Action to FBWA - Optflow Calibration - Weathervane Enable Flap Forward Throttle Scripting1 @@ -13830,22 +13002,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -13854,9 +13026,9 @@ - 0 200 PWM PWM in microseconds + 0 200 @@ -13865,7 +13037,6 @@ Camera Trigger Fence ModeAuto - Parachute Release Auto Mission Reset Retract Mount Relay On/Off @@ -13876,11 +13047,10 @@ Relay3 On/Off Relay4 On/Off ADSB Avoidance En - ArmDisarm (4.1 and lower) + ArmDisarm InvertedFlight RC Override Enable ModeManual - ModeACRO ModeGuided ModeLoiter Clear Waypoints @@ -13907,21 +13077,11 @@ VTX Power FBWA taildragger takeoff mode trigger re-reading of mode switch - ModeTraining KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - EnableFixedWingAutotune - ModeQRTL - CRUISE - ArmDisarm (4.2 and higher) - ArmDisarm with Quadplane AirMode (4.2 and higher) - set roll pitch and yaw trim to current servo and RC - Force FS Action to FBWA - Optflow Calibration - Weathervane Enable Flap Forward Throttle Scripting1 @@ -13972,14 +13132,6 @@ BB Blue GP0 pin 6 BB Blue GP0 pin 5 BBBMini Pin P8.17 - MainOut1 - MainOut2 - MainOut3 - MainOut4 - MainOut5 - MainOut6 - MainOut7 - MainOut8 @@ -13996,14 +13148,6 @@ BB Blue GP0 pin 6 BB Blue GP0 pin 5 BBBMini Pin P8.18 - MainOut1 - MainOut2 - MainOut3 - MainOut4 - MainOut5 - MainOut6 - MainOut7 - MainOut8 @@ -14020,14 +13164,6 @@ BB Blue GP0 pin 6 BB Blue GP0 pin 5 BBBMini Pin P8.19 - MainOut1 - MainOut2 - MainOut3 - MainOut4 - MainOut5 - MainOut6 - MainOut7 - MainOut8 @@ -14044,14 +13180,6 @@ BB Blue GP0 pin 6 BB Blue GP0 pin 5 BBBMini Pin P8.34 - MainOut1 - MainOut2 - MainOut3 - MainOut4 - MainOut5 - MainOut6 - MainOut7 - MainOut8 @@ -14075,14 +13203,6 @@ BB Blue GP0 pin 6 BB Blue GP0 pin 5 BBBMini Pin P8.13 - MainOut1 - MainOut2 - MainOut3 - MainOut4 - MainOut5 - MainOut6 - MainOut7 - MainOut8 @@ -14099,29 +13219,21 @@ BB Blue GP0 pin 6 BB Blue GP0 pin 5 BBBMini Pin P8.14 - MainOut1 - MainOut2 - MainOut3 - MainOut4 - MainOut5 - MainOut6 - MainOut7 - MainOut8 0.4 1.0 - 0.1 s seconds + 0.1 - + 0 180 - 1 deg/s degrees per second + 1 0.08 0.35 @@ -14167,7 +13279,7 @@ - + None Analog @@ -14179,7 +13291,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -14192,7 +13304,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -14202,35 +13314,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -14240,24 +13348,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -14273,37 +13381,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -14340,15 +13448,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -14360,7 +13462,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -14373,7 +13475,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -14383,35 +13485,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -14421,24 +13519,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -14454,37 +13552,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -14521,15 +13619,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -14541,7 +13633,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -14554,7 +13646,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -14564,35 +13656,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -14602,24 +13690,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -14635,37 +13723,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -14702,15 +13790,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -14722,7 +13804,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -14735,7 +13817,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -14745,35 +13827,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -14783,24 +13861,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -14816,37 +13894,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -14883,15 +13961,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -14903,7 +13975,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -14916,7 +13988,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -14926,35 +13998,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -14964,24 +14032,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -14997,37 +14065,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -15064,15 +14132,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -15084,7 +14146,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -15097,7 +14159,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -15107,35 +14169,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -15145,24 +14203,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -15178,37 +14236,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -15245,15 +14303,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -15265,7 +14317,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -15278,7 +14330,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -15288,35 +14340,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -15326,24 +14374,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -15359,37 +14407,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -15426,15 +14474,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -15446,7 +14488,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -15459,7 +14501,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -15469,35 +14511,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -15507,24 +14545,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -15540,37 +14578,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -15607,15 +14645,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -15627,7 +14659,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -15640,7 +14672,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -15650,35 +14682,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -15688,24 +14716,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -15721,37 +14749,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -15788,15 +14816,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -15808,7 +14830,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -15821,7 +14843,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -15831,35 +14853,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -15869,24 +14887,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -15902,37 +14920,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -15969,88 +14987,63 @@ High Speed - - 0 65535 - - - 0 65535 - - - + + None - Not Used + PWM AUXPIN EFI Harmonic Notch - ESC Telemetry Motors Bitmask - + 0.001 - + 1 - + 1 - + 0.1 - + Disabled - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + PixhawkAUX1 + PixhawkAUX2 + PixhawkAUX3 + PixhawkAUX4 + PixhawkAUX5 + PixhawkAUX6 - - 0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 - - - - + None - Not Used + PWM AUXPIN EFI Harmonic Notch - ESC Telemetry Motors Bitmask - + 0.001 - - 1 - - - 1 - - - 0.1 - - + Disabled - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + PixhawkAUX1 + PixhawkAUX2 + PixhawkAUX3 + PixhawkAUX4 + PixhawkAUX5 + PixhawkAUX6 - - 0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 - @@ -16070,39 +15063,39 @@ Pixhawk ADC4 Pixhawk ADC3 Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + PixhawkAUX1 + PixhawkAUX2 + PixhawkAUX3 + PixhawkAUX4 + PixhawkAUX5 + PixhawkAUX6 Pixhawk SBUS - - 0 5.0 - 0.01 + V volt + 0.01 + 0 5.0 - - 0 5.0 - 0.01 + V volt + 0.01 + 0 5.0 0 16 - 0 2000 PWM PWM in microseconds + 0 2000 - 0 2000 PWM PWM in microseconds + 0 2000 @@ -16145,9 +15138,8 @@ 1024 True - - 0:No Scripts to run message if all scripts have stopped, 1:Runtime messages for memory usage and execution time, 2:Suppress logging scripts to dataflash, 3:log runtime memory usage and execution time - + + @@ -16155,10 +15147,6 @@ - - - - 0:ROMFS, 1:APM/scripts @@ -16221,7 +15209,7 @@ RunCam HottTelem Scripting - Crossfire VTX + Crossfire Generator Winch MSP @@ -16230,11 +15218,6 @@ ADSB AHRS SmartAudio - FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort True @@ -16286,7 +15269,7 @@ RunCam HottTelem Scripting - Crossfire VTX + Crossfire Generator Winch MSP @@ -16295,11 +15278,6 @@ ADSB AHRS SmartAudio - FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort True @@ -16351,7 +15329,7 @@ RunCam HottTelem Scripting - Crossfire VTX + Crossfire Generator Winch MSP @@ -16360,11 +15338,6 @@ ADSB AHRS SmartAudio - FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort True @@ -16416,7 +15389,7 @@ RunCam HottTelem Scripting - Crossfire VTX + Crossfire Generator Winch MSP @@ -16425,11 +15398,6 @@ ADSB AHRS SmartAudio - FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort True @@ -16481,7 +15449,7 @@ RunCam HottTelem Scripting - Crossfire VTX + Crossfire Generator Winch MSP @@ -16490,11 +15458,6 @@ ADSB AHRS SmartAudio - FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort True @@ -16546,7 +15509,7 @@ RunCam HottTelem Scripting - Crossfire VTX + Crossfire Generator Winch MSP @@ -16555,11 +15518,6 @@ ADSB AHRS SmartAudio - FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort True @@ -16583,27 +15541,27 @@ - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate + 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from True - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate + 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from True - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate + 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from True - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate + 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from True - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate + 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from True - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate + 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from True @@ -16664,7 +15622,7 @@ RunCam HottTelem Scripting - Crossfire VTX + Crossfire Generator Winch MSP @@ -16672,12 +15630,6 @@ AirSpeed ADSB AHRS - SmartAudio - FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort True @@ -16701,7 +15653,7 @@ - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate + 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from True @@ -16733,7 +15685,7 @@ RunCam HottTelem Scripting - Crossfire VTX + Crossfire Generator Winch MSP @@ -16741,16 +15693,10 @@ AirSpeed ADSB AHRS - SmartAudio - FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort True - + 1200 2400 @@ -16770,76 +15716,7 @@ - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate - True - - - - None - MAVLink1 - MAVLink2 - Frsky D - Frsky SPort - GPS - Alexmos Gimbal Serial - SToRM32 Gimbal Serial - Rangefinder - FrSky SPort Passthrough (OpenTX) - Lidar360 - Beacon - Volz servo out - SBus servo out - ESC Telemetry - Devo Telemetry - OpticalFlow - RobotisServo - NMEA Output - WindVane - SLCAN - RCIN - MegaSquirt EFI - LTM - RunCam - HottTelem - Scripting - Crossfire VTX - Generator - Winch - MSP - DJI FPV - AirSpeed - ADSB - AHRS - SmartAudio - FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort - - True - - - - 1200 - 2400 - 4800 - 9600 - 19200 - 38400 - 57600 - 111100 - 115200 - 230400 - 256000 - 460800 - 500000 - 921600 - 1500000 - - - - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate + 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from True @@ -16867,33 +15744,28 @@ None - BLHeli32/Kiss - BLHeli_S + BLHeli32/BLHeli_S/Kiss - - 0:Servo 1, 1:Servo 2, 2:Servo 3, 3:Servo 4, 4:Servo 5, 5:Servo 6, 6:Servo 7, 7:Servo 8, 8:Servo 9, 9:Servo 10, 10:Servo 11, 11:Servo 12, 12:Servo 13, 13:Servo 14, 14:Servo 15, 15:Servo 16 - True - + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -16903,7 +15775,6 @@ - GPIO Disabled RCPassThru Flap @@ -17011,29 +15882,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -17043,7 +15912,6 @@ - GPIO Disabled RCPassThru Flap @@ -17151,29 +16019,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -17183,7 +16049,6 @@ - GPIO Disabled RCPassThru Flap @@ -17291,29 +16156,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -17323,7 +16186,6 @@ - GPIO Disabled RCPassThru Flap @@ -17431,29 +16293,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -17463,7 +16323,6 @@ - GPIO Disabled RCPassThru Flap @@ -17571,29 +16430,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -17603,7 +16460,6 @@ - GPIO Disabled RCPassThru Flap @@ -17711,29 +16567,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -17743,7 +16597,6 @@ - GPIO Disabled RCPassThru Flap @@ -17851,29 +16704,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -17883,7 +16734,6 @@ - GPIO Disabled RCPassThru Flap @@ -17991,29 +16841,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -18023,7 +16871,6 @@ - GPIO Disabled RCPassThru Flap @@ -18131,29 +16978,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -18163,7 +17008,6 @@ - GPIO Disabled RCPassThru Flap @@ -18271,29 +17115,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -18303,7 +17145,6 @@ - GPIO Disabled RCPassThru Flap @@ -18411,29 +17252,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -18443,7 +17282,6 @@ - GPIO Disabled RCPassThru Flap @@ -18551,29 +17389,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -18583,7 +17419,6 @@ - GPIO Disabled RCPassThru Flap @@ -18691,29 +17526,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -18723,7 +17556,6 @@ - GPIO Disabled RCPassThru Flap @@ -18831,29 +17663,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -18863,7 +17693,6 @@ - GPIO Disabled RCPassThru Flap @@ -18971,29 +17800,27 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -19003,7 +17830,6 @@ - GPIO Disabled RCPassThru Flap @@ -19111,22 +17937,18 @@ SERVOn_MIN SERVOn_TRIM SERVOn_MAX - Alarm - Alarm Inverted 0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 - True Disabled Enabled - True @@ -19142,14 +17964,14 @@ - 0 300 s seconds + 0 300 - 0 500 Hz hertz + 0 500 @@ -19168,45 +17990,28 @@ DShot600 DShot1200 - True - + Console - Mavlink Serial Channel1 - Mavlink Serial Channel2 - Mavlink Serial Channel3 - Mavlink Serial Channel4 - Mavlink Serial Channel5 + Serial1 + Serial2 + Serial3 + Serial4 + Serial5 1 127 - True 0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 - True 0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 - True 0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 - True - - - - - 0:SERVO1,1:SERVO2,2:SERVO3,3:SERVO4,4:SERVO5,5:SERVO6,6:SERVO7,7:SERVO8,8:SERVO9,9:SERVO10,10:SERVO11,11:SERVO12 - True - - - 0:SERVO1,1:SERVO2,2:SERVO3,3:SERVO4,4:SERVO5,5:SERVO6,6:SERVO7,7:SERVO8,8:SERVO9,9:SERVO10,10:SERVO11,11:SERVO12 - - - 2 50 @@ -19237,9 +18042,9 @@ - 0 10 m/s meters per second + 0 10 0.0001 0.01 @@ -19251,19 +18056,19 @@ 0.01 1 - 0 100 m meters + 0 100 - 0 600 s seconds + 0 600 - 0 600 s seconds + 0 600 0.005 0.5 @@ -19272,24 +18077,24 @@ 0.005 0.05 - 20 400 m.m/s/s square meter per square second + 20 400 - 0 5000.0 m meters + 0 5000.0 - 0 1000.0 m meters + 0 1000.0 - 0 5000.0 m meters + 0 5000.0 0 1000 @@ -19302,518 +18107,439 @@ deg degrees - - 5 50 - - - 5 50 - - - 0 100 - - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 - 0 50 - 1 Hz hertz - True + 0 50 + 1 @@ -19821,27 +18547,27 @@ True - True s seconds + True - True s seconds + True - True s seconds + True 0.4 1.0 - 0.1 s seconds + 0.1 0.1 10.0 @@ -19892,12 +18618,12 @@ - 0.1 20.0 0.1 + 0.1 20.0 - 0.1 10.0 0.1 + 0.1 10.0 3.0 10.0 @@ -19936,8 +18662,8 @@ 0.1 - 0.0 20.0 0.1 + 0.0 20.0 -1 127 @@ -19977,15 +18703,15 @@ 0.0 20.0 - 0.1 m/s meters per second + 0.1 -2.0 2.0 - 0.1 m/s/m meters per second per meter + 0.1 0.1 1.0 @@ -20027,23 +18753,13 @@ - 1 m meters + 1 0:Disable Download - - 0.05 50000 - m - meters - - - 0 50 - m - meters - @@ -20098,9 +18814,6 @@ AccelZP AccelZI AccelZD - RatePitchFF - RateRollFF - RateYawFF FixedWingRollP FixedWingRollI FixedWingRollD @@ -20170,7 +18883,7 @@ Enable - + 0 1 @@ -20180,27 +18893,26 @@ None MAVLink IntelT265 - VOXL(ModalAI) True - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -20215,24 +18927,24 @@ - 0 250 ms milliseconds + 0 250 - 0.05 5.0 m/s meters per second + 0.05 5.0 - 0.1 10.0 m meters + 0.1 10.0 - 0.05 1.0 rad radians + 0.05 1.0 @@ -20259,8 +18971,8 @@ - 5000 6000 True + 5000 6000 0:Pitmode,1:Pitmode until armed,2:Pitmode when disarmed,3:Unlocked,4:Add leading zero byte to requests @@ -20269,7 +18981,7 @@ 25 1000 - + 0 4 0.25 @@ -20290,54 +19002,6 @@ 0 4500 1 - - - Disable - Enable - - - - 0.08 0.35 - 0.005 - - - 0.01 0.6 - 0.01 - - - 0 1 - 0.01 - - - 0.001 0.03 - 0.001 - - - 0 3.0 - 0.001 - - - 2 50 - 1 - Hz - hertz - - - 2 50 - 1 - Hz - hertz - - - 0 50 - 1 - Hz - hertz - - - 0 200 - 0.5 - diff --git a/src/FirmwarePlugin/APM/APMParameterFactMetaData.Rover.3.4.xml b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Rover.3.4.xml new file mode 100644 index 0000000..304e358 --- /dev/null +++ b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Rover.3.4.xml @@ -0,0 +1,7224 @@ + + + + + + + + +0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:THR,5:NTUN,7:IMU,8:CMD,9:CURRENT,10:RANGEFINDER,11:COMPASS,12:CAMERA,13:STEERING,14:RC,15:ARM/DISARM,19:IMU_RAW + +Disabled +APM2-Default +PX4/Pixhawk-Default + + + + + + +MANUAL +ACRO +STEERING +HOLD +LOITER +AUTO +RTL +GUIDED + + + +1 255 + + +1 255 + + +0 30 +1 +s +seconds + + +0:Steering,1:Throttle + +None +Steering +Throttle + + + + +Disabled +Enabled + + + + +Disabled +APM TriggerPin0 +APM TriggerPin1 +APM TriggerPin2 +APM TriggerPin3 +APM TriggerPin4 +APM TriggerPin5 +APM TriggerPin6 +APM TriggerPin7 +APM TriggerPin8 +Pixhawk TriggerPin50 +Pixhawk TriggerPin51 +Pixhawk TriggerPin52 +Pixhawk TriggerPin53 +Pixhawk TriggerPin54 +Pixhawk TriggerPin55 + + + +0 20 +0.1 +m/s/s +meters per square second + + +0 100 +0.1 +m/s +meters per second + + +0 360 +1 +deg +degrees + + + +Nothing +SaveWaypoint +LearnCruiseSpeed +ArmDisarm +Manual +Acro +Steering +Hold +Auto +RTL +SmartRTL +Guided +Loiter + + + +0 100 +1 +% +percent + + + +Default +Two Paddles Input +Direction reversed when backing up +Direction unchanged when backing up + + + + +Nothing +RTL +Hold +SmartRTL or RTL +SmartRTL or Hold + + + +s +seconds + + + +Disabled +Enabled + + + +910 1100 +1 + + + +Disabled +Enabled + + + + +Disabled +Hold +HoldAndDisarm + + + +0 1000 +1 +cm +centimeters + + +-450 450 +1 +deg +degrees + + +0 100 +0.1 +s +seconds + + +1 100 +1 + + + + + + + +Manual +Acro +Steering +Hold +Loiter +Auto +RTL +SmartRTL +Guided + + + + +Manual +Acro +Steering +Hold +Loiter +Auto +RTL +SmartRTL +Guided + + + + +Manual +Acro +Steering +Hold +Loiter +Auto +RTL +SmartRTL +Guided + + + + +Manual +Acro +Steering +Hold +Loiter +Auto +RTL +SmartRTL +Guided + + + + +Manual +Acro +Steering +Hold +Loiter +Auto +RTL +SmartRTL +Guided + + + + +Manual +Acro +Steering +Hold +Loiter +Auto +RTL +SmartRTL +Guided + + + +0 1000 +0.1 +m +meters + + +0 10 +0.1 +m +meters + + +0.1 10 +0.01 +gravities +standard acceleration due to gravity + + + +NotEnforced +Enforced + + + +0 10 +0.1 +m +meters + + +0 360 +1 +deg/s +degrees per second + + +0 100 +0.1 +m/s +meters per second + + +0 100 +0.1 +m/s +meters per second + + + +Undefined +Rover +Boat + + + +0 360 +1 +deg/s +degrees per second + + + + + + + + + + + + + + + + + + + + +m +meters + + +m +meters + + +mbar +millibar + + + + + + + + + + + + + + +s +seconds + + + + +0.0 1.0 +.01 + + + +Disabled +Enabled + + + +0.1 0.4 +.01 + + +0.1 0.4 +.01 + + +0 127 +1 +m/s +meters per second + + +-0.1745 +0.1745 +0.01 +rad +radians + + +-0.1745 +0.1745 +0.01 +rad +radians + + +-0.1745 +0.1745 +0.01 +rad +radians + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 +Custom + + + +0.001 0.5 +.01 + + +0 10 +1 + + + +Disabled +Enable EKF2 +Enable EKF3 + + + +-180 180 +1 +deg +degrees + + +-180 180 +1 +deg +degrees + + +-180 180 +1 +deg +degrees + + + + + +Disabled +THR_MIN PWM when disarmed +0 PWM when disarmed + + + +0:All,1:Barometer,2:Compass,3:GPS lock,4:INS,5:Parameters,6:RC Channels,7:Board voltage,8:Battery Level,10:Logging Available,11:Hardware safety switch,12:GPS Configuration + +None +All +Barometer +Compass +GPS Lock +INS(INertial Sensors - accels & gyros) +Parameters(unused) +RC Channels +Board voltage +Battery Level +LoggingAvailable +Hardware safety switch +GPS configuration + + + +0.25 3.0 +m/s/s +meters per square second + + +0.1 +V +volt + + +0.1 +V +volt + + + + +0.000 2.000 +0.01 + + +0.000 2.000 +0.01 + + +0.000 1.000 +0.01 + + +0.000 0.400 +0.001 + + +0.000 3.000 +0.001 + + +0.000 100.000 +0.1 +Hz +hertz + + +0.010 2.000 +0.01 + + +0.000 2.000 + + +0.000 1.000 +0.01 + + +0.000 0.400 +0.001 + + +0.000 0.500 +0.001 + + +0.000 100.000 +0.1 +Hz +hertz + + +0.0 10.0 +0.1 +m/s/s +meters per square second + + + +Disable +Enable + + + +0.00 0.50 +0.01 +m/s +meters per second + + +1.000 10.000 +0.1 + + +0 1000 +0.1 +deg/s/s +degrees per square second + + +0 1000 +0.1 +deg/s +degrees per second + + +0.0 10.0 +0.1 +m/s/s +meters per square second + + + + +0:StopAtFence,1:UseProximitySensor,2:StopAtBeaconFence + +None +StopAtFence +UseProximitySensor +StopAtFence and UseProximitySensor +StopAtBeaconFence +All + + + +0 4500 +cdeg +centidegrees + + +1 30 +m +meters + + +1 10 +m +meters + + + +Slide +Stop + + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo + +True + + + +Disabled +A0 +A1 +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +A1 +A2 +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo + +True + + + +Disabled +A0 +A1 +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +A1 +A2 +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + + + +None +Pozyx +Marvelmind + + + +-90 90 +0.000001 +deg +degrees + + +-180 180 +0.000001 +deg +degrees + + +0 10000 +1 +m +meters + + +-180 +180 +1 +deg +degrees + + + + + +No PWMs +Two PWMs +Four PWMs +Six PWMs +Three PWMs and One Capture + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled + +True + + + +Disabled +50Hz +75Hz +100Hz +150Hz +200Hz +250Hz +300Hz + +True + + +-32768 32767 + + +0:Ch1,1:Ch2,2:Ch3,3:Ch4,4:Ch5,5:Ch6,6:Ch7,7:Ch8,8:Ch9,9:Ch10,10:Ch11,11:Ch12,12:Ch13,13:Ch14 + +Disabled +Enabled + +True + + +-1 80 +degC +degrees Celsius + + + +AUTO +PX4V1 +Pixhawk +Cube/Pixhawk2 +Pixracer +PixhawkMini +Pixhawk2Slim +VRBrain 5.1 +VRBrain 5.2 +VR Micro Brain 5.1 +VR Micro Brain 5.2 +VRBrain Core 1.0 +VRBrain 5.4 +Intel Aero FC +AUAV2.1 + +True + + + +Disabled +Enabled + +True + + +0:ActiveForSafetyEnable,1:ActiveForSafetyDisable,2:ActiveWhenArmed + + + + + +None +CYRF6936 + + + + +Auto +DSM2 +DSMX + + + +0 4 + + + +NotDisabled +Disabled + + + +0 16 + + +0 16 + + + +Disabled +Enabled + + + +1 8 + + + +Disabled +MinChannel +MidChannel +MaxChannel +MinChannelCW +MidChannelCW +MaxChannelCW + + + + +Mode1 +Mode2 + + + + +Disabled +TestChan1 +TestChan2 +TestChan3 +TestChan4 +TestChan5 +TestChan6 +TestChan7 +TestChan8 + + + +0 16 + + +0 16 + + +1 8 + + +0 40 + + +0 120 + + +0 31 + + + + +0:GPS,1:MAVLINK_SYSTEM_TIME,2:HW + + + + + +Disabled +Enabled + + + + +Disabled +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +0 3600 + + + + + +Servo +Relay + + + +0 50 +ds +deciseconds + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +0 1000 +m +meters + + + +Low +High + + + +0 10000 +ms +milliseconds + + +0 180 +deg +degrees + + + +Disabled +PX4 AUX1 +PX4 AUX2 +PX4 AUX3 +PX4 AUX4(fast capture) +PX4 AUX5 +PX4 AUX6 + + + + +TriggerLow +TriggerHigh + + + + +Always +Only when in AUTO + + + + + + +Disabled +UAVCAN + +True + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +UAVCAN + +True + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +UAVCAN + +True + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-3.142 3.142 +0.01 +rad +radians + + + +Disabled +Internal-Learning +EKF-Learning + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Use Throttle +Use Current + + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + + +FirstCompass +SecondCompass +ThirdCompass + + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + + + + + + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +4 32 + +Very Strict +Strict +Default +Relaxed + +0.1 + + +500 3000 +1 + + +0:HMC5883,1:LSM303D,2:AK8963,3:BMM150,4:LSM9DS1,5:LIS3MDL,6:AK09916,7:IST8310,8:ICM20948,9:MMC3416,11:UAVCAN,12:QMC5883 + + +0 100 +1 +% +percent + + + + + +Disabled +Enabled + + + +0 2 +0.01 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + +0 250 +10 +ms +milliseconds +True + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.000001 0.001 +Hz +hertz + + +0.00001 0.001 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +2.0 6.0 +0.5 +m/s +meters per second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + +True + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.00001 0.001 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +2.0 6.0 +0.5 +m/s +meters per second + + +0.5 2.5 +0.1 +m/s/s +meters per square second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + +0.05 0.5 +0.05 +m/s +meters per second + + +0.5 5.0 +0.1 +m/s +meters per second + + +0.01 1.0 +0.1 +m/s +meters per second + + + + + +Disabled +Enabled + + + +0:Altitude,1:Circle,2:Polygon + +None +Altitude +Circle +Altitude and Circle +Polygon +Altitude and Polygon +Circle and Polygon +All + + + + +Report Only +RTL or Land + + + +10 1000 +1 +m +meters + + +30 10000 +m +meters + + +1 10 +m +meters + + +1 20 + + +-100 100 +1 +m +meters + + + + +True +True +1 +Pa +pascal + + +True +1 +degC +degrees Celsius + + +0.1 +m +meters + + + +FirstBaro +2ndBaro +3rdBaro + + + + +Disabled +Bus0 +Bus1 + + + +1.0:Freshwater,1.024:Saltwater + + +True +True +1 +Pa +pascal + + +True +True +1 +Pa +pascal + + +0 100 +1 +% +percent + + + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA + +True + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA + +True + + + +Portable +Stationary +Pedestrian +Automotive +Sea +Airborne1G +Airborne2G +Airborne4G + + + + +Disabled +UseBest +Blend + + + + +Any +FloatRTK +IntegerRTK + +True + + + +Disabled +Enabled +NoChange + + + +-100 90 +deg +degrees + + + +send to first GPS +send to 2nd GPS +send to all + + + + +None (0x0000) +All (0xFFFF) +External only (0xFF00) + + + + +Ignore +Always log +Stop logging when disarmed (SBF only) +Only log every five samples (uBlox only) + +True + + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + + + + +Do not save config +Save config +Save only when needed + + + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + + + + +Disables automatic configuration +Enable automatic configuration + + + +50 200 + +10Hz +8Hz +5Hz + +ms +milliseconds + + +50 200 + +10Hz +8Hz +5Hz + +ms +milliseconds + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +0 250 +ms +milliseconds +True + + +0 250 +ms +milliseconds +True + + +0:Horiz Pos,1:Vert Pos,2:Speed + + +5.0 30.0 +s +seconds + + + + + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +0 127 +Hz +hertz + + +0 127 +Hz +hertz + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +0.05 50 + + + +Never +Start-up only + + + + +Don't adjust the trims +Assume first orientation was level +Assume ACC_BODYFIX is perfectly aligned to the vehicle + + + + +IMU 1 +IMU 2 +IMU 3 + + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +m +meters + + +True + + +True + + +True + + +True + + +True + + +True + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU + +FirstIMUOnly +FirstAndSecondIMU + + + + + +32 + + +0:IMU1,1:IMU2,2:IMU3 + +None +First IMU +All + + + +0:Sensor-Rate Logging (sample at full sensor rate seen by AP) + + +ms +milliseconds +10 + + +1 + + + + + +Disabled +Enabled + + + +10 200 +Hz +hertz + + +5 50 +Hz +hertz + + +5 30 +dB +decibel + + + + + +None +File +MAVLink +BothFileAndMAVLink + + + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +kB +kilobytes + + + + +0 32766 +1 + + + +Resume Mission +Restart Mission + + + +0:Clear Mission on reboot + + + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + +0 100 +1 + + +0.0 0.2 +.005 +s +seconds + + +0.0 0.2 +.005 +s +seconds + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + +True + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + +0.0 0.2 +.005 +s +seconds + + +0.0 0.2 +.005 +s +seconds + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + + + + + + +Normal +OneShot +OneShot125 +BrushedWithRelay +BrushedBiPolar + +True + + +1 20 +1 +kHz +kilohertz +True + + + +PWM enabled while disarmed +PWM disabled while disarmed + + + +0 20 +1 +% +percent + + +30 100 +1 +% +percent + + +0 1000 +1 +%/s +percent per second + + +-1.0 1.0 + + +0 100 +% +percent + + +0 10 +m/s +meters per second + + + + +1 60 +1 +s +seconds + + +0.6 1.0 +0.05 + + +0 0.1 +0.01 + + +0 89 +deg +degrees + + + + + +Off +Low +Medium +High + + + + +Disable +Enable + + + + +Disable +Enable + + + + +Disable +ssd1306 +sh1106 + + + + +Disabled +Aircraft +Rover + + + + +Disabled + + + + + + +None +LightWareSF40C +MAVLink +TeraRangerTower +RangeFinder +RPLidarA2 + +True + + + +Default +Upside Down + + + +-180 180 +deg +degrees + + +0 360 +deg +degrees + + +0 45 +deg +degrees + + +0 360 +deg +degrees + + +0 45 +deg +degrees + + +0 360 +deg +degrees + + +0 45 +deg +degrees + + +0 360 +deg +degrees + + +0 45 +deg +degrees + + +0 360 +deg +degrees + + +0 45 +deg +degrees + + +0 360 +deg +degrees + + +0 45 +deg +degrees + + + +None +LightWareSF40C +MAVLink +TeraRangerTower +RangeFinder +RPLidarA2 + +True + + + +Default +Upside Down + + + +-180 180 +deg +degrees + + + + +0.0 120.0 +s +seconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + + + + +Disabled +APM2 A9 pin +APM1 relay +BB Blue GP0 pin 4 +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +BB Blue GP0 pin 3 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1/BB Blue GP0 pin 6 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2/BB Blue GP0 pin 5 + + + + +Disabled +APM2 A9 pin +APM1 relay +BB Blue GP0 pin 4 +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +BB Blue GP0 pin 3 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1/BB Blue GP0 pin 6 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2/BB Blue GP0 pin 5 + + + + +Disabled +APM2 A9 pin +APM1 relay +BB Blue GP0 pin 4 +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +BB Blue GP0 pin 3 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1/BB Blue GP0 pin 6 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2/BB Blue GP0 pin 5 + + + + +Disabled +APM2 A9 pin +APM1 relay +BB Blue GP0 pin 4 +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +BB Blue GP0 pin 3 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1/BB Blue GP0 pin 6 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2/BB Blue GP0 pin 5 + + + + +Off +On +NoChange + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +Disabled +AnalogPin +RCChannelPwmValue +ReceiverProtocol + + + + +APM2 A0 +APM2 A1 +APM2 A13 +Pixracer +Pixhawk ADC4 +Pixhawk ADC3 +Pixhawk ADC6 +Pixhawk SBUS +Pixhawk2 ADC + + + +0 5.0 +0.01 +V +volt + + +0 5.0 +0.01 +V +volt + + + + +0 2000 +PWM +PWM in microseconds + + +0 2000 +PWM +PWM in microseconds + + + + + +Disabled +ShowSlips +ShowOverruns + + + + +50Hz +100Hz +200Hz +250Hz +300Hz +400Hz + +True + + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +460800 +500000 +921600 +1500000 + + + + +MAVlink1 +MAVLink2 + +True + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + + + +Disable +Enable + + + +25 400 +Hz +hertz + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +Winch + + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + +Disabled +Enabled + + + + +Disabled +TestMotor1 +TestMotor2 +TestMotor3 +TestMotor4 +TestMotor5 +TestMotor6 +TestMotor7 +TestMotor8 + + + +0 300 +s +seconds + + +0 500 +Hz +hertz + + + +Disabled +Enabled + + + + +None +OneShot +OneShot125 +Brushed +DShot150 +DShot300 +DShot600 +DShot1200 + + + + + +25 250 +Hz +hertz + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + + + +0 10 +m +meters + + +0 500 +True + + + + +True + + +True +s +seconds + + +True +s +seconds + + +True +s +seconds + + + + + +None +MAV + + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Right +Back +Left +Up +Down + + + + + + +None +Quadrature + + + +1 + + +0.001 + + +0.01 +m +meters + + +0.01 +m +meters + + +0.01 +m +meters + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +None +Quadrature + + + +1 + + +0.001 + + +0.01 +m +meters + + +0.01 +m +meters + + +0.01 +m +meters + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + diff --git a/src/FirmwarePlugin/APM/APMParameterFactMetaData.Rover.3.5.xml b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Rover.3.5.xml new file mode 100644 index 0000000..6b4ff7c --- /dev/null +++ b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Rover.3.5.xml @@ -0,0 +1,11650 @@ + + + + + + + + + +Disabled +Default + +0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:THR,5:NTUN,7:IMU,8:CMD,9:CURRENT,10:RANGEFINDER,11:COMPASS,12:CAMERA,13:STEERING,14:RC,15:ARM/DISARM,19:IMU_RAW + + + + + +Manual +Acro +Steering +Hold +Loiter +Follow +Simple +Auto +RTL +SmartRTL +Guided + + + +1 255 + + +1 255 + + +s +seconds +0 30 +1 + + + +None +Steering +Throttle +Pitch +Left Wheel +Right Wheel +Sailboat Heel + +0:Steering,1:Throttle,2:Pitch,3:Left Wheel,4:Right Wheel,5:Sailboat Heel + + + +Disabled +Enabled + + + + +Disabled +APM TriggerPin0 +APM TriggerPin1 +APM TriggerPin2 +APM TriggerPin3 +APM TriggerPin4 +APM TriggerPin5 +APM TriggerPin6 +APM TriggerPin7 +APM TriggerPin8 +Pixhawk TriggerPin50 +Pixhawk TriggerPin51 +Pixhawk TriggerPin52 +Pixhawk TriggerPin53 +Pixhawk TriggerPin54 +Pixhawk TriggerPin55 + + + +m/s/s +meters per square second +0 20 +0.1 + + +m/s +meters per second +0 100 +0.1 + + +deg +degrees +0 360 +1 + + +% +percent +0 100 +1 + + + +Default +Two Paddles Input +Direction reversed when backing up +Direction unchanged when backing up + + + + +Nothing +RTL +Hold +SmartRTL or RTL +SmartRTL or Hold + + + +s +seconds +1 100 +0.5 + + + +Disabled +Enabled +Enabled Continue with Mission in Auto + + + +910 1100 +1 + + + +Disabled +Enabled +Enabled Continue with Mission in Auto + + + + +Disabled +Hold +HoldAndDisarm + + + + +Disabled +Hold + + + +0.6:Strict, 0.8:Default, 1.0:Relaxed + + +cm +centimeters +0 1000 +1 + + +deg +degrees +-450 450 +1 + + +s +seconds +0 100 +0.1 + + +1 100 +1 + + + + + +Manual +Acro +Steering +Hold +Loiter +Follow +Simple +Auto +RTL +SmartRTL +Guided + + + + +Manual +Acro +Steering +Hold +Loiter +Follow +Simple +Auto +RTL +SmartRTL +Guided + + + + +Manual +Acro +Steering +Hold +Loiter +Follow +Simple +Auto +RTL +SmartRTL +Guided + + + + +Manual +Acro +Steering +Hold +Loiter +Follow +Simple +Auto +RTL +SmartRTL +Guided + + + + +Manual +Acro +Steering +Hold +Loiter +Follow +Simple +Auto +RTL +SmartRTL +Guided + + + + +Manual +Acro +Steering +Hold +Loiter +Follow +Simple +Auto +RTL +SmartRTL +Guided + + + +m +meters +0 1000 +0.1 + + +m +meters +0 10 +0.1 + + +gravities +standard acceleration due to gravity +0.1 10 +0.01 + + + +NotEnforced +Enforced + + + +m +meters +0 10 +0.1 + + +deg/s +degrees per second +0 360 +1 + + +m/s +meters per second +0 100 +0.1 + + +m/s +meters per second +0 100 +0.1 + + + +Undefined +Rover +Boat +BalanceBot + + + +deg/s +degrees per second +0 360 +1 + + +deg +degrees +0 5 +0.1 + + +deg +degrees +0 60 +1 + + + +Undefined +Omni3 +OmniX +OmniPlus + +True + + + +Forward or reverse to target point +Always face bow towards target point + + + + +InitialHeading +CardinalDirections + +True + + +m +meters +0 20 +1 + + +deg +degrees +0 90 +1 + + +deg +degrees +0 90 +1 + + +deg +degrees +0 90 +1 + + +deg +degrees +0 90 +1 + + +deg +degrees +0 90 +1 + + + +Hold +Loiter + + + + +Nothing +SaveWaypoint +LearnCruiseSpeed +ArmDisarm +Manual +Acro +Steering +Hold +Auto +RTL +SmartRTL +Guided +Loiter + + + + + + + + + + + + + + + + + + + + + + + +m +meters + + +m +meters + + +mbar +millibar + + + + + + + + + + + + + + +s +seconds + + + + +0.0 1.0 +.01 + + + +Disabled +Enabled + + + +0.1 0.4 +.01 + + +0.1 0.4 +.01 + + +0 127 +m/s +meters per second +1 + + +rad +radians +-0.1745 +0.1745 +0.01 + + +rad +radians +-0.1745 +0.1745 +0.01 + + +rad +radians +-0.1745 +0.1745 +0.01 + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 +Custom + + + +0.001 0.5 +.01 + + +0 10 +1 + + + +Disabled +Enable EKF2 +Enable EKF3 + + + +-180 180 +deg +degrees +1 + + +-180 180 +deg +degrees +1 + + +-180 180 +deg +degrees +1 + + + + + +Disabled +THR_MIN PWM when disarmed +0 PWM when disarmed + + + + +None +All +Barometer +Compass +GPS Lock +INS(INertial Sensors - accels & gyros) +Parameters(unused) +RC Channels +Board voltage +Battery Level +Airspeed +LoggingAvailable +Hardware safety switch +GPS configuration +System + +0:All,1:Barometer,2:Compass,3:GPS lock,4:INS,5:Parameters,6:RC Channels,7:Board voltage,8:Battery Level,9:Airspeed,10:Logging Available,11:Hardware safety switch,12:GPS Configuration,13:System + + +m/s/s +meters per square second +0.25 3.0 + + + +Disabled +ArmingOnly +ArmOrDisarm + + + +0:Land,1:VTOL Land,2:DO_LAND_START,3:Takeoff,4:VTOL Takeoff,5:Rallypoint + + + + + +None +I2C-MS4525D0 +Analog +I2C-MS5525 +I2C-MS5525 (0x76) +I2C-MS5525 (0x77) +I2C-SDP3X +I2C-DLVR +UAVCAN + + + + +DoNotUse +Use +UseWhenZeroThrottle + + + +0.1 + + +0.1 + + + + + + + + + +Disable +Enable + + + + + + +Bus0(internal) +Bus1(external) +Bus2(auxillary) + + + + +FirstSensor +2ndSensor + + + + +None +I2C-MS4525D0 +Analog +I2C-MS5525 +I2C-MS5525 (0x76) +I2C-MS5525 (0x77) +I2C-SDP3X +I2C-DLVR +UAVCAN + + + + +Don't Use +use +UseWhenZeroThrottle + + + +0.1 + + +0.1 + + + + + + + + + +Disable +Enable + + + + + + +Bus0(internal) +Bus1(external) +Bus2(auxillary) + + + + + +0.000 2.000 +0.01 + + +0.000 2.000 +0.01 + + +0.000 1.000 +0.01 + + +0.000 0.400 +0.001 + + +0.000 3.000 +0.001 + + +0.000 100.000 +0.1 +Hz +hertz + + +0.010 2.000 +0.01 + + +0.000 2.000 + + +0.000 1.000 +0.01 + + +0.000 0.400 +0.001 + + +0.000 0.500 +0.001 + + +0.000 100.000 +0.1 +Hz +hertz + + +0.0 10.0 +0.1 +m/s/s +meters per square second + + + +Disable +Enable + + + +0.00 0.50 +0.01 +m/s +meters per second + + +1.000 10.000 +0.1 + + +0 1000 +0.1 +deg/s/s +degrees per square second + + +0 1000 +0.1 +deg/s +degrees per second + + +0.0 10.0 +0.1 +m/s/s +meters per square second + + +0.000 2.000 +0.01 + + +0.000 2.000 + + +0.000 1.000 +0.01 + + +0.000 0.100 +0.001 + + +0.000 0.500 +0.001 + + +0.000 100.000 +0.1 +Hz +hertz + + +0.0 10.0 +0.01 + + +0.000 2.000 +0.01 + + +0.000 2.000 + + +0.000 1.000 +0.01 + + +0.000 0.100 +0.001 + + +0.000 0.500 +0.001 + + +0.000 100.000 +0.1 +Hz +hertz + + + + + +None +StopAtFence +UseProximitySensor +StopAtFence and UseProximitySensor +StopAtBeaconFence +All + +0:StopAtFence,1:UseProximitySensor,2:StopAtBeaconFence + + +cdeg +centidegrees +0 4500 + + +m +meters +1 30 + + +m +meters +1 10 + + + +Slide +Stop + + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +None +Pozyx +Marvelmind + + + +deg +degrees +0.000001 +-90 90 + + +deg +degrees +0.000001 +-180 180 + + +m +meters +1 +0 10000 + + +deg +degrees +1 +-180 +180 + + + + + +No PWMs +One PWMs +Two PWMs +Three PWMs +Four PWMs +Five PWMs +Six PWMs +Seven PWMs +Eight PWMs + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled + +True + + + +Disabled +50Hz +75Hz +100Hz +150Hz +200Hz +250Hz +300Hz + +True + + +-32768 32767 + + + +Disabled +Enabled + +0:Ch1,1:Ch2,2:Ch3,3:Ch4,4:Ch5,5:Ch6,6:Ch7,7:Ch8,8:Ch9,9:Ch10,10:Ch11,11:Ch12,12:Ch13,13:Ch14 +True + + +-1 80 +degC +degrees Celsius + + + +AUTO +PX4V1 +Pixhawk +Cube/Pixhawk2 +Pixracer +PixhawkMini +Pixhawk2Slim +VRBrain 5.1 +VRBrain 5.2 +VR Micro Brain 5.1 +VR Micro Brain 5.2 +VRBrain Core 1.0 +VRBrain 5.4 +Intel Aero FC +AUAV2.1 + +True + + + +Disabled +Enabled + +True + + +0:ActiveForSafetyEnable,1:ActiveForSafetyDisable,2:ActiveWhenArmed,3:Force safety on when the aircraft disarms + + +V +volt +4.0 5.5 +0.1 + + +V +volt +3.3 12.0 +0.1 + + +0 32 +1 + + + + + +None +CYRF6936 + + + + +Auto +DSM2 +DSMX + + + +0 4 + + + +NotDisabled +Disabled + + + +0 16 + + +0 16 + + + +Disabled +Enabled + + + +1 8 + + + +Disabled +MinChannel +MidChannel +MaxChannel +MinChannelCW +MidChannelCW +MaxChannelCW + + + + +Mode1 +Mode2 + + + + +Disabled +TestChan1 +TestChan2 +TestChan3 +TestChan4 +TestChan5 +TestChan6 +TestChan7 +TestChan8 + + + +0 16 + + +0 16 + + +1 8 + + +0 40 + + +0 120 + + +0 31 + + + + +0:GPS,1:MAVLINK_SYSTEM_TIME,2:HW + + + + + +Disabled +Enabled + + + + +Disabled +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +0 3600 + + + + + +Servo +Relay + + + +ds +deciseconds +0 50 + + +PWM +PWM in microseconds +1000 2000 + + +PWM +PWM in microseconds +1000 2000 + + +m +meters +0 1000 + + + +Low +High + + + +ms +milliseconds +0 10000 + + +deg +degrees +0 180 + + + +Disabled +AUX1 +AUX2 +AUX3 +AUX4 +AUX5 +AUX6 + +True + + + +TriggerLow +TriggerHigh + + + + +Always +Only when in AUTO + + + + +Default +BMMCC + + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + +-400 400 +mGauss +milligauss +1 + + +-400 400 +mGauss +milligauss +1 + + +-400 400 +mGauss +milligauss +1 + + +-3.142 3.142 +rad +radians +0.01 + + + +Disabled +Internal-Learning +EKF-Learning + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Use Throttle +Use Current + + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + +-400 400 +mGauss +milligauss +1 + + +-400 400 +mGauss +milligauss +1 + + +-400 400 +mGauss +milligauss +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + + +FirstCompass +SecondCompass +ThirdCompass + + + +-400 400 +mGauss +milligauss +1 + + +-400 400 +mGauss +milligauss +1 + + +-400 400 +mGauss +milligauss +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +True + + +True + + +True + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +4 32 + +Very Strict +Strict +Default +Relaxed + +0.1 + + +500 3000 +1 + + +0:HMC5883,1:LSM303D,2:AK8963,3:BMM150,4:LSM9DS1,5:LIS3MDL,6:AK09916,7:IST8310,8:ICM20948,9:MMC3416,11:UAVCAN,12:QMC5883,14:MAG3110,15:IST8308 + + +% +percent +0 100 +1 + + + +Disabled +CheckOnly +CheckAndFix + + + + + + + + + + + + +Disabled +Enabled + + + +0 2 +0.01 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.000001 0.001 +Hz +hertz + + +0.00001 0.005 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +2.0 6.0 +0.5 +m/s +meters per second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +True +ms +milliseconds + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + +True + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 250 +10 +True +ms +milliseconds + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.00001 0.005 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +True +ms +milliseconds + + +2.0 6.0 +0.5 +m/s +meters per second + + +0.5 2.5 +0.1 +m/s/s +meters per square second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + +0.05 0.5 +0.05 +m/s +meters per second + + +0.5 5.0 +0.1 +m/s +meters per second + + +0.01 1.0 +0.1 +m/s +meters per second + + + + + +Disabled +Enabled + + + + +None +Altitude +Circle +Altitude and Circle +Polygon +Altitude and Polygon +Circle and Polygon +All + +0:Altitude,1:Circle,2:Polygon + + + +Report Only +RTL or Land +Always land + + + +m +meters +10 1000 +1 + + +m +meters +30 10000 + + +m +meters +1 10 + + +1 20 + + +m +meters +-100 100 +1 + + + + + +Disabled +Enabled + + + +0 255 + + +m +meters +1 1000 + + + +North-East-Down +Relative to lead vehicle heading + + + +-100 100 +m +meters +1 + + +-100 100 +m +meters +1 + + +-100 100 +m +meters +1 + + + +None +Face Lead Vehicle +Same as Lead vehicle +Direction of Flight + + + +0.01 1.00 +0.01 + + + +absolute + relative + + + + + +Pa +pascal +1 +True +True + + +degC +degrees Celsius +1 +True + + +m +meters +0.1 + + + +FirstBaro +2ndBaro +3rdBaro + + + + +Disabled +Bus0 +Bus1 + + + +1.0:Freshwater,1.024:Saltwater + + +Pa +pascal +1 +True +True + + +Pa +pascal +1 +True +True + + +% +percent +0 100 +1 + + +0:BMP085,1:BMP280,2:MS5611,3:MS5607,4:MS5637,5:FBM320,6:DPS280,7:LPS25H,8:Keller + +BMP085 +BMP280 +MS5611 +MS5607 +MS5637 +FBM320 +DPS280 +LPS25H +Keller + + + + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA + +True + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA + +True + + + +Portable +Stationary +Pedestrian +Automotive +Sea +Airborne1G +Airborne2G +Airborne4G + + + + +Disabled +UseBest +Blend +UseSecond + + + + +Any +FloatRTK +IntegerRTK + +True + + + +Disabled +Enabled +NoChange + + + +-100 90 +deg +degrees + + + +send to first GPS +send to 2nd GPS +send to all + + + + +None (0x0000) +All (0xFFFF) +External only (0xFF00) + + + + +Ignore +Always log +Stop logging when disarmed (SBF only) +Only log every five samples (uBlox only) + +True + + + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + + + +Do not save config +Save config +Save only when needed + + + + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + + + +Disables automatic configuration +Enable automatic configuration + + + +ms +milliseconds + +10Hz +8Hz +5Hz + +50 200 + + +ms +milliseconds + +10Hz +8Hz +5Hz + +50 200 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +ms +milliseconds +0 250 +True + + +ms +milliseconds +0 250 +True + + +0:Horiz Pos,1:Vert Pos,2:Speed + + +s +seconds +5.0 30.0 + + + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +Hz +hertz +0 127 + + +Hz +hertz +0 127 + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +0.05 50 + + + +Never +Start-up only + + + + +Don't adjust the trims +Assume first orientation was level +Assume ACC_BODYFIX is perfectly aligned to the vehicle + + + + +IMU 1 +IMU 2 +IMU 3 + + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +True + + +True + + +True + + +True + + +True + + +True + + + +FirstIMUOnly +FirstAndSecondIMU + +0:FirstIMU,1:SecondIMU,2:ThirdIMU + + + + +32 + + + +None +First IMU +All + +0:IMU1,1:IMU2,2:IMU3 + + +0:Sensor-Rate Logging (sample at full sensor rate seen by AP) + + +ms +milliseconds +10 + + +1 + + + + + +Disabled +Enabled + + + +10 200 +Hz +hertz + + +5 50 +Hz +hertz + + +5 30 +dB +decibel + + + + +0:File,1:MAVLink,2:Block + + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +kB +kilobytes + + + + +0 32766 +1 + + + +Resume Mission +Restart Mission + + + +0:Clear Mission on reboot + + + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + +0 100 +1 + + +s +seconds +0.0 0.2 +.005 + + +s +seconds +0.0 0.2 +.005 + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + +True + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + +s +seconds +0.0 0.2 +.005 + + +s +seconds +0.0 0.2 +.005 + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + + + + + + +Normal +OneShot +OneShot125 +BrushedWithRelay +BrushedBiPolar +DShot150 +DShot300 +DShot600 +DShot1200 + +True + + +kHz +kilohertz +1 20 +1 +True + + + +PWM enabled while disarmed +PWM disabled while disarmed + + + +% +percent +0 20 +1 + + +% +percent +30 100 +1 + + +%/s +percent per second +0 1000 +1 + + +-1.0 1.0 + + +% +percent +0 100 + + +m/s +meters per second +0 10 + + + + +s +seconds +1 60 +1 + + +0.6 1.0 +0.05 + + +0 0.1 +0.01 + + +deg +degrees +0 89 + + + + + +Off +Low +Medium +High + + + + +Disable +Enable + + + + +Disable +Enable + + + + +Disable +ssd1306 +sh1106 + + + + +Disabled +Aircraft +Rover + + + + +Disabled + + + +0:Build in LED, 1:Internal ToshibaLED, 2:External ToshibaLED, 3:External PCA9685, 4:Oreo LED, 5:UAVCAN, 6:NCP5623 External, 7:NCP5623 Internal + + + + + +None +MAX7456 + +True + + + +Disable +Chan5 +Chan6 +Chan7 +Chan8 +Chan9 +Chan10 +Chan11 +Chan12 +Chan13 +Chan14 +Chan15 +Chan16 + + + +0:UseDecimalPack, 1:InvertedWindPointer, 2:InvertedAHRoll + + +True + + +0 31 +True + + +0 63 +True + + +0 99 + + +1 30 + + +0 100 + + + +Metric +Imperial +SI +Aviation + + + +1 20 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +None +LightWareSF40C +MAVLink +TeraRangerTower +RangeFinder +RPLidarA2 +TeraRangerTowerEvo +SITL +MorseSITL + +True + + + +Default +Upside Down + + + +deg +degrees +-180 180 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + + +None +LightWareSF40C +MAVLink +TeraRangerTower +RangeFinder +RPLidarA2 +TeraRangerTowerEvo + +True + + + +Default +Upside Down + + + +deg +degrees +-180 180 + + + + + + +km +kilometers +0.1 + + + +DoNotIncludeHome +IncludeHome + + + + + +0.0 120.0 +s +seconds + + +0:Ignore RC Reciever, 1:Ignore MAVLink Overrides + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Relay On/Off +Lost Rover Sound +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable + Relay5 + Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Relay On/Off +Lost Rover Sound +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable + Relay5 + Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Relay On/Off +Lost Rover Sound +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable + Relay5 + Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Relay On/Off +Lost Rover Sound +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable + Relay5 + Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Relay On/Off +Lost Rover Sound +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable + Relay5 + Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Relay On/Off +Lost Rover Sound +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable + Relay5 + Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Relay On/Off +Lost Rover Sound +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable + Relay5 + Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Relay On/Off +Lost Rover Sound +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable + Relay5 + Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Relay On/Off +Lost Rover Sound +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable + Relay5 + Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Relay On/Off +Lost Rover Sound +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable + Relay5 + Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Relay On/Off +Lost Rover Sound +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable + Relay5 + Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Relay On/Off +Lost Rover Sound +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable + Relay5 + Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Relay On/Off +Lost Rover Sound +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable + Relay5 + Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Relay On/Off +Lost Rover Sound +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable + Relay5 + Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Relay On/Off +Lost Rover Sound +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable + Relay5 + Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Relay On/Off +Lost Rover Sound +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable + Relay5 + Relay6 + + + + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + + + + +Disabled +BB Blue GP0 pin 4 +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +BB Blue GP0 pin 3 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1/BB Blue GP0 pin 6 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2/BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +BB Blue GP0 pin 3 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1/BB Blue GP0 pin 6 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2/BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +BB Blue GP0 pin 3 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1/BB Blue GP0 pin 6 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2/BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +BB Blue GP0 pin 3 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1/BB Blue GP0 pin 6 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2/BB Blue GP0 pin 5 + + + + +Off +On +NoChange + + + + +Disabled +BB Blue GP0 pin 4 +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +BB Blue GP0 pin 3 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1/BB Blue GP0 pin 6 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2/BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +BB Blue GP0 pin 3 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1/BB Blue GP0 pin 6 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2/BB Blue GP0 pin 5 + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLiteV3HP-I2C +PWM + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +GPIO1 +GPIO2 +GPIO3 +GPIO4 +GPIO5 +GPIO6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +ms +milliseconds +1 + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLiteV3HP-I2C +PWM + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +ms +milliseconds +1 + + + +No +Yes + + + +cm +centimeters +0 127 +1 + + +0 127 +1 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLiteV3HP-I2C +PWM + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +ms +milliseconds +1 + + + +No +Yes + + + +cm +centimeters +0 127 +1 + + +0 127 +1 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLiteV3HP-I2C +PWM + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +ms +milliseconds +1 + + + +No +Yes + + + +cm +centimeters +0 127 +1 + + +0 127 +1 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +Disabled +AnalogPin +RCChannelPwmValue +ReceiverProtocol +PWMInputPin + + + + +Pixracer +Pixhawk ADC4 +Pixhawk ADC3 +Pixhawk ADC6 +Pixhawk2 ADC +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 +Pixhawk SBUS + + + +V +volt +0.01 +0 5.0 + + +V +volt +0.01 +0 5.0 + + +0 16 + + +PWM +PWM in microseconds +0 2000 + + +PWM +PWM in microseconds +0 2000 + + + + + +Disabled +ShowSlips +ShowOverruns + + + + +50Hz +100Hz +200Hz +250Hz +300Hz +400Hz + +True + + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +460800 +500000 +921600 +1500000 + + + + +MAVlink1 +MAVLink2 + +True + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + +0 120 +s +seconds + + + + + +Disable +Enable + + + +25 400 +Hz +hertz + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + +Disabled +Enabled + + + + +Disabled +TestMotor1 +TestMotor2 +TestMotor3 +TestMotor4 +TestMotor5 +TestMotor6 +TestMotor7 +TestMotor8 + + + +s +seconds +0 300 + + +Hz +hertz +0 500 + + + +Disabled +Enabled + + + + +None +OneShot +OneShot125 +Brushed +DShot150 +DShot300 +DShot600 +DShot1200 + + + + +Console +Telem1 +Telem2 +Telem3 +Telem4 +Telem5 + + + +1 127 + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + + +0 4095 + + +0 4095 + + + + +25 250 +Hz +hertz + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + + + +Disabled +Enabled + + + +0 15 + + + + + +Disabled +Enabled + + + +0 15 + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + + +Normal +Reverse + + + + + + +Disabled +Enabled + + + +0 15 + + +0 15 + + + + + +Disabled +Enabled + + + +% +percent +0 100 + + +ms +milliseconds +1000 2000 + + +cm/s +centimeters per second +0 1000 + + +% +percent +0 100 + + + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + + + +m +meters +0 10 + + +0 500 +True + + + + +True + + +s +seconds +True + + +s +seconds +True + + +s +seconds +True + + + + + +None +MAV + + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Right +Back +Left +Up +Down + + + + + + +None +Quadrature + + + +1 + + +m +meters +0.001 + + +m +meters +0.01 + + +m +meters +0.01 + + +m +meters +0.01 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +None +Quadrature + + + +1 + + +m +meters +0.001 + + +m +meters +0.01 + + +m +meters +0.01 + + +m +meters +0.01 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + + + +None +Heading when armed +RC input offset heading when armed +Analog + + + +0 16 +1 + + + +Pixracer +Pixhawk ADC4 +Pixhawk ADC3 +Pixhawk ADC6 +Pixhawk2 ADC +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 +Pixhawk SBUS + + + +V +volt +0.01 +0 5.0 + + +V +volt +0.01 +0 5.0 + + +deg +degrees +1 +0 360 + + +Hz +hertz + + + +None +Calibrate + + + +deg +degrees +1 +0 360 + + +m/s +meters per second +0.1 +0 5 + + + +None +Airspeed library +Moden Devices Wind Sensor +SITL + + + + +Pixracer +Pixhawk ADC4 +Pixhawk ADC3 +Pixhawk ADC6 +Pixhawk2 ADC +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 +Pixhawk SBUS + + + + +Pixracer +Pixhawk ADC4 +Pixhawk ADC3 +Pixhawk ADC6 +Pixhawk2 ADC +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 +Pixhawk SBUS + + + +V +volt +0.01 +0 3.3 + + +Hz +hertz + + + + + +Disabled +Enabled + + + +rad/s +radians per second +0 200 + + +0.100 2.000 + + +0.100 2.000 + + +0.000 2.000 + + +0.000 1.000 + + +0.000 0.400 + + +1.000 100.000 +Hz +hertz + + +0.100 2.000 + + +0.100 2.000 + + +0.000 2.000 + + +0.000 1.000 + + +0.000 0.400 + + +1.000 100.000 +Hz +hertz + + + diff --git a/src/FirmwarePlugin/APM/APMParameterFactMetaData.Rover.3.6.xml b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Rover.3.6.xml new file mode 100644 index 0000000..64e19bd --- /dev/null +++ b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Rover.3.6.xml @@ -0,0 +1,13034 @@ + + + + + + + + + +Disabled +Default + +0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:THR,5:NTUN,7:IMU,8:CMD,9:CURRENT,10:RANGEFINDER,11:COMPASS,12:CAMERA,13:STEERING,14:RC,15:ARM/DISARM,19:IMU_RAW + + + + + +Manual +Acro +Steering +Hold +Loiter +Follow +Simple +Auto +RTL +SmartRTL +Guided + + + +1 255 + + +1 255 + + +s +seconds +0 30 +1 + + + +None +Steering +Throttle +Pitch +Left Wheel +Right Wheel +Sailboat Heel + +0:Steering,1:Throttle,2:Pitch,3:Left Wheel,4:Right Wheel,5:Sailboat Heel + + + +Disabled +APM TriggerPin0 +APM TriggerPin1 +APM TriggerPin2 +APM TriggerPin3 +APM TriggerPin4 +APM TriggerPin5 +APM TriggerPin6 +APM TriggerPin7 +APM TriggerPin8 +Pixhawk TriggerPin50 +Pixhawk TriggerPin51 +Pixhawk TriggerPin52 +Pixhawk TriggerPin53 +Pixhawk TriggerPin54 +Pixhawk TriggerPin55 + + + +m/s/s +meters per square second +0 20 +0.1 + + +m/s +meters per second +0 100 +0.1 + + +% +percent +0 100 +1 + + + +Default +Two Paddles Input +Direction reversed when backing up +Direction unchanged when backing up + + + + +Nothing +RTL +Hold +SmartRTL or RTL +SmartRTL or Hold + + + +s +seconds +1 100 +0.5 + + + +Disabled +Enabled +Enabled Continue with Mission in Auto + + + +910 1100 +1 + + + +Disabled +Enabled +Enabled Continue with Mission in Auto + + + + +Disabled +Hold +HoldAndDisarm + + + + +Disabled +Hold + + + +0.6:Strict, 0.8:Default, 1.0:Relaxed + + +cm +centimeters +0 1000 +1 + + +deg +degrees +-450 450 +1 + + +s +seconds +0 100 +0.1 + + +1 100 +1 + + + + + +Manual +Acro +Steering +Hold +Loiter +Follow +Simple +Auto +RTL +SmartRTL +Guided + + + + +Manual +Acro +Steering +Hold +Loiter +Follow +Simple +Auto +RTL +SmartRTL +Guided + + + + +Manual +Acro +Steering +Hold +Loiter +Follow +Simple +Auto +RTL +SmartRTL +Guided + + + + +Manual +Acro +Steering +Hold +Loiter +Follow +Simple +Auto +RTL +SmartRTL +Guided + + + + +Manual +Acro +Steering +Hold +Loiter +Follow +Simple +Auto +RTL +SmartRTL +Guided + + + + +Manual +Acro +Steering +Hold +Loiter +Follow +Simple +Auto +RTL +SmartRTL +Guided + + + +gravities +standard acceleration due to gravity +0.1 10 +0.01 + + + +NotEnforced +Enforced + + + +m +meters +0 10 +0.1 + + +deg/s +degrees per second +0 360 +1 + + +m/s +meters per second +0 100 +0.1 + + + +Undefined +Rover +Boat +BalanceBot + + + +deg +degrees +0 5 +0.1 + + +deg +degrees +0 60 +1 + + + +Undefined +Omni3 +OmniX +OmniPlus + +True + + + +Forward or reverse to target point +Always face bow towards target point + + + + +InitialHeading +CardinalDirections + +True + + +m +meters +0 20 +1 + + + +Hold +Loiter +Acro + + + +deg +degrees +-2 2 +0.1 + + + +Disabled +Enabled + + + + +Nothing +SaveWaypoint +LearnCruiseSpeed +ArmDisarm +Manual +Acro +Steering +Hold +Auto +RTL +SmartRTL +Guided +Loiter + + + + + +deg +degrees +0 360 +1 + + +m +meters +0 1000 +0.1 + + +m +meters +0 10 +0.1 + + +m/s +meters per second +0 100 +0.1 + + +deg/s +degrees per second +0 360 +1 + + + + + + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + + + + + + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + +m +meters + + +m +meters + + +mbar +millibar + + + + + + + + + + + + + + +s +seconds + + + + +0.0 1.0 +.01 + + + +Disabled +Enabled + + + +0.1 0.4 +.01 + + +0.1 0.4 +.01 + + +0 127 +m/s +meters per second +1 + + +rad +radians +-0.1745 +0.1745 +0.01 + + +rad +radians +-0.1745 +0.1745 +0.01 + + +rad +radians +-0.1745 +0.1745 +0.01 + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 +Custom + + + +0.001 0.5 +.01 + + +0 10 +1 + + + +Disabled +Enable EKF2 +Enable EKF3 + + + +-180 180 +deg +degrees +1 + + +-180 180 +deg +degrees +1 + + +-180 180 +deg +degrees +1 + + + + + +Disabled +THR_MIN PWM when disarmed +0 PWM when disarmed + + + + +None +All +Barometer +Compass +GPS Lock +INS(INertial Sensors - accels & gyros) +Parameters(unused) +RC Channels +Board voltage +Battery Level +Airspeed +LoggingAvailable +Hardware safety switch +GPS configuration +System + +0:All,1:Barometer,2:Compass,3:GPS lock,4:INS,5:Parameters,6:RC Channels,7:Board voltage,8:Battery Level,9:Airspeed,10:Logging Available,11:Hardware safety switch,12:GPS Configuration,13:System + + +m/s/s +meters per square second +0.25 3.0 + + + +Disabled +ArmingOnly +ArmOrDisarm + + + +0:Land,1:VTOL Land,2:DO_LAND_START,3:Takeoff,4:VTOL Takeoff,5:Rallypoint + + + + + +None +I2C-MS4525D0 +Analog +I2C-MS5525 +I2C-MS5525 (0x76) +I2C-MS5525 (0x77) +I2C-SDP3X +I2C-DLVR +UAVCAN + + + + +DoNotUse +Use +UseWhenZeroThrottle + + + +0.1 + + +0.1 + + + + + + + + + +Disable +Enable + + + + + + +Bus0(internal) +Bus1(external) +Bus2(auxillary) + + + + +FirstSensor +2ndSensor + + + +0:Disable on sensor failure,1:Re-enable on sensor recovery + + + +None +I2C-MS4525D0 +Analog +I2C-MS5525 +I2C-MS5525 (0x76) +I2C-MS5525 (0x77) +I2C-SDP3X +I2C-DLVR +UAVCAN + + + + +Don't Use +use +UseWhenZeroThrottle + + + +0.1 + + +0.1 + + + + + + + + + +Disable +Enable + + + + + + +Bus0(internal) +Bus1(external) +Bus2(auxillary) + + + + + +0.000 2.000 +0.01 + + +0.000 2.000 +0.01 + + +0.000 1.000 +0.01 + + +0.000 0.400 +0.001 + + +0.000 3.000 +0.001 + + +0.000 100.000 +0.1 +Hz +hertz + + +0.010 2.000 +0.01 + + +0.000 2.000 + + +0.000 1.000 +0.01 + + +0.000 0.400 +0.001 + + +0.000 0.500 +0.001 + + +0.000 100.000 +0.1 +Hz +hertz + + +0.0 10.0 +0.1 +m/s/s +meters per square second + + + +Disable +Enable + + + +0.00 0.50 +0.01 +m/s +meters per second + + +1.000 10.000 +0.1 + + +0 1000 +0.1 +deg/s/s +degrees per square second + + +0 1000 +0.1 +deg/s +degrees per second + + +0.0 10.0 +0.1 +m/s/s +meters per square second + + +0.000 2.000 +0.01 + + +0.000 2.000 + + +0.000 1.000 +0.01 + + +0.000 0.100 +0.001 + + +0.000 0.500 +0.001 + + +0.000 100.000 +0.1 +Hz +hertz + + +0.0 10.0 +0.01 + + +0.000 2.000 +0.01 + + +0.000 2.000 + + +0.000 1.000 +0.01 + + +0.000 0.100 +0.001 + + +0.000 0.500 +0.001 + + +0.000 100.000 +0.1 +Hz +hertz + + + + + +None +UseFence +UseProximitySensor +UseFence and UseProximitySensor +UseBeaconFence +All + +0:UseFence,1:UseProximitySensor,2:UseBeaconFence + + +cdeg +centidegrees +0 4500 + + +m +meters +1 30 + + +m +meters +1 10 + + + +Slide +Stop + + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +None +Pozyx +Marvelmind +SITL + + + +deg +degrees +0.000001 +-90 90 + + +deg +degrees +0.000001 +-180 180 + + +m +meters +1 +0 10000 + + +deg +degrees +1 +-180 +180 + + + + + +No PWMs +One PWMs +Two PWMs +Three PWMs +Four PWMs +Five PWMs +Six PWMs +Seven PWMs +Eight PWMs + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled + +True + + + +Disabled +50Hz +75Hz +100Hz +150Hz +200Hz +250Hz +300Hz + +True + + +-32768 32767 + + + +Disabled +Enabled + +0:Ch1,1:Ch2,2:Ch3,3:Ch4,4:Ch5,5:Ch6,6:Ch7,7:Ch8,8:Ch9,9:Ch10,10:Ch11,11:Ch12,12:Ch13,13:Ch14 +True + + +-1 80 +degC +degrees Celsius + + + +AUTO +PX4V1 +Pixhawk +Cube/Pixhawk2 +Pixracer +PixhawkMini +Pixhawk2Slim +VRBrain 5.1 +VRBrain 5.2 +VR Micro Brain 5.1 +VR Micro Brain 5.2 +VRBrain Core 1.0 +VRBrain 5.4 +Intel Aero FC +AUAV2.1 + +True + + + +Disabled +Enabled + +True + + +0:ActiveForSafetyEnable,1:ActiveForSafetyDisable,2:ActiveWhenArmed,3:Force safety on when the aircraft disarms + + +V +volt +4.0 5.5 +0.1 + + +V +volt +3.3 12.0 +0.1 + + +0 32 +1 + + + +3.3V +5V + + + +0:Enable hardware watchdog + + + + + +None +CYRF6936 + + + + +Auto +DSM2 +DSMX + + + +0 4 + + + +NotDisabled +Disabled + + + +0 16 + + +0 16 + + + +Disabled +Enabled + + + +1 8 + + + +Disabled +MinChannel +MidChannel +MaxChannel +MinChannelCW +MidChannelCW +MaxChannelCW + + + + +Mode1 +Mode2 + + + + +Disabled +TestChan1 +TestChan2 +TestChan3 +TestChan4 +TestChan5 +TestChan6 +TestChan7 +TestChan8 + + + +0 16 + + +0 16 + + +1 8 + + +0 40 + + +0 120 + + +0 31 + + + + +0:GPS,1:MAVLINK_SYSTEM_TIME,2:HW + + + + + +Disabled +Enabled + + + + +Disabled +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 + + + + +Disabled +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 + + + + +Disabled +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 + + + + +Disabled +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 + + + +0 3600 + + + + + +Servo +Relay + + + +ds +deciseconds +0 50 + + +PWM +PWM in microseconds +1000 2000 + + +PWM +PWM in microseconds +1000 2000 + + +m +meters +0 1000 + + + +Low +High + + + +ms +milliseconds +0 10000 + + +deg +degrees +0 180 + + + +Disabled +AUX1 +AUX2 +AUX3 +AUX4 +AUX5 +AUX6 + +True + + + +TriggerLow +TriggerHigh + + + + +Always +Only when in AUTO + + + + +Default +BMMCC + + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + +0 32767 + + + + +-400 400 +mGauss +milligauss +1 + + +-400 400 +mGauss +milligauss +1 + + +-400 400 +mGauss +milligauss +1 + + +-3.142 3.142 +rad +radians +0.01 + + + +Disabled +Internal-Learning +EKF-Learning +InFlight-Learning + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Use Throttle +Use Current + + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + +-400 400 +mGauss +milligauss +1 + + +-400 400 +mGauss +milligauss +1 + + +-400 400 +mGauss +milligauss +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + + +FirstCompass +SecondCompass +ThirdCompass + + + +-400 400 +mGauss +milligauss +1 + + +-400 400 +mGauss +milligauss +1 + + +-400 400 +mGauss +milligauss +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +True + + +True + + +True + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +4 32 + +Very Strict +Strict +Default +Relaxed + +0.1 + + +500 3000 +1 + + +0:HMC5883,1:LSM303D,2:AK8963,3:BMM150,4:LSM9DS1,5:LIS3MDL,6:AK09916,7:IST8310,8:ICM20948,9:MMC3416,11:UAVCAN,12:QMC5883,14:MAG3110,15:IST8308 + + +% +percent +0 100 +1 + + + +Disabled +CheckOnly +CheckAndFix + + + + + + + + + + +Disabled +Enabled + + + + + + +Disabled +Enabled + + + +0 2 +0.01 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.000001 0.001 +Hz +hertz + + +0.00001 0.005 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +2.0 6.0 +0.5 +m/s +meters per second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + +0 127 +1 +ms +milliseconds +True + + + +None +Navigation +Terrain + +True + + +0 500 +mGauss +milligauss + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +True +ms +milliseconds + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + +True + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 250 +10 +True +ms +milliseconds + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.00001 0.005 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +True +ms +milliseconds + + +2.0 6.0 +0.5 +m/s +meters per second + + +0.5 2.5 +0.1 +m/s/s +meters per square second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + +0.05 0.5 +0.05 +m/s +meters per second + + +0.5 5.0 +0.1 +m/s +meters per second + + +0.01 1.0 +0.1 +m/s +meters per second + + + +None +Navigation +Terrain + +True + + + + + +Disabled +Enabled + + + + +None +Altitude +Circle +Altitude and Circle +Polygon +Altitude and Polygon +Circle and Polygon +All + +0:Altitude,1:Circle,2:Polygon + + + +Report Only +RTL or Land +Always Land +SmartRTL or RTL or Land +Brake or Land + + + +m +meters +10 1000 +1 + + +m +meters +30 10000 + + +m +meters +1 10 + + +1 20 + + +m +meters +-100 100 +1 + + + + + +Disabled +Enabled + + + +0 255 + + +m +meters +1 1000 + + + +North-East-Down +Relative to lead vehicle heading + + + +-100 100 +m +meters +1 + + +-100 100 +m +meters +1 + + +-100 100 +m +meters +1 + + + +None +Face Lead Vehicle +Same as Lead vehicle +Direction of Flight + + + +0.01 1.00 +0.01 + + + +absolute + relative + + + + + +Pa +pascal +1 +True +True + + +degC +degrees Celsius +1 +True + + +m +meters +0.1 + + + +FirstBaro +2ndBaro +3rdBaro + + + + +Disabled +Bus0 +Bus1 + + + +1.0:Freshwater,1.024:Saltwater + + +Pa +pascal +1 +True +True + + +Pa +pascal +1 +True +True + + +% +percent +0 100 +1 + + +0:BMP085,1:BMP280,2:MS5611,3:MS5607,4:MS5637,5:FBM320,6:DPS280,7:LPS25H,8:Keller + +BMP085 +BMP280 +MS5611 +MS5607 +MS5637 +FBM320 +DPS280 +LPS25H +Keller + + + + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA + +True + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA + +True + + + +Portable +Stationary +Pedestrian +Automotive +Sea +Airborne1G +Airborne2G +Airborne4G + + + + +Disabled +UseBest +Blend +UseSecond + + + + +Any +FloatRTK +IntegerRTK + +True + + + +Disabled +Enabled +NoChange + + + +-100 90 +deg +degrees + + + +send to first GPS +send to 2nd GPS +send to all + + + + +None (0x0000) +All (0xFFFF) +External only (0xFF00) + + + + +Ignore +Always log +Stop logging when disarmed (SBF only) +Only log every five samples (uBlox only) + +True + + + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + + + +Do not save config +Save config +Save only when needed + + + + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + + + +Disables automatic configuration +Enable automatic configuration + + + +ms +milliseconds + +10Hz +8Hz +5Hz + +50 200 + + +ms +milliseconds + +10Hz +8Hz +5Hz + +50 200 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +ms +milliseconds +0 250 +True + + +ms +milliseconds +0 250 +True + + +0:Horiz Pos,1:Vert Pos,2:Speed + + +s +seconds +5.0 30.0 + + + + + +Disabled +Enabled + + + + +None +Servo +EPM + + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +0 255 +s +seconds + + +0 255 + + + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +Hz +hertz +0 256 + + +Hz +hertz +0 256 + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +0.05 50 + + + +Never +Start-up only + + + + +Don't adjust the trims +Assume first orientation was level +Assume ACC_BODYFIX is perfectly aligned to the vehicle + + + + +IMU 1 +IMU 2 +IMU 3 + + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +True + + +True + + +True + + +True + + +True + + +True + + + +FirstIMUOnly +FirstAndSecondIMU + +0:FirstIMU,1:SecondIMU,2:ThirdIMU + + + +FirstIMUOnly +FirstAndSecondIMU +FirstSecondAndThirdIMU +AllIMUs + +0:FirstIMU,1:SecondIMU,2:ThirdIMU + + + + +32 + + + +None +First IMU +All + +0:IMU1,1:IMU2,2:IMU3 + + +0:Sensor-Rate Logging (sample at full sensor rate seen by AP), 1: Sample post-filtering + + +ms +milliseconds +10 + + +1 + + + + + +Disabled +Enabled + + + +10 400 +Hz +hertz + + +5 100 +Hz +hertz + + +5 30 +dB +decibel + + + + + +None +File +MAVLink +File and MAVLink +Block +Block and MAVLink + +0:File,1:MAVLink,2:Block + + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +kB +kilobytes + + + + +0 32766 +1 + + + +Resume Mission +Restart Mission + + + +0:Clear Mission on reboot + + + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + +0 100 +1 + + +s +seconds +0.0 0.2 +.005 + + +s +seconds +0.0 0.2 +.005 + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + +True + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + +s +seconds +0.0 0.2 +.005 + + +s +seconds +0.0 0.2 +.005 + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + + + + + + +Normal +OneShot +OneShot125 +BrushedWithRelay +BrushedBiPolar +DShot150 +DShot300 +DShot600 +DShot1200 + +True + + +kHz +kilohertz +1 20 +1 +True + + + +PWM enabled while disarmed +PWM disabled while disarmed + + + +% +percent +0 20 +1 + + +% +percent +30 100 +1 + + +%/s +percent per second +0 1000 +1 + + +-1.0 1.0 + + +% +percent +0 100 + + +m/s +meters per second +0 10 + + + + +s +seconds +1 60 +1 + + +0.6 1.0 +0.05 + + +0 0.1 +0.01 + + +deg +degrees +0 89 + + + + + +Off +Low +Medium +High + + + + +Disable +Enable + + + + +Standard +MAVLink +OutbackChallenge + + + + +Disable +ssd1306 +sh1106 + + + + +Disabled +Aircraft +Rover + + + + +Disabled + + + +0:Build in LED, 1:Internal ToshibaLED, 2:External ToshibaLED, 3:External PCA9685, 4:Oreo LED, 5:UAVCAN, 6:NCP5623 External, 7:NCP5623 Internal + + + +LowIsOn +HighIsOn + + + + + + +Disabled +BendyRuler +Dijkstra + + + +m +meters +1 100 +1 + + +m +meters +1 100 +1 + + + + + +None +MAX7456 + +True + + + +Disable +Chan5 +Chan6 +Chan7 +Chan8 +Chan9 +Chan10 +Chan11 +Chan12 +Chan13 +Chan14 +Chan15 +Chan16 + + + +0:UseDecimalPack, 1:InvertedWindPointer, 2:InvertedAHRoll + + +True + + +0 31 +True + + +0 63 +True + + +0 99 + + +1 30 + + +0 100 + + + +Metric +Imperial +SI +Aviation + + + +1 20 + + +0 4 + + +0 4 + + +0 4 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +None +LightWareSF40C +MAVLink +TeraRangerTower +RangeFinder +RPLidarA2 +TeraRangerTowerEvo +SITL +MorseSITL + +True + + + +Default +Upside Down + + + +deg +degrees +-180 180 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + + +None +LightWareSF40C +MAVLink +TeraRangerTower +RangeFinder +RPLidarA2 +TeraRangerTowerEvo + +True + + + +Default +Upside Down + + + +deg +degrees +-180 180 + + + + + + +km +kilometers +0.1 + + + +DoNotIncludeHome +IncludeHome + + + + + +0.0 120.0 +s +seconds + + +0:Ignore RC Receiver, 1:Ignore MAVLink Overrides, 2:Ignore Receiver Failsafe + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Gripper +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Gripper +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Gripper +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Gripper +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Gripper +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Gripper +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Gripper +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Gripper +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Gripper +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Gripper +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Gripper +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Gripper +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Gripper +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Gripper +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Gripper +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save WP +Camera Trigger +Auto +Gripper +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 + + + + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True +1-8 + + +1 8 +1 +True +1-8 + + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Off +On +NoChange + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFMiniPlus + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +ms +milliseconds +1 + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFMiniPlus + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +ms +milliseconds +1 + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFMiniPlus + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +ms +milliseconds +1 + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFMiniPlus + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +ms +milliseconds +1 + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFMiniPlus + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +ms +milliseconds +1 + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFMiniPlus + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +ms +milliseconds +1 + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFMiniPlus + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +ms +milliseconds +1 + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFMiniPlus + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +ms +milliseconds +1 + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFMiniPlus + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +ms +milliseconds +1 + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFMiniPlus + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +ms +milliseconds +1 + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +PX4-PWM +AUXPIN + + + +0.001 + + +1 + + +1 + + +0.1 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +None +PX4-PWM +AUXPIN + + + +0.001 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + + + +Disabled +AnalogPin +RCChannelPwmValue +ReceiverProtocol +PWMInputPin + + + + +V5 Nano +Pixracer +Pixhawk ADC4 +Pixhawk ADC3 +Pixhawk ADC6 +Pixhawk2 ADC +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 +Pixhawk SBUS + + + +V +volt +0.01 +0 5.0 + + +V +volt +0.01 +0 5.0 + + +0 16 + + +PWM +PWM in microseconds +0 2000 + + +PWM +PWM in microseconds +0 2000 + + + + + +Disable +Enable + +True + + +deg +degrees +0 90 +1 + + +deg +degrees +0 90 +1 + + +deg +degrees +0 90 +1 + + +deg +degrees +0 90 +1 + + +deg +degrees +0 90 +1 + + + + + +Disabled +ShowSlips +ShowOverruns + + + + +50Hz +100Hz +200Hz +250Hz +300Hz +400Hz + +True + + + + + +None +Lua Scripts + +True + + +1000 1000000 +10000 + + +1024 1048576 +1024 +True + + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +460800 +500000 +921600 +1500000 + + + + +MAVlink1 +MAVLink2 + +True + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + +0 120 +s +seconds + + + + + +Disable +Enable + + + +25 400 +Hz +hertz + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + +Disabled +Enabled + + + + +Disabled +TestMotor1 +TestMotor2 +TestMotor3 +TestMotor4 +TestMotor5 +TestMotor6 +TestMotor7 +TestMotor8 + + + +s +seconds +0 300 + + +Hz +hertz +0 500 + + + +Disabled +Enabled + + + + +None +OneShot +OneShot125 +Brushed +DShot150 +DShot300 +DShot600 +DShot1200 + + + + +Console +Telem1 +Telem2 +Telem3 +Telem4 +Telem5 + + + +1 127 + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + + +0 4095 + + +0 4095 + + + + +25 250 +Hz +hertz + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + + + +Disabled +Enabled + + + +0 15 + + + + + +Disabled +Enabled + + + +0 15 + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + + +Normal +Reverse + + + + + + +Disabled +Enabled + + + +deg +degrees +0.000001 +-90 90 + + +deg +degrees +0.000001 +-180 180 + + +cm +centimeters +1 +0 10000 + + +deg +degrees +1 +-180 +180 + + +Hz +hertz +0 200 + + + +cylinder +cone +sphere + + + +m +meters +0 100 + + +m +meters +5 100 + + + + + +Disabled +Enabled + + + +0 15 + + +0 15 + + + + + +Disabled +Enabled + + + +% +percent +0 100 + + +ms +milliseconds +1000 2000 + + +cm/s +centimeters per second +0 1000 + + +% +percent +0 100 + + + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + + + +m +meters +0 10 + + +0 500 +True + + + + +True + + +s +seconds +True + + +s +seconds +True + + +s +seconds +True + + + + + +None +MAV + + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Right +Back +Left +Up +Down + + + + + + +None +Quadrature + + + +1 + + +m +meters +0.001 + + +m +meters +0.01 + + +m +meters +0.01 + + +m +meters +0.01 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +None +Quadrature + + + +1 + + +m +meters +0.001 + + +m +meters +0.01 + + +m +meters +0.01 + + +m +meters +0.01 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + + + +None +Heading when armed +RC input offset heading when armed +Analog +NMEA +SITL + +True + + +0 16 +1 + + + +Pixracer +Pixhawk ADC4 +Pixhawk ADC3 +Pixhawk ADC6 +Pixhawk2 ADC +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 +Pixhawk SBUS + + + +V +volt +0.01 +0 5.0 + + +V +volt +0.01 +0 5.0 + + +deg +degrees +1 +0 360 + + +Hz +hertz + + + +None +Calibrate direction +Calibrate speed + + + +deg +degrees +1 +0 360 + + +m/s +meters per second +0.1 +0 5 + + + +None +Airspeed library +Modern Devices Wind Sensor +RPM library +NMEA +SITL + +True + + + +Pixracer +Pixhawk ADC4 +Pixhawk ADC3 +Pixhawk ADC6 +Pixhawk2 ADC +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 +Pixhawk SBUS + + + + +Pixracer +Pixhawk ADC4 +Pixhawk ADC3 +Pixhawk ADC6 +Pixhawk2 ADC +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 +Pixhawk SBUS + + + +V +volt +0.01 +0 3.3 + + +Hz +hertz + + + + +m/s +meters per second +0 100 +0.1 + + +m +meters +0 100 +0.1 + + +m +meters +0 10 +0.1 + + +deg +degrees +0 360 +1 + + +deg/s +degrees per second +0 360 +1 + + + + + +Disabled +Enabled + + + +rad/s +radians per second +0 200 + + +0.100 2.000 + + +0.100 2.000 + + +0.000 2.000 + + +0.000 1.000 + + +0.000 0.400 + + +1.000 100.000 +Hz +hertz + + +0.100 2.000 + + +0.100 2.000 + + +0.000 2.000 + + +0.000 1.000 + + +0.000 0.400 + + +1.000 100.000 +Hz +hertz + + + diff --git a/src/FirmwarePlugin/APM/APMParameterFactMetaData.Rover.4.0.xml b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Rover.4.0.xml new file mode 100644 index 0000000..078c13d --- /dev/null +++ b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Rover.4.0.xml @@ -0,0 +1,13621 @@ + + + + + + + + + +Disabled +Default + +0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:THR,5:NTUN,7:IMU,8:CMD,9:CURRENT,10:RANGEFINDER,11:COMPASS,12:CAMERA,13:STEERING,14:RC,15:ARM/DISARM,19:IMU_RAW + + + + + +Manual +Acro +Steering +Hold +Loiter +Follow +Simple +Auto +RTL +SmartRTL +Guided + + + +1 255 + + +1 255 + + +s +seconds +0 30 +1 + + + +None +Steering +Throttle +Pitch +Left Wheel +Right Wheel +Sailboat Heel + +0:Steering,1:Throttle,2:Pitch,3:Left Wheel,4:Right Wheel,5:Sailboat Heel + + + +Disabled +APM TriggerPin0 +APM TriggerPin1 +APM TriggerPin2 +APM TriggerPin3 +APM TriggerPin4 +APM TriggerPin5 +APM TriggerPin6 +APM TriggerPin7 +APM TriggerPin8 +Pixhawk TriggerPin50 +Pixhawk TriggerPin51 +Pixhawk TriggerPin52 +Pixhawk TriggerPin53 +Pixhawk TriggerPin54 +Pixhawk TriggerPin55 + + + +m/s/s +meters per square second +0 20 +0.1 + + +m/s +meters per second +0 100 +0.1 + + +% +percent +0 100 +1 + + + +Default +Two Paddles Input +Direction reversed when backing up +Direction unchanged when backing up + + + + +Nothing +RTL +Hold +SmartRTL or RTL +SmartRTL or Hold + + + +s +seconds +1 100 +0.5 + + + +Disabled +Enabled +Enabled Continue with Mission in Auto + + + +910 1100 +1 + + + +Disabled +Enabled +Enabled Continue with Mission in Auto + + + + +Disabled +Hold +HoldAndDisarm + + + + +Disabled +Hold + + + +0.6:Strict, 0.8:Default, 1.0:Relaxed + + + + + +Manual +Acro +Steering +Hold +Loiter +Follow +Simple +Auto +RTL +SmartRTL +Guided + + + + +Manual +Acro +Steering +Hold +Loiter +Follow +Simple +Auto +RTL +SmartRTL +Guided + + + + +Manual +Acro +Steering +Hold +Loiter +Follow +Simple +Auto +RTL +SmartRTL +Guided + + + + +Manual +Acro +Steering +Hold +Loiter +Follow +Simple +Auto +RTL +SmartRTL +Guided + + + + +Manual +Acro +Steering +Hold +Loiter +Follow +Simple +Auto +RTL +SmartRTL +Guided + + + + +Manual +Acro +Steering +Hold +Loiter +Follow +Simple +Auto +RTL +SmartRTL +Guided + + + +gravities +standard acceleration due to gravity +0.1 10 +0.01 + + + +NotEnforced +Enforced + + + +m +meters +0 10 +0.1 + + +deg/s +degrees per second +0 360 +1 + + +m/s +meters per second +0 100 +0.1 + + + +Undefined +Rover +Boat +BalanceBot + + + +deg +degrees +0 5 +0.1 + + +deg +degrees +0 60 +1 + + + +Undefined +Omni3 +OmniX +OmniPlus + +True + + + +Forward or reverse to target point +Always face bow towards target point +Always face stern towards target point + + + + +InitialHeading +CardinalDirections + +True + + +m +meters +0 20 +1 + + + +Hold +Loiter +Acro + + + +deg +degrees +-2 2 +0.1 + + + +Disabled +Enabled + + + +m/s +meters per second +0 30 +0.1 + + +0 5 +0.01 + + + +None +Failsafe enabled in Hold mode + +0:Failsafe enabled in Hold mode + + + +Nothing +SaveWaypoint +LearnCruiseSpeed +ArmDisarm +Manual +Acro +Steering +Hold +Auto +RTL +SmartRTL +Guided +Loiter + + + + + +deg +degrees +0 360 +1 + + +deg/s +degrees per second +0 360 +1 + + + + + + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + + + + + + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + +m +meters + + +m +meters + + +mbar +millibar + + + + + + + + + + + + + + +s +seconds + + +km +kilometers + + + + +0.0 1.0 +.01 + + + +Disabled +Enabled + + + +0.1 0.4 +.01 + + +0.1 0.4 +.01 + + +0 127 +m/s +meters per second +1 + + +rad +radians +-0.1745 +0.1745 +0.01 + + +rad +radians +-0.1745 +0.1745 +0.01 + + +rad +radians +-0.1745 +0.1745 +0.01 + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 +Custom + + + +0.001 0.5 +.01 + + +0 10 +1 + + + +Disabled +Enable EKF2 +Enable EKF3 + + + +-180 180 +deg +degrees +1 + + +-180 180 +deg +degrees +1 + + +-180 180 +deg +degrees +1 + + + + + +Disabled +THR_MIN PWM when disarmed +0 PWM when disarmed + + + +m/s/s +meters per square second +0.25 3.0 + + + +Disabled +ArmingOnly +ArmOrDisarm + + + +0:Land,1:VTOL Land,2:DO_LAND_START,3:Takeoff,4:VTOL Takeoff,5:Rallypoint + + + +None +All +Barometer +Compass +GPS Lock +INS(INertial Sensors - accels & gyros) +Parameters(unused) +RC Channels +Board voltage +Battery Level +Airspeed +LoggingAvailable +Hardware safety switch +GPS configuration +System + +0:All,1:Barometer,2:Compass,3:GPS lock,4:INS,5:Parameters,6:RC Channels,7:Board voltage,8:Battery Level,9:Airspeed,10:Logging Available,11:Hardware safety switch,12:GPS Configuration,13:System,14:Mission,15:Rangefinder + + + + + +None +I2C-MS4525D0 +Analog +I2C-MS5525 +I2C-MS5525 (0x76) +I2C-MS5525 (0x77) +I2C-SDP3X +I2C-DLVR-5in +UAVCAN +I2C-DLVR-10in + + + + +DoNotUse +Use +UseWhenZeroThrottle + + + +0.1 + + +0.1 + + + + + + + + + +Disable +Enable + + + + + + +Bus0(internal) +Bus1(external) +Bus2(auxillary) + + + + +FirstSensor +2ndSensor + + + +0:Disable on sensor failure,1:Re-enable on sensor recovery + + + +None +I2C-MS4525D0 +Analog +I2C-MS5525 +I2C-MS5525 (0x76) +I2C-MS5525 (0x77) +I2C-SDP3X +I2C-DLVR-5in +UAVCAN +I2C-DLVR-10in + + + + +Don't Use +use +UseWhenZeroThrottle + + + +0.1 + + +0.1 + + + + + + + + + +Disable +Enable + + + + + + +Bus0(internal) +Bus1(external) +Bus2(auxillary) + + + + + +0.000 2.000 +0.01 + + +0.000 2.000 +0.01 + + +0.000 1.000 +0.01 + + +0.000 0.400 +0.001 + + +0.000 3.000 +0.001 + + +0.000 100.000 +0.1 +Hz +hertz + + +Hz +hertz + + +Hz +hertz + + +Hz +hertz + + +0.010 2.000 +0.01 + + +0.000 2.000 + + +0.000 1.000 +0.01 + + +0.000 0.400 +0.001 + + +0.000 0.500 +0.001 + + +0.000 100.000 +0.1 +Hz +hertz + + +Hz +hertz + + +Hz +hertz + + +Hz +hertz + + +0.0 10.0 +0.1 +m/s/s +meters per square second + + + +Disable +Enable + + + +0.00 0.50 +0.01 +m/s +meters per second + + +1.000 10.000 +0.1 + + +0 1000 +0.1 +deg/s/s +degrees per square second + + +0 1000 +0.1 +deg/s +degrees per second + + +0.0 10.0 +0.1 +m/s/s +meters per square second + + +0.000 2.000 +0.01 + + +0.000 2.000 + + +0.000 1.000 +0.01 + + +0.000 0.100 +0.001 + + +0.000 0.500 +0.001 + + +0.000 100.000 +0.1 +Hz +hertz + + +Hz +hertz + + +Hz +hertz + + +Hz +hertz + + +0.0 10.0 +0.01 + + +0.000 2.000 +0.01 + + +0.000 2.000 + + +0.000 1.000 +0.01 + + +0.000 0.100 +0.001 + + +0.000 0.500 +0.001 + + +0.000 100.000 +0.1 +Hz +hertz + + +Hz +hertz + + +Hz +hertz + + +Hz +hertz + + + + + +None +UseFence +UseProximitySensor +UseFence and UseProximitySensor +UseBeaconFence +All + +0:UseFence,1:UseProximitySensor,2:UseBeaconFence + + +cdeg +centidegrees +0 4500 + + +m +meters +1 30 + + +m +meters +1 10 + + + +Slide +Stop + + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + + +None +RTL +Hold +SmartRTL +SmartRTL or Hold +Terminate + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +None +Pozyx +Marvelmind +SITL + + + +deg +degrees +0.000001 +-90 90 + + +deg +degrees +0.000001 +-180 180 + + +m +meters +1 +0 10000 + + +deg +degrees +1 +-180 +180 + + + + + +No PWMs +One PWMs +Two PWMs +Three PWMs +Four PWMs +Five PWMs +Six PWMs +Seven PWMs +Eight PWMs + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled + +True + + + +Disabled +50Hz +75Hz +100Hz +150Hz +200Hz +250Hz +300Hz + +True + + +-32768 32767 + + + +Disabled +Enabled + +0:Ch1,1:Ch2,2:Ch3,3:Ch4,4:Ch5,5:Ch6,6:Ch7,7:Ch8,8:Ch9,9:Ch10,10:Ch11,11:Ch12,12:Ch13,13:Ch14 +True + + +-1 80 +degC +degrees Celsius + + + +AUTO +PX4V1 +Pixhawk +Cube/Pixhawk2 +Pixracer +PixhawkMini +Pixhawk2Slim +VRBrain 5.1 +VRBrain 5.2 +VR Micro Brain 5.1 +VR Micro Brain 5.2 +VRBrain Core 1.0 +VRBrain 5.4 +Intel Aero FC +AUAV2.1 + +True + + + +Disabled +Enabled + +True + + +0:ActiveForSafetyEnable,1:ActiveForSafetyDisable,2:ActiveWhenArmed,3:Force safety on when the aircraft disarms + + +V +volt +4.0 5.5 +0.1 + + +V +volt +3.3 12.0 +0.1 + + +0 32 +1 + + + +3.3V +5V + + + +0:Enable hardware watchdog + + +0 10000 +ms +milliseconds + + +1 500 +1 + + +0 1 +0.1 + + +0 100 +1 + + + + + +None +CYRF6936 +CC2500 +BK2425 + + + + +Auto +DSM2 +DSMX + + + +0 4 + + + +NotDisabled +Disabled + + + +0 16 + + +0 16 + + + +Disabled +Enabled + + + +1 8 + + + +Disabled +MinChannel +MidChannel +MaxChannel +MinChannelCW +MidChannelCW +MaxChannelCW + + + + +Mode1 +Mode2 + + + + +Disabled +TestChan1 +TestChan2 +TestChan3 +TestChan4 +TestChan5 +TestChan6 +TestChan7 +TestChan8 + + + +0 16 + + +0 16 + + +1 8 + + +0 40 + + +0 120 + + +0 31 + + + + +0:GPS,1:MAVLINK_SYSTEM_TIME,2:HW + + +-720 +840 + + + + + +Disabled +Enabled + + + + +Disabled +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 + + + + +Disabled +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 + + + + +Disabled +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 + + + + +Disabled +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 + + + +0 3600 + + + + + +Servo +Relay + + + +ds +deciseconds +0 50 + + +PWM +PWM in microseconds +1000 2000 + + +PWM +PWM in microseconds +1000 2000 + + +m +meters +0 1000 + + + +Low +High + + + +ms +milliseconds +0 10000 + + +deg +degrees +0 180 + + + +Disabled +AUX1 +AUX2 +AUX3 +AUX4 +AUX5 +AUX6 + +True + + + +TriggerLow +TriggerHigh + + + + +Always +Only when in AUTO + + + + +Default +BMMCC + + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + +0 32767 + + + + +-400 400 +mGauss +milligauss +1 + + +-400 400 +mGauss +milligauss +1 + + +-400 400 +mGauss +milligauss +1 + + +-3.142 3.142 +rad +radians +0.01 + + + +Disabled +Internal-Learning +EKF-Learning +InFlight-Learning + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Use Throttle +Use Current + + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + +-400 400 +mGauss +milligauss +1 + + +-400 400 +mGauss +milligauss +1 + + +-400 400 +mGauss +milligauss +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + + +FirstCompass +SecondCompass +ThirdCompass + + + +-400 400 +mGauss +milligauss +1 + + +-400 400 +mGauss +milligauss +1 + + +-400 400 +mGauss +milligauss +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +True + + +True + + +True + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +4 32 + +Very Strict +Strict +Default +Relaxed + +0.1 + + +500 3000 +1 + + +0:HMC5883,1:LSM303D,2:AK8963,3:BMM150,4:LSM9DS1,5:LIS3MDL,6:AK09916,7:IST8310,8:ICM20948,9:MMC3416,11:UAVCAN,12:QMC5883,14:MAG3110,15:IST8308 + + +% +percent +0 100 +1 + + + +Disabled +CheckOnly +CheckAndFix + + + + + + + + + + +Disabled +Enabled + + + + + + +Disabled +Enabled + + + +0 2 +0.01 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.000001 0.001 +Hz +hertz + + +0.00001 0.005 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +2.0 6.0 +0.5 +m/s +meters per second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + +0 127 +1 +ms +milliseconds +True + + + +None +Navigation +Terrain + +True + + +0 500 +mGauss +milligauss + + +0.1 30.0 +Hz +hertz +False + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +True +ms +milliseconds + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always +Use external yaw sensor + +True + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 250 +10 +True +ms +milliseconds + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.00001 0.005 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +True +ms +milliseconds + + +2.0 6.0 +0.5 +m/s +meters per second + + +0.5 2.5 +0.1 +m/s/s +meters per square second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + +0.05 0.5 +0.05 +m/s +meters per second + + +0.5 5.0 +0.1 +m/s +meters per second + + +0.01 1.0 +0.1 +m/s +meters per second + + + +None +Navigation +Terrain + +True + + +0.1 30.0 +Hz +hertz +False + + +0 500 +mGauss +milligauss + + + + + +Disabled +Enabled + + + + +None +Altitude +Circle +Altitude and Circle +Polygon +Altitude and Polygon +Circle and Polygon +All + +0:Altitude,1:Circle,2:Polygon + + + +Report Only +RTL or Land +Always Land +SmartRTL or RTL or Land +Brake or Land + + + +m +meters +10 1000 +1 + + +m +meters +30 10000 + + +m +meters +1 10 + + +1 20 + + +m +meters +-100 100 +1 + + + + + +Disabled +Enabled + + + +0 255 + + +m +meters +1 1000 + + + +North-East-Down +Relative to lead vehicle heading + + + +-100 100 +m +meters +1 + + +-100 100 +m +meters +1 + + +-100 100 +m +meters +1 + + + +None +Face Lead Vehicle +Same as Lead vehicle +Direction of Flight + + + +0.01 1.00 +0.01 + + + +absolute + relative + + + + + +Pa +pascal +1 +True +True + + +degC +degrees Celsius +1 +True + + +m +meters +0.1 + + + +FirstBaro +2ndBaro +3rdBaro + + + + +Disabled +Bus0 +Bus1 + + + +1.0:Freshwater,1.024:Saltwater + + +Pa +pascal +1 +True +True + + +Pa +pascal +1 +True +True + + +% +percent +0 100 +1 + + +0:BMP085,1:BMP280,2:MS5611,3:MS5607,4:MS5637,5:FBM320,6:DPS280,7:LPS25H,8:Keller,9:MS5837,10:BMP388 + +BMP085 +BMP280 +MS5611 +MS5607 +MS5637 +FBM320 +DPS280 +LPS25H +Keller +MS5837 +BMP388 + + + + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA +HemisphereNMEA + +True + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA +HemisphereNMEA + +True + + + +Portable +Stationary +Pedestrian +Automotive +Sea +Airborne1G +Airborne2G +Airborne4G + + + + +Disabled +UseBest +Blend +UseSecond + + + + +Any +FloatRTK +IntegerRTK + +True + + + +Disabled +Enabled +NoChange + + + +-100 90 +deg +degrees + + + +send to first GPS +send to 2nd GPS +send to all + + + + +None (0x0000) +All (0xFFFF) +External only (0xFF00) + + + + +Ignore +Always log +Stop logging when disarmed (SBF only) +Only log every five samples (uBlox only) + +True + + + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + + + +Do not save config +Save config +Save only when needed + + + + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + + + +Disables automatic configuration +Enable automatic configuration + + + +ms +milliseconds + +10Hz +8Hz +5Hz + +50 200 + + +ms +milliseconds + +10Hz +8Hz +5Hz + +50 200 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +ms +milliseconds +0 250 +True + + +ms +milliseconds +0 250 +True + + +0:Horiz Pos,1:Vert Pos,2:Speed + + +s +seconds +5.0 30.0 + + + + + +Disabled +Enabled + + + + +None +Servo +EPM + + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +0 255 +s +seconds + + +0 255 + + + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +Hz +hertz +0 256 + + +Hz +hertz +0 256 + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +0.05 50 + + + +Never +Start-up only + + + + +Don't adjust the trims +Assume first orientation was level +Assume ACC_BODYFIX is perfectly aligned to the vehicle + + + + +IMU 1 +IMU 2 +IMU 3 + + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +True + + +True + + +True + + +True + + +True + + +True + + + +FirstIMUOnly +FirstAndSecondIMU + +0:FirstIMU,1:SecondIMU,2:ThirdIMU + + + +FirstIMUOnly +FirstAndSecondIMU +FirstSecondAndThirdIMU +AllIMUs + +0:FirstIMU,1:SecondIMU,2:ThirdIMU + + + + + +Disabled +Enabled + + + +10 400 +Hz +hertz + + +5 100 +Hz +hertz + + +5 30 +dB +decibel + + +0:1st harmonic,1:2nd harmonic,2:3rd harmonic,3:4th hamronic,4:5th harmonic,5:6th harmonic,6:7th harmonic,7:8th harmonic +True + + +0.0 1.0 +True + + +0 3 + +Disabled +Throttle +RPM Sensor +ESC Telemetry + + + + + +32 +True + + + +None +First IMU +All + +0:IMU1,1:IMU2,2:IMU3 +True + + +0:Sensor-Rate Logging (sample at full sensor rate seen by AP), 1: Sample post-filtering + + +ms +milliseconds +10 + + +1 + + + + + +Disabled +Enabled + + + +5 30 +dB +decibel + + +10 400 +Hz +hertz + + +5 100 +Hz +hertz + + + + + +None +File +MAVLink +File and MAVLink +Block +Block and MAVLink + +0:File,1:MAVLink,2:Block + + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +kB +kilobytes + + +s +seconds + + + + +0 32766 +1 +True + + + +Resume Mission +Restart Mission + + + +0:Clear Mission on reboot + + + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + +0 100 +1 + + +s +seconds +0.0 0.2 +.005 + + +s +seconds +0.0 0.2 +.005 + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + +True + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + +s +seconds +0.0 0.2 +.005 + + +s +seconds +0.0 0.2 +.005 + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + + + + + + +Normal +OneShot +OneShot125 +BrushedWithRelay +BrushedBiPolar +DShot150 +DShot300 +DShot600 +DShot1200 + +True + + +kHz +kilohertz +1 20 +1 +True + + + +PWM enabled while disarmed +PWM disabled while disarmed + + + +% +percent +0 20 +1 + + +% +percent +30 100 +1 + + +%/s +percent per second +0 1000 +1 + + +-1.0 1.0 + + +% +percent +0 100 + + +m/s +meters per second +0 10 + + + + +s +seconds +1 60 +1 + + +0.6 1.0 +0.05 + + +0 0.1 +0.01 + + +deg +degrees +0 89 + + + + + +Off +Low +Medium +High + + + + +Disable +Enable + + + + +Standard +MAVLink +OutbackChallenge +TrafficLight + + + + +Disable +ssd1306 +sh1106 +SITL + + + + +Disabled +Aircraft +Rover + + + + +Disabled + + + +0:Build in LED, 1:Internal ToshibaLED, 2:External ToshibaLED, 3:External PCA9685, 4:Oreo LED, 5:UAVCAN, 6:NCP5623 External, 7:NCP5623 Internal, 8:NeoPixel + + + +LowIsOn +HighIsOn + + + +0 100 +% +percent + + + + + +Disabled +BendyRuler +Dijkstra + + + +m +meters +1 100 +1 + + +m +meters +0.1 100 +1 + + + + +0 10000 +True + + +s +seconds +0 127 +1 + + +1 200 +True + + + +Disabled +Send only HIGH importance items +Send HIGH and NORMAL importance items +Send all items + + + + + + +None +MAX7456 + +True + + + +Disable +Chan5 +Chan6 +Chan7 +Chan8 +Chan9 +Chan10 +Chan11 +Chan12 +Chan13 +Chan14 +Chan15 +Chan16 + + + +0:UseDecimalPack, 1:InvertedWindPointer, 2:InvertedAHRoll + + +True + + +0 31 +True + + +0 63 +True + + +0 99 + + +1 30 + + +0 100 + + + +Metric +Imperial +SI +Aviation + + + +1 20 + + +0 4 + + +0 4 + + +0 4 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +Disabled +Enabled + + + +900 2100 + + +900 2100 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + +Disabled +Enabled + + + +0 29 + + +0 15 + + + + + +None +LightwareSF40c +LightWareSF40C-legacy +MAVLink +TeraRangerTower +RangeFinder +RPLidarA2 +TeraRangerTowerEvo +SITL +MorseSITL +AirSimSITL + +True + + + +Default +Upside Down + + + +deg +degrees +-180 180 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + + +None +LightwareSF40c +LightWareSF40C-legacy +MAVLink +TeraRangerTower +RangeFinder +RPLidarA2 +TeraRangerTowerEvo +SITL +MorseSITL +AirSimSITL + +True + + + +Default +Upside Down + + + +deg +degrees +-180 180 + + + + + + +km +kilometers +0.1 + + + +DoNotIncludeHome +IncludeHome + + + + + +0.0 120.0 +s +seconds + + +0:Ignore RC Receiver, 1:Ignore MAVLink Overrides, 2:Ignore Receiver Failsafe + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save Trim +Save WP +Camera Trigger +Fence +Auto +Gripper +Auto Mission Reset +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple Mode +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 +Sailboat motoring 3pos +KillIMU1 +KillIMU2 +MainSail + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save Trim +Save WP +Camera Trigger +Fence +Auto +Gripper +Auto Mission Reset +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple Mode +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 +Sailboat motoring 3pos +KillIMU1 +KillIMU2 +MainSail + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save Trim +Save WP +Camera Trigger +Fence +Auto +Gripper +Auto Mission Reset +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple Mode +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 +Sailboat motoring 3pos +KillIMU1 +KillIMU2 +MainSail + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save Trim +Save WP +Camera Trigger +Fence +Auto +Gripper +Auto Mission Reset +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple Mode +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 +Sailboat motoring 3pos +KillIMU1 +KillIMU2 +MainSail + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save Trim +Save WP +Camera Trigger +Fence +Auto +Gripper +Auto Mission Reset +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple Mode +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 +Sailboat motoring 3pos +KillIMU1 +KillIMU2 +MainSail + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save Trim +Save WP +Camera Trigger +Fence +Auto +Gripper +Auto Mission Reset +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple Mode +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 +Sailboat motoring 3pos +KillIMU1 +KillIMU2 +MainSail + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save Trim +Save WP +Camera Trigger +Fence +Auto +Gripper +Auto Mission Reset +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple Mode +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 +Sailboat motoring 3pos +KillIMU1 +KillIMU2 +MainSail + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save Trim +Save WP +Camera Trigger +Fence +Auto +Gripper +Auto Mission Reset +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple Mode +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 +Sailboat motoring 3pos +KillIMU1 +KillIMU2 +MainSail + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save Trim +Save WP +Camera Trigger +Fence +Auto +Gripper +Auto Mission Reset +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple Mode +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 +Sailboat motoring 3pos +KillIMU1 +KillIMU2 +MainSail + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save Trim +Save WP +Camera Trigger +Fence +Auto +Gripper +Auto Mission Reset +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple Mode +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 +Sailboat motoring 3pos +KillIMU1 +KillIMU2 +MainSail + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save Trim +Save WP +Camera Trigger +Fence +Auto +Gripper +Auto Mission Reset +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple Mode +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 +Sailboat motoring 3pos +KillIMU1 +KillIMU2 +MainSail + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save Trim +Save WP +Camera Trigger +Fence +Auto +Gripper +Auto Mission Reset +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple Mode +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 +Sailboat motoring 3pos +KillIMU1 +KillIMU2 +MainSail + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save Trim +Save WP +Camera Trigger +Fence +Auto +Gripper +Auto Mission Reset +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple Mode +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 +Sailboat motoring 3pos +KillIMU1 +KillIMU2 +MainSail + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save Trim +Save WP +Camera Trigger +Fence +Auto +Gripper +Auto Mission Reset +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple Mode +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 +Sailboat motoring 3pos +KillIMU1 +KillIMU2 +MainSail + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save Trim +Save WP +Camera Trigger +Fence +Auto +Gripper +Auto Mission Reset +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple Mode +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 +Sailboat motoring 3pos +KillIMU1 +KillIMU2 +MainSail + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +RTL +Save Trim +Save WP +Camera Trigger +Fence +Auto +Gripper +Auto Mission Reset +Relay On/Off +Lost Rover Sound +Motor Emergency Stop +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Proximity Avoidance +ArmDisarm +SmartRTL +RC Override Enable +LearnCruise +Manual +Acro +Steering +Hold +Guided +Loiter +Follow +Clear Waypoints +Simple Mode +Compass Learn +Sailboat Tack +GPS Disable +Relay5 +Relay6 +Sailboat motoring 3pos +KillIMU1 +KillIMU2 +MainSail + + + + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True +1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8 + + +1 8 +1 +True +1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8 + + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Off +On +NoChange + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini/Plus-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFmini/Plus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini/Plus-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFmini/Plus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini/Plus-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFmini/Plus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini/Plus-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFmini/Plus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini/Plus-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFmini/Plus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini/Plus-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFmini/Plus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini/Plus-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFmini/Plus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini/Plus-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFmini/Plus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini/Plus-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFmini/Plus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini/Plus-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFmini/Plus-I2C +BenewakeTF03 + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +PWM +AUXPIN + + + +0.001 + + +1 + + +1 + + +0.1 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +None +PWM +AUXPIN + + + +0.001 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + + + +Disabled +AnalogPin +RCChannelPwmValue +ReceiverProtocol +PWMInputPin + + + + +V5 Nano +Pixracer +Pixhawk ADC4 +Pixhawk ADC3 +Pixhawk ADC6 +Pixhawk2 ADC +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 +Pixhawk SBUS + + + +V +volt +0.01 +0 5.0 + + +V +volt +0.01 +0 5.0 + + +0 16 + + +PWM +PWM in microseconds +0 2000 + + +PWM +PWM in microseconds +0 2000 + + + + + +Disable +Enable + +True + + +deg +degrees +0 90 +1 + + +deg +degrees +0 90 +1 + + +deg +degrees +0 90 +1 + + +deg +degrees +0 90 +1 + + +deg +degrees +0 90 +1 + + +m/s +meters per second +0 5 +0.1 + + +m +meters +5 25 +1 + + +m +meters +0 20 +1 + + + + + +Disabled +ShowSlips +ShowOverruns + + + + +50Hz +100Hz +200Hz +250Hz +300Hz +400Hz + +True + + + + + +None +Lua Scripts + +True + + +1000 1000000 +10000 + + +1024 1048576 +1024 +True + + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +460800 +500000 +921600 +1500000 + + + + +MAVlink1 +MAVLink2 + +True + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + +0 120 +s +seconds + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + + + + +Disable +Enable + + + +25 400 +Hz +hertz + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +RateRoll +RatePitch +RateThrust +RateYaw + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +RateRoll +RatePitch +RateThrust +RateYaw + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +RateRoll +RatePitch +RateThrust +RateYaw + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +RateRoll +RatePitch +RateThrust +RateYaw + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +RateRoll +RatePitch +RateThrust +RateYaw + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +RateRoll +RatePitch +RateThrust +RateYaw + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +RateRoll +RatePitch +RateThrust +RateYaw + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +RateRoll +RatePitch +RateThrust +RateYaw + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +RateRoll +RatePitch +RateThrust +RateYaw + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +RateRoll +RatePitch +RateThrust +RateYaw + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +RateRoll +RatePitch +RateThrust +RateYaw + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +RateRoll +RatePitch +RateThrust +RateYaw + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +RateRoll +RatePitch +RateThrust +RateYaw + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +RateRoll +RatePitch +RateThrust +RateYaw + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +RateRoll +RatePitch +RateThrust +RateYaw + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 +RateRoll +RatePitch +RateThrust +RateYaw + + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + +Disabled +Enabled + + + + +Disabled +TestMotor1 +TestMotor2 +TestMotor3 +TestMotor4 +TestMotor5 +TestMotor6 +TestMotor7 +TestMotor8 + + + +s +seconds +0 300 + + +Hz +hertz +0 500 + + + +Disabled +Enabled + + + + +None +OneShot +OneShot125 +Brushed +DShot150 +DShot300 +DShot600 +DShot1200 + + + + +Console +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 + + + +1 127 + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + + +0 4095 + + +0 4095 + + + + +25 250 +Hz +hertz + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + + + +Disabled +Enabled + + + +0 15 + + + + + +Disabled +Enabled + + + +0 15 + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + + +Normal +Reverse + + + + + + +Disabled +Enabled + + + +deg +degrees +0.000001 +-90 90 + + +deg +degrees +0.000001 +-180 180 + + +cm +centimeters +1 +0 10000 + + +deg +degrees +1 +-180 +180 + + +Hz +hertz +0 200 + + + +cylinder +cone +sphere + + + +m +meters +0 100 + + +m +meters +5 100 + + + + + +Disabled +Enabled + + + +0 15 + + +0 15 + + + + + +Disabled +Enabled + + + +% +percent +0 100 + + +ms +milliseconds +1000 2000 + + +cm/s +centimeters per second +0 1000 + + +% +percent +0 100 + + + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 50 +1 + + + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 50 +1 + + + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 50 +1 + + + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 50 +1 + + + + +m +meters +0 10 + + +0 500 +True + + + + +True + + +s +seconds +True + + +s +seconds +True + + +s +seconds +True + + + + + +None +MAV + + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Right +Back +Left +Up +Down + + + + + + +None +Quadrature +SITL Quadrature + + + +1 + + +m +meters +0.001 + + +m +meters +0.01 + + +m +meters +0.01 + + +m +meters +0.01 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +None +Quadrature +SITL Quadrature + + + +1 + + +m +meters +0.001 + + +m +meters +0.01 + + +m +meters +0.01 + + +m +meters +0.01 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + + + +None +Heading when armed +RC input offset heading when armed +Analog +NMEA +SITL + +True + + +0 16 +1 + + + +Pixracer +Pixhawk ADC4 +Pixhawk ADC3 +Pixhawk ADC6 +Pixhawk2 ADC +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 +Pixhawk SBUS + + + +V +volt +0.01 +0 5.0 + + +V +volt +0.01 +0 5.0 + + +deg +degrees +1 +0 360 + + +Hz +hertz + + + +None +Calibrate direction +Calibrate speed + + + +deg +degrees +1 +0 360 + + +m/s +meters per second +0.1 +0 5 + + + +None +Airspeed library +Modern Devices Wind Sensor +RPM library +NMEA +SITL + +True + + + +Pixracer +Pixhawk ADC4 +Pixhawk ADC3 +Pixhawk ADC6 +Pixhawk2 ADC +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 +Pixhawk SBUS + + + + +Pixracer +Pixhawk ADC4 +Pixhawk ADC3 +Pixhawk ADC6 +Pixhawk2 ADC +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 +Pixhawk SBUS + + + +V +volt +0.01 +0 3.3 + + +Hz +hertz + + + + +m/s +meters per second +0 100 +0.1 + + +m +meters +0 100 +0.1 + + +m +meters +0 10 +0.1 + + +deg +degrees +0 360 +1 + + +deg/s +degrees per second +0 360 +1 + + +m/s +meters per second +0 100 +0.1 + + + + + +Disabled +Enabled + + + +rad/s +radians per second +0 200 + + +0.100 2.000 + + +0.100 2.000 + + +0.000 2.000 + + +0.000 1.000 + + +0.000 0.400 + + +1.000 100.000 +Hz +hertz + + +0.100 2.000 + + +0.100 2.000 + + +0.000 2.000 + + +0.000 1.000 + + +0.000 0.400 + + +1.000 100.000 +Hz +hertz + + + diff --git a/src/FirmwarePlugin/APM/APMParameterFactMetaData.Rover.4.2.xml b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Rover.4.1.xml similarity index 91% rename from src/FirmwarePlugin/APM/APMParameterFactMetaData.Rover.4.2.xml rename to src/FirmwarePlugin/APM/APMParameterFactMetaData.Rover.4.1.xml index 792f0a3..6339a43 100644 --- a/src/FirmwarePlugin/APM/APMParameterFactMetaData.Rover.4.2.xml +++ b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Rover.4.1.xml @@ -6,7 +6,7 @@ - 0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:THR,5:NTUN,7:IMU,8:CMD,9:CURRENT,10:RANGEFINDER,11:COMPASS,12:CAMERA,13:STEERING,14:RC,15:ARM/DISARM,19:IMU_RAW,20:VideoStabilization + 0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:THR,5:NTUN,7:IMU,8:CMD,9:CURRENT,10:RANGEFINDER,11:COMPASS,12:CAMERA,13:STEERING,14:RC,15:ARM/DISARM,19:IMU_RAW @@ -32,13 +32,12 @@ 1 255 - 0 30 - 1 s seconds + 0 30 + 1 - 0:Steering,1:Throttle,2:Pitch,3:Left Wheel,4:Right Wheel,5:Sailboat Heel None Steering @@ -48,6 +47,7 @@ Right Wheel Sailboat Heel + 0:Steering,1:Throttle,2:Pitch,3:Left Wheel,4:Right Wheel,5:Sailboat Heel @@ -61,33 +61,33 @@ APM TriggerPin6 APM TriggerPin7 APM TriggerPin8 - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk TriggerPin50 + Pixhawk TriggerPin51 + Pixhawk TriggerPin52 + Pixhawk TriggerPin53 + Pixhawk TriggerPin54 + Pixhawk TriggerPin55 - 0 20 - 0.1 m/s/s meters per square second + 0 20 + 0.1 - 0 100 - 0.1 m/s meters per second + 0 100 + 0.1 - 0 100 - 1 % percent + 0 100 + 1 - + Default Two Paddles Input @@ -105,10 +105,10 @@ - 1 100 - 0.5 s seconds + 1 100 + 0.5 @@ -143,11 +143,7 @@ - - Strict - Default - Relaxed - + 0.6:Strict,0.8:Default,1.0:Relaxed @@ -248,22 +244,22 @@ - 0 10 - 0.1 m meters + 0 10 + 0.1 - 0 360 - 1 deg/s degrees per second + 0 360 + 1 - 0 100 - 0.1 m/s meters per second + 0 100 + 0.1 @@ -274,16 +270,16 @@ + deg + degrees 0 5 0.1 - deg - degrees - 0 60 - 1 deg degrees + 0 60 + 1 @@ -309,10 +305,10 @@ True - 0 20 - 1 m meters + 0 20 + 1 @@ -323,10 +319,10 @@ - -2 2 - 0.1 deg degrees + -2 2 + 0.1 @@ -335,21 +331,21 @@ - 0 30 - 0.1 m/s meters per second + 0 30 + 0.1 0 5 0.01 - 0:Failsafe enabled in Hold mode None Failsafe enabled in Hold mode + 0:Failsafe enabled in Hold mode @@ -371,16 +367,16 @@ - 0 360 - 1 deg degrees - - 0 360 1 + + deg/s degrees per second + 0 360 + 1 @@ -466,11 +462,10 @@ 0.0 1.0 .01 - + Disabled - Use GPS for DCM position - Use GPS for DCM position and height + Enabled @@ -483,29 +478,29 @@ 0 127 - 1 m/s meters per second + 1 - -0.1745 +0.1745 - 0.01 rad radians + -0.1745 +0.1745 + 0.01 - -0.1745 +0.1745 - 0.01 rad radians + -0.1745 +0.1745 + 0.01 - -0.1745 +0.1745 - 0.01 rad radians + -0.1745 +0.1745 + 0.01 - + None Yaw45 @@ -516,40 +511,38 @@ Yaw270 Yaw315 Roll180 - Yaw45Roll180 - Yaw90Roll180 - Yaw135Roll180 + Roll180Yaw45 + Roll180Yaw90 + Roll180Yaw135 Pitch180 - Yaw225Roll180 - Yaw270Roll180 - Yaw315Roll180 + Roll180Yaw225 + Roll180Yaw270 + Roll180Yaw315 Roll90 - Yaw45Roll90 - Yaw90Roll90 - Yaw135Roll90 + Roll90Yaw45 + Roll90Yaw90 + Roll90Yaw135 Roll270 - Yaw45Roll270 - Yaw90Roll270 - Yaw135Roll270 + Roll270Yaw45 + Roll270Yaw90 + Roll270Yaw135 Pitch90 Pitch270 - Yaw90Pitch180 - Yaw270Pitch180 - Pitch90Roll90 - Pitch90Roll180 - Pitch90Roll270 - Pitch180Roll90 - Pitch180Roll270 - Pitch270Roll90 - Pitch270Roll180 - Pitch270Roll270 - Yaw90Pitch180Roll90 - Yaw270Roll90 + Pitch180Yaw90 + Pitch180Yaw270 + Roll90Pitch90 + Roll180Pitch90 + Roll270Pitch90 + Roll90Pitch180 + Roll270Pitch180 + Roll90Pitch270 + Roll180Pitch270 + Roll270Pitch270 + Roll90Pitch180Yaw90 + Roll90Yaw270 Yaw293Pitch68Roll180 Pitch315 - Pitch315Roll90 - Roll45 - Roll315 + Roll90Pitch315 Custom @@ -571,41 +564,21 @@ -180 180 - 1 deg degrees + 1 -180 180 - 1 deg degrees + 1 -180 180 - 1 deg degrees - - - - - - None - NMEA AIVDM message - - True - - - 1 100 - - - 1 2000 - s - seconds - - - 0:Log all AIVDM messages,1:Log only unsupported AIVDM messages,2:Log decoded messages + 1 @@ -617,9 +590,9 @@ - 0.25 3.0 m/s/s meters per square second + 0.25 3.0 @@ -646,7 +619,7 @@ I2C-MS5525 (0x77) I2C-SDP3X I2C-DLVR-5in - DroneCAN + UAVCAN I2C-DLVR-10in I2C-DLVR-20in I2C-DLVR-30in @@ -656,9 +629,6 @@ ASP5033 - - True - DoNotUse @@ -676,13 +646,8 @@ - - - Normal - Swapped - Auto Detect - - + + Disable @@ -704,8 +669,8 @@ 2ndSensor - - 0:SpeedMismatchDisable, 1:AllowSpeedMismatchRecovery, 2:DisableVoltageCorrection + + 0:Disable sensor, 1:Re-enable sensor m/s @@ -725,7 +690,7 @@ I2C-MS5525 (0x77) I2C-SDP3X I2C-DLVR-5in - DroneCAN + UAVCAN I2C-DLVR-10in I2C-DLVR-20in I2C-DLVR-30in @@ -752,13 +717,8 @@ - - - Normal - Swapped - Auto Detect - - + + Disable @@ -774,9 +734,6 @@ Bus2(auxillary) - - True - @@ -1016,10 +973,10 @@ 0.5 - 0.1 10 - 0.01 gravities standard acceleration due to gravity + 0.1 10 + 0.01 @@ -1027,44 +984,44 @@ 0:UseFence,1:UseProximitySensor,2:UseBeaconFence - 1 10 m meters + 1 10 - 0 2 m/s meters per second + 0 2 - 0 9 m/s/s meters per square second + 0 9 - 0 2 m meters + 0 2 - True - True - 1 Pa pascal + 1 + True + True - True - 1 degC degrees Celsius + 1 + True - 0.1 m meters + 0.1 @@ -1081,30 +1038,27 @@ - - Freshwater - Saltwater - + 1.0:Freshwater,1.024:Saltwater - True - True - 1 Pa pascal + 1 + True + True - True - True - 1 Pa pascal + 1 + True + True - 0 100 - 1 % percent + 0 100 + 1 0:BMP085,1:BMP280,2:MS5611,3:MS5607,4:MS5637,5:FBM320,6:DPS280,7:LPS25H,8:Keller,9:MS5837,10:BMP388,11:SPL06,12:MSP @@ -1200,9 +1154,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -1212,85 +1166,9 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - RTL - Hold - SmartRTL - SmartRTL or Hold - Terminate - - - - - None - RTL - Hold - SmartRTL - SmartRTL or Hold - Terminate - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled @@ -1325,23 +1203,80 @@ V volt - + + mAh + milliampere hour + 50 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + RTL + Hold + SmartRTL + SmartRTL or Hold + Terminate + + + + + None + RTL + Hold + SmartRTL + SmartRTL or Hold + Terminate + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -1353,9 +1288,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -1365,85 +1300,9 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - RTL - Hold - SmartRTL - SmartRTL or Hold - Terminate - - - - - None - RTL - Hold - SmartRTL - SmartRTL or Hold - Terminate - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled @@ -1478,23 +1337,80 @@ V volt - + + mAh + milliampere hour + 50 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + RTL + Hold + SmartRTL + SmartRTL or Hold + Terminate + + + + + None + RTL + Hold + SmartRTL + SmartRTL or Hold + Terminate + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -1506,9 +1422,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -1518,85 +1434,9 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - RTL - Hold - SmartRTL - SmartRTL or Hold - Terminate - - - - - None - RTL - Hold - SmartRTL - SmartRTL or Hold - Terminate - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled @@ -1631,23 +1471,80 @@ V volt - + + mAh + milliampere hour + 50 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + RTL + Hold + SmartRTL + SmartRTL or Hold + Terminate + + + + + None + RTL + Hold + SmartRTL + SmartRTL or Hold + Terminate + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -1659,9 +1556,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -1671,85 +1568,9 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - RTL - Hold - SmartRTL - SmartRTL or Hold - Terminate - - - - - None - RTL - Hold - SmartRTL - SmartRTL or Hold - Terminate - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled @@ -1784,23 +1605,80 @@ V volt - + + mAh + milliampere hour + 50 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + RTL + Hold + SmartRTL + SmartRTL or Hold + Terminate + + + + + None + RTL + Hold + SmartRTL + SmartRTL or Hold + Terminate + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -1812,9 +1690,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -1824,85 +1702,9 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - RTL - Hold - SmartRTL - SmartRTL or Hold - Terminate - - - - - None - RTL - Hold - SmartRTL - SmartRTL or Hold - Terminate - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled @@ -1937,23 +1739,80 @@ V volt - + + mAh + milliampere hour + 50 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + RTL + Hold + SmartRTL + SmartRTL or Hold + Terminate + + + + + None + RTL + Hold + SmartRTL + SmartRTL or Hold + Terminate + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -1965,9 +1824,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -1977,85 +1836,9 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - RTL - Hold - SmartRTL - SmartRTL or Hold - Terminate - - - - - None - RTL - Hold - SmartRTL - SmartRTL or Hold - Terminate - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled @@ -2090,23 +1873,80 @@ V volt - + + mAh + milliampere hour + 50 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + RTL + Hold + SmartRTL + SmartRTL or Hold + Terminate + + + + + None + RTL + Hold + SmartRTL + SmartRTL or Hold + Terminate + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -2118,9 +1958,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -2130,85 +1970,9 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - RTL - Hold - SmartRTL - SmartRTL or Hold - Terminate - - - - - None - RTL - Hold - SmartRTL - SmartRTL or Hold - Terminate - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled @@ -2243,23 +2007,80 @@ V volt - + + mAh + milliampere hour + 50 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + RTL + Hold + SmartRTL + SmartRTL or Hold + Terminate + + + + + None + RTL + Hold + SmartRTL + SmartRTL or Hold + Terminate + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -2271,9 +2092,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -2283,85 +2104,9 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - RTL - Hold - SmartRTL - SmartRTL or Hold - Terminate - - - - - None - RTL - Hold - SmartRTL - SmartRTL or Hold - Terminate - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled @@ -2396,23 +2141,80 @@ V volt - + + mAh + milliampere hour + 50 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + RTL + Hold + SmartRTL + SmartRTL or Hold + Terminate + + + + + None + RTL + Hold + SmartRTL + SmartRTL or Hold + Terminate + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -2424,9 +2226,9 @@ Solo Bebop SMBus-Generic - DroneCAN-BatteryInfo + UAVCAN-BatteryInfo ESC - Sum Of Selected Monitors + SumOfFollowing FuelFlow FuelLevelPWM SMBUS-SUI3 @@ -2436,85 +2238,9 @@ Generator-Elec Generator-Fuel Rotoye - MPPT - INA2XX - LTC2946 - Torqeedo True - - 50 - mAh - milliampere hour - - - - - 0 120 - 1 - s - seconds - - - - Raw Voltage - Sag Compensated Voltage - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - - None - RTL - Hold - SmartRTL - SmartRTL or Hold - Terminate - - - - - None - RTL - Hold - SmartRTL - SmartRTL or Hold - Terminate - - - - 0.1 - V - volt - - - 50 - mAh - milliampere hour - - - 0:Ignore DroneCAN SoC, 1:MPPT reports input voltage and current, 2:MPPT Powered off when disarmed, 3:MPPT Powered on when armed, 4:MPPT Powered off at boot, 5:MPPT Powered on at boot, 6:Send resistance compensated voltage to GCS - Disabled @@ -2549,23 +2275,80 @@ V volt - + + mAh + milliampere hour + 50 + + + + + s + seconds + 1 + 0 120 + + + + Raw Voltage + Sag Compensated Voltage + + + V volt + 0.1 - + + mAh + milliampere hour + 50 + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + + + None + RTL + Hold + SmartRTL + SmartRTL or Hold + Terminate + + + + + None + RTL + Hold + SmartRTL + SmartRTL or Hold + Terminate + + + + V + volt + 0.1 + + + mAh + milliampere hour + 50 + + 0 3 - True - - 0 127 - True - - - 0:monitor 1, 1:monitor 2, 2:monitor 3, 3:monitor 4, 4:monitor 5, 5:monitor 6, 6:monitor 7, 7:monitor 8, 8:monitor 9 - - - .1 10 + + 0:Ignore UAVCAN SoC @@ -2579,32 +2362,46 @@ - -90 90 - 0.000001 deg degrees + 0.000001 + -90 90 - -180 180 - 0.000001 deg degrees + 0.000001 + -180 180 - 0 10000 - 1 m meters + 1 + 0 10000 - -180 +180 - 1 deg degrees + 1 + -180 +180 - + + + No PWMs + One PWMs + Two PWMs + Three PWMs + Four PWMs + Five PWMs + Six PWMs + Seven PWMs + Eight PWMs + + True + + Disabled Enabled @@ -2612,7 +2409,7 @@ True - + Disabled Enabled @@ -2671,7 +2468,7 @@ 0:Output1,1:Output2,2:Output3,3:Output4,4:Output5,5:Output6,6:Output7,7:Output8,8:Output9,9:Output10,10:Output11,11:Output12,12:Output13,13:Output14 True - + -1 80 degC degrees Celsius @@ -2715,16 +2512,16 @@ 0:ActiveForSafetyEnable,1:ActiveForSafetyDisable,2:ActiveWhenArmed,3:Force safety on when the aircraft disarms + V + volt 4.0 5.5 0.1 - V - volt - 3.3 12.0 - 0.1 V volt + 3.3 12.0 + 0.1 0 32 @@ -2737,22 +2534,22 @@ - 0:Enable hardware watchdog, 1:Disable MAVftp, 2:Enable set of internal parameters, 3:Enable Debug Pins, 4:Unlock flash on reboot, 5:Write protect firmware flash on reboot, 6:Write protect bootloader flash on reboot + 0:Enable hardware watchdog, 1:Disable MAVftp, 2:Enable set of internal parameters, 3:Enable Debug Pins 0 10000 ms milliseconds - + 1 500 1 - + 0 1 0.1 - + 0 100 1 @@ -2761,11 +2558,6 @@ 1 True - - 0 20 - degC - degrees Celsius - @@ -2934,7 +2726,7 @@ Do Nothing RTL - Save Trim (4.1 and lower) + Save Trim Save WP Camera Trigger Fence @@ -2949,7 +2741,7 @@ Relay3 On/Off Relay4 On/Off Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL RC Override Enable LearnCruise @@ -2965,29 +2757,23 @@ Compass Learn Sailboat Tack GPS Disable - Relay5 On/Off - Relay6 On/Off + Relay5 + Relay6 Sailboat motoring 3pos RunCam Control RunCam OSD Control Viso Align Disarm EKF Pos Source - VTX Power - Windvane home heading direction offset KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Disable Airspeed Use - ArmDisarm (4.2 and higher) - set steering trim to current servo and RC - Torqeedo Clear Err Roll Pitch + Walking Height MainSail Flap - Walking Height Scripting1 Scripting2 Scripting3 @@ -3002,7 +2788,7 @@ Do Nothing RTL - Save Trim (4.1 and lower) + Save Trim Save WP Camera Trigger Fence @@ -3017,7 +2803,7 @@ Relay3 On/Off Relay4 On/Off Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL RC Override Enable LearnCruise @@ -3033,29 +2819,23 @@ Compass Learn Sailboat Tack GPS Disable - Relay5 On/Off - Relay6 On/Off + Relay5 + Relay6 Sailboat motoring 3pos RunCam Control RunCam OSD Control Viso Align Disarm EKF Pos Source - VTX Power - Windvane home heading direction offset KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Disable Airspeed Use - ArmDisarm (4.2 and higher) - set steering trim to current servo and RC - Torqeedo Clear Err Roll Pitch + Walking Height MainSail Flap - Walking Height Scripting1 Scripting2 Scripting3 @@ -3070,7 +2850,7 @@ Do Nothing RTL - Save Trim (4.1 and lower) + Save Trim Save WP Camera Trigger Fence @@ -3085,7 +2865,7 @@ Relay3 On/Off Relay4 On/Off Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL RC Override Enable LearnCruise @@ -3101,29 +2881,23 @@ Compass Learn Sailboat Tack GPS Disable - Relay5 On/Off - Relay6 On/Off + Relay5 + Relay6 Sailboat motoring 3pos RunCam Control RunCam OSD Control Viso Align Disarm EKF Pos Source - VTX Power - Windvane home heading direction offset KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Disable Airspeed Use - ArmDisarm (4.2 and higher) - set steering trim to current servo and RC - Torqeedo Clear Err Roll Pitch + Walking Height MainSail Flap - Walking Height Scripting1 Scripting2 Scripting3 @@ -3138,7 +2912,7 @@ Do Nothing RTL - Save Trim (4.1 and lower) + Save Trim Save WP Camera Trigger Fence @@ -3153,7 +2927,7 @@ Relay3 On/Off Relay4 On/Off Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL RC Override Enable LearnCruise @@ -3169,29 +2943,23 @@ Compass Learn Sailboat Tack GPS Disable - Relay5 On/Off - Relay6 On/Off + Relay5 + Relay6 Sailboat motoring 3pos RunCam Control RunCam OSD Control Viso Align Disarm EKF Pos Source - VTX Power - Windvane home heading direction offset KillIMU1 KillIMU2 Camera Mode Toggle GPS Disable Yaw - Disable Airspeed Use - ArmDisarm (4.2 and higher) - set steering trim to current servo and RC - Torqeedo Clear Err Roll Pitch + Walking Height MainSail Flap - Walking Height Scripting1 Scripting2 Scripting3 @@ -3212,24 +2980,24 @@ - 0 50 ds deciseconds + 0 50 - 1000 2000 PWM PWM in microseconds + 1000 2000 - 1000 2000 PWM PWM in microseconds + 1000 2000 - 0 1000 m meters + 0 1000 @@ -3238,14 +3006,14 @@ - 0 10000 ms milliseconds + 0 10000 - 0 180 deg degrees + 0 180 @@ -3317,15 +3085,12 @@ Disabled - DroneCAN + UAVCAN ToshibaCAN PiccoloCAN CANTester - EFI_NWPMU - USD1 KDECAN - Scripting - Benewake + PacketDigitalCAN True @@ -3339,17 +3104,17 @@ 0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 - 1 500 Hz hertz + 1 500 0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15, 15: Servo 16 - 1 500 Hz hertz + 1 500 @@ -3374,10 +3139,10 @@ 1 250 - + 0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 - + 0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 @@ -3388,31 +3153,17 @@ 0:ClearDNADatabase,1:IgnoreDNANodeConflicts - - 1 200 - Hz - hertz - - - 0 18 - - - 1024 16384 - Disabled - DroneCAN + UAVCAN ToshibaCAN PiccoloCAN CANTester - EFI_NWPMU - USD1 KDECAN - Scripting - Benewake + PacketDigitalCAN True @@ -3426,17 +3177,17 @@ 0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 - 1 500 Hz hertz + 1 500 0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15, 15: Servo 16 - 1 500 Hz hertz + 1 500 @@ -3461,10 +3212,10 @@ 1 250 - + 0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 - + 0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 @@ -3475,31 +3226,17 @@ 0:ClearDNADatabase,1:IgnoreDNANodeConflicts - - 1 200 - Hz - hertz - - - 0 18 - - - 1024 16384 - Disabled - DroneCAN + UAVCAN ToshibaCAN PiccoloCAN CANTester - EFI_NWPMU - USD1 KDECAN - Scripting - Benewake + PacketDigitalCAN True @@ -3513,17 +3250,17 @@ 0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 - 1 500 Hz hertz + 1 500 0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15, 15: Servo 16 - 1 500 Hz hertz + 1 500 @@ -3548,10 +3285,10 @@ 1 250 - + 0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 - + 0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 @@ -3562,17 +3299,6 @@ 0:ClearDNADatabase,1:IgnoreDNANodeConflicts - - 1 200 - Hz - hertz - - - 0 18 - - - 1024 16384 - @@ -3580,7 +3306,6 @@ Disabled First driver Second driver - Third driver True @@ -3594,7 +3319,6 @@ Disabled First driver Second driver - Third driver True @@ -3608,7 +3332,6 @@ Disabled First driver Second driver - Third driver True @@ -3646,30 +3369,30 @@ - 1 -400 400 - 1 mGauss milligauss + 1 + 1 - 1 -400 400 - 1 mGauss milligauss + 1 + 1 -400 400 - 1 mGauss milligauss + 1 -3.142 3.142 - 0.01 rad radians + 0.01 @@ -3692,34 +3415,34 @@ - 1 Disabled Use Throttle Use Current + 1 - 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 + 1 - 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 + 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 - + None Yaw45 @@ -3730,44 +3453,42 @@ Yaw270 Yaw315 Roll180 - Yaw45Roll180 - Yaw90Roll180 - Yaw135Roll180 + Roll180Yaw45 + Roll180Yaw90 + Roll180Yaw135 Pitch180 - Yaw225Roll180 - Yaw270Roll180 - Yaw315Roll180 + Roll180Yaw225 + Roll180Yaw270 + Roll180Yaw315 Roll90 - Yaw45Roll90 - Yaw90Roll90 - Yaw135Roll90 + Roll90Yaw45 + Roll90Yaw90 + Roll90Yaw135 Roll270 - Yaw45Roll270 - Yaw90Roll270 - Yaw135Roll270 + Roll270Yaw45 + Roll270Yaw90 + Roll270Yaw135 Pitch90 Pitch270 - Yaw90Pitch180 - Yaw270Pitch180 - Pitch90Roll90 - Pitch90Roll180 - Pitch90Roll270 - Pitch180Roll90 - Pitch180Roll270 - Pitch270Roll90 - Pitch270Roll180 - Pitch270Roll270 - Yaw90Pitch180Roll90 - Yaw270Roll90 + Pitch180Yaw90 + Pitch180Yaw270 + Roll90Pitch90 + Roll180Pitch90 + Roll270Pitch90 + Roll90Pitch180 + Roll270Pitch180 + Roll90Pitch270 + Roll180Pitch270 + Roll270Pitch270 + Roll90Pitch180Yaw90 + Roll90Yaw270 Yaw293Pitch68Roll180 Pitch315 - Pitch315Roll90 - Roll45 - Roll315 + Roll90Pitch315 Custom - + Internal External @@ -3775,84 +3496,84 @@ - 1 -400 400 - 1 mGauss milligauss + 1 + 1 - 1 -400 400 - 1 mGauss milligauss + 1 + 1 -400 400 - 1 mGauss milligauss + 1 - 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 + 1 - 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 + 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 - 1 -400 400 - 1 mGauss milligauss + 1 + 1 - 1 -400 400 - 1 mGauss milligauss + 1 + 1 -400 400 - 1 mGauss milligauss + 1 - 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 + 1 - 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 + 1 -1000 1000 - 1 mGauss/A milligauss per ampere + 1 True @@ -3912,12 +3633,10 @@ Yaw293Pitch68Roll180 Pitch315 Roll90Pitch315 - Roll45 - Roll315 Custom - + Internal External @@ -3973,12 +3692,10 @@ Yaw293Pitch68Roll180 Pitch315 Roll90Pitch315 - Roll45 - Roll315 Custom - + Internal External @@ -4048,20 +3765,19 @@ 1 - 0:HMC5883,1:LSM303D,2:AK8963,3:BMM150,4:LSM9DS1,5:LIS3MDL,6:AK09916,7:IST8310,8:ICM20948,9:MMC3416,11:DroneCAN,12:QMC5883,14:MAG3110,15:IST8308,16:RM3100,17:MSP,18:ExternalAHRS + 0:HMC5883,1:LSM303D,2:AK8963,3:BMM150,4:LSM9DS1,5:LIS3MDL,6:AK09916,7:IST8310,8:ICM20948,9:MMC3416,11:UAVCAN,12:QMC5883,14:MAG3110,15:IST8308,16:RM3100,17:MSP,18:ExternalAHRS - 0 100 - 1 % percent + 0 100 + 1 Disabled CheckOnly CheckAndFix - use same tolerance to auto rotate 45 deg rotations @@ -4078,7 +3794,6 @@ Disabled Enabled - True 0 1.3 @@ -4109,23 +3824,23 @@ -180 180 - 1 deg degrees + 1 True -180 180 - 1 deg degrees + 1 True -180 180 - 1 deg degrees + 1 True @@ -4165,46 +3880,11 @@ - - - - Disabled - Enabled - - - - - Disabled - Serial0 - Serial1 - Serial2 - Serial3 - Serial4 - Serial5 - Serial6 - - - - - Disabled - Driver1 - Driver2 - - - - 0:EnforceArming - - - m - meters - - None VectorNav - LORD @@ -4212,23 +3892,6 @@ hertz - - - - None - Serial-MS - NWPMU - Serial-Lutan - - True - - - 0 1 - - - 0 10 - - @@ -4257,7 +3920,7 @@ m/s meters per second - + 100 1000 25 @@ -4503,16 +4166,17 @@ 0.1 30.0 Hz hertz + False - + 0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF True - + 0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF True - + 1 10 1 True @@ -4538,7 +4202,7 @@ m/s meters per second - + 100 1000 25 @@ -4571,9 +4235,9 @@ 0 250 10 + True ms milliseconds - True 0.01 0.5 @@ -4636,9 +4300,9 @@ 0 250 10 + True ms milliseconds - True 0.0001 0.1 @@ -4742,9 +4406,9 @@ 0 250 10 + True ms milliseconds - True 2.0 6.0 @@ -4796,21 +4460,22 @@ 0.1 30.0 Hz hertz + False 0 500 mGauss milligauss - + 0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF True - + 0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF True - + 1 10 1 True @@ -5021,14 +4686,14 @@ - 30 10000 m meters + 30 10000 - 1 10 m meters + 1 10 1 20 @@ -5105,9 +4770,9 @@ 0 255 - 1 1000 m meters + 1 1000 @@ -5117,21 +4782,21 @@ -100 100 - 1 m meters + 1 -100 100 - 1 m meters + 1 -100 100 - 1 m meters + 1 @@ -5254,9 +4919,6 @@ 27 - - 0:EnableAirspeedAndGroundspeed - @@ -5275,11 +4937,13 @@ None AUTO uBlox + MTK + MTK19 NMEA SiRF HIL SwiftNav - DroneCAN + UAVCAN SBF GSOF ERB @@ -5291,8 +4955,6 @@ MSP AllyStar ExternalAHRS - DroneCAN-MovingBaseline-Base - DroneCAN-MovingBaseline-Rover True @@ -5301,11 +4963,13 @@ None AUTO uBlox + MTK + MTK19 NMEA SiRF HIL SwiftNav - DroneCAN + UAVCAN SBF GSOF ERB @@ -5317,8 +4981,6 @@ MSP AllyStar ExternalAHRS - DroneCAN-MovingBaseline-Base - DroneCAN-MovingBaseline-Rover True @@ -5401,88 +5063,87 @@ Disables automatic configuration - Enable automatic configuration for Serial GPSes only - Enable automatic configuration for DroneCAN as well + Enable automatic configuration - 50 200 + ms + milliseconds 10Hz 8Hz 5Hz - ms - milliseconds + 50 200 - 50 200 + ms + milliseconds 10Hz 8Hz 5Hz - ms - milliseconds + 50 200 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - 0 250 ms milliseconds + 0 250 True - 0 250 ms milliseconds + 0 250 True 0:Horiz Pos,1:Vert Pos,2:Speed - 5.0 30.0 s seconds + 5.0 30.0 - 0:Use UART2 for moving baseline on ublox,1:Use base station for GPS yaw on SBF,2:Use baudrate 115200,3:Use dedicated CAN port b/w GPSes for moving baseline + 0:Use UART2 for moving baseline on ublox,1:Use base station for GPS yaw on SBF,2:Use baudrate 115200 0 10 @@ -5495,11 +5156,11 @@ True + 1 FirstGPS SecondGPS - 1 True @@ -5507,9 +5168,9 @@ True - + - + @@ -5521,22 +5182,22 @@ True - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -5548,22 +5209,22 @@ True - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -5600,155 +5261,155 @@ s seconds - + 0 255 - 1 rad/s radians per second + 1 - 1 rad/s radians per second + 1 - 1 rad/s radians per second + 1 - 1 rad/s radians per second + 1 - 1 rad/s radians per second + 1 - 1 rad/s radians per second + 1 - 1 rad/s radians per second + 1 - 1 rad/s radians per second + 1 - 1 rad/s radians per second + 1 - 1 0.8 1.2 + 1 - 1 0.8 1.2 + 1 - 1 0.8 1.2 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 1 0.8 1.2 + 1 - 1 0.8 1.2 + 1 - 1 0.8 1.2 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 1 0.8 1.2 + 1 - 1 0.8 1.2 + 1 - 1 0.8 1.2 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 1 - -3.5 3.5 m/s/s meters per square second + -3.5 3.5 + 1 - 0 256 Hz hertz + 0 256 - 0 256 Hz hertz + 0 256 @@ -5792,57 +5453,57 @@ - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -10 10 m meters + -10 10 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 True @@ -5866,7 +5527,7 @@ 0:FirstIMU,1:SecondIMU,2:ThirdIMU - 0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU,6:SeventhIMU + 0:FirstIMU,1:SecondIMU,2:ThirdIMU @@ -5878,85 +5539,39 @@ True - 1 degC degrees Celsius + 1 - 1 degC degrees Celsius + 1 - 1 degC degrees Celsius + 1 - 1 degC degrees Celsius + 1 - 1 degC degrees Celsius + 1 - 1 degC degrees Celsius + 1 0:PersistParams - - - - Disabled - Enabled - - - - 10 495 - Hz - hertz - - - 5 250 - Hz - hertz - - - 5 50 - dB - decibel - - - 0:1st harmonic,1:2nd harmonic,2:3rd harmonic,3:4th hamronic,4:5th harmonic,5:6th harmonic,6:7th harmonic,7:8th harmonic - True - - - 0.0 1.0 - True - - - 0 4 - - Disabled - Throttle - RPM Sensor - ESC Telemetry - Dynamic FFT - Second RPM Sensor - - - - 0:Double notch,1:Dynamic harmonic,2:Update at loop rate - True - - @@ -5979,7 +5594,7 @@ dB decibel - + 0:1st harmonic,1:2nd harmonic,2:3rd harmonic,3:4th hamronic,4:5th harmonic,5:6th harmonic,6:7th harmonic,7:8th harmonic True @@ -5995,7 +5610,6 @@ RPM Sensor ESC Telemetry Dynamic FFT - Second RPM Sensor @@ -6016,14 +5630,37 @@ 0:Sensor-Rate Logging (sample at full sensor rate seen by AP), 1: Sample post-filtering - 10 ms milliseconds + 10 1 + + + + Disabled + Enabled + + + + 5 30 + dB + decibel + + + 10 400 + Hz + hertz + + + 5 100 + Hz + hertz + + @@ -6034,16 +5671,16 @@ True - 1 -70 80 degC degrees Celsius + 1 - 1 -70 80 degC degrees Celsius + 1 1 @@ -6110,16 +5747,16 @@ True - 1 -70 80 degC degrees Celsius + 1 - 1 -70 80 degC degrees Celsius + 1 1 @@ -6186,16 +5823,16 @@ True - 1 -70 80 degC degrees Celsius + 1 - 1 -70 80 degC degrees Celsius + 1 1 @@ -6285,31 +5922,16 @@ seconds - 10 1000 MB megabyte - - - 0 1000 - Hz - hertz - - - 0 1000 - Hz - hertz - - - 0 1000 - Hz - hertz + 10 1000 - True 0 32766 1 + True @@ -6343,40 +5965,40 @@ - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 @@ -6410,16 +6032,16 @@ - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 @@ -6435,16 +6057,16 @@ - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 @@ -6460,32 +6082,32 @@ - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 0 100 1 - 0.0 0.2 - .005 s seconds + 0.0 0.2 + .005 - 0.0 0.2 - .005 s seconds + 0.0 0.2 + .005 @@ -6497,40 +6119,40 @@ - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 - -180.00 179.99 - 1 deg degrees + -180.00 179.99 + 1 @@ -6564,16 +6186,16 @@ - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 @@ -6589,16 +6211,16 @@ - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 @@ -6614,28 +6236,28 @@ - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 - -18000 17999 - 10 cdeg centidegrees + -18000 17999 + 10 - 0.0 0.2 - .005 s seconds + 0.0 0.2 + .005 - 0.0 0.2 - .005 s seconds + 0.0 0.2 + .005 @@ -6664,10 +6286,10 @@ True - 1 20 - 1 kHz kilohertz + 1 20 + 1 True @@ -6677,38 +6299,38 @@ + % + percent 0 20 1 - % - percent - 30 100 - 1 % percent + 30 100 + 1 - 0 1000 - 1 %/s percent per second + 0 1000 + 1 -1.0 1.0 - 0 10 m/s meters per second + 0 10 0.2 1.0 - 0 90 deg degrees + 0 90 @@ -6732,15 +6354,15 @@ - 0:EnableTelemetryMode, 1: DisableDJIWorkarounds, 2:EnableBTFLFonts + 0:EnableTelemetryMode - 1 60 - 1 s seconds + 1 60 + 1 0.6 1.0 @@ -6751,9 +6373,9 @@ 0.01 - 0 89 deg degrees + 0 89 @@ -6766,7 +6388,7 @@ - 0:Built-in buzzer, 1:DShot, 2:DroneCAN + 0:Built-in buzzer, 1:DShot, 2:UAVCAN @@ -6797,7 +6419,7 @@ - 0:Built-in LED, 1:Internal ToshibaLED, 2:External ToshibaLED, 3:External PCA9685, 4:Oreo LED, 5:DroneCAN, 6:NCP5623 External, 7:NCP5623 Internal, 8:NeoPixel, 9:ProfiLED, 10:Scripting, 11:DShot, 12:ProfiLED_SPI + 0:Built-in LED, 1:Internal ToshibaLED, 2:External ToshibaLED, 3:External PCA9685, 4:Oreo LED, 5:UAVCAN, 6:NCP5623 External, 7:NCP5623 Internal, 8:NeoPixel, 9:ProfiLED, 10:Scripting, 11:DShot @@ -6825,21 +6447,21 @@ - 0.1 100 - 1 m meters + 0.1 100 + 1 - 0: Reset the origin of the waypoint to the present location, 1: log Dijkstra points + 0: Reset the origin of the waypoint to the present location - 1 100 - 1 m meters + 1 100 + 1 1.1 2 @@ -6856,10 +6478,10 @@ True - 0 127 - 1 s seconds + 0 127 + 1 1 200 @@ -6874,20 +6496,20 @@ - 1 10 deg degrees + 1 10 True - 0 10 m meters + 0 10 - 0 10 m meters + 0 10 @@ -6926,7 +6548,7 @@ - 0:UseDecimalPack, 1:InvertedWindPointer, 2:InvertedAHRoll, 3:Convert feet to miles at 5280ft instead of 10000ft, 4:DisableCrosshair + 0:UseDecimalPack, 1:InvertedWindPointer, 2:InvertedAHRoll True @@ -7203,40 +6825,40 @@ 0 15 - + Disabled Enabled - + 0 29 - + 0 15 - + Disabled Enabled - + 0 29 - + 0 15 - + Disabled Enabled - + 0 29 - + 0 15 @@ -7479,16 +7101,16 @@ 0 15 - + Disabled Enabled - + 0 29 - + 0 15 @@ -7683,18 +7305,6 @@ 0 15 - - - Disabled - Enabled - - - - 0 29 - - - 0 15 - @@ -7913,40 +7523,40 @@ 0 15 - + Disabled Enabled - + 0 29 - + 0 15 - + Disabled Enabled - + 0 29 - + 0 15 - + Disabled Enabled - + 0 29 - + 0 15 @@ -8189,16 +7799,16 @@ 0 15 - + Disabled Enabled - + 0 29 - + 0 15 @@ -8393,18 +8003,6 @@ 0 15 - - - Disabled - Enabled - - - - 0 29 - - - 0 15 - @@ -8623,40 +8221,40 @@ 0 15 - + Disabled Enabled - + 0 29 - + 0 15 - + Disabled Enabled - + 0 29 - + 0 15 - + Disabled Enabled - + 0 29 - + 0 15 @@ -8899,16 +8497,16 @@ 0 15 - + Disabled Enabled - + 0 29 - + 0 15 @@ -9103,18 +8701,6 @@ 0 15 - - - Disabled - Enabled - - - - 0 29 - - - 0 15 - @@ -9333,40 +8919,40 @@ 0 15 - + Disabled Enabled - + 0 29 - + 0 15 - + Disabled Enabled - + 0 29 - + 0 15 - + Disabled Enabled - + 0 29 - + 0 15 @@ -9609,16 +9195,16 @@ 0 15 - + Disabled Enabled - + 0 29 - + 0 15 @@ -9813,18 +9399,6 @@ 0 15 - - - Disabled - Enabled - - - - 0 29 - - - 0 15 - @@ -10375,6 +9949,7 @@ None LightwareSF40c + LightWareSF40C-legacy MAVLink TeraRangerTower RangeFinder @@ -10383,7 +9958,6 @@ LightwareSF45B SITL AirSimSITL - CygbotD1 True @@ -10394,69 +9968,69 @@ - -180 180 deg degrees + -180 180 - 0 360 deg degrees + 0 360 - 0 127 deg degrees + 0 127 - 0 360 deg degrees + 0 360 - 0 127 deg degrees + 0 127 - 0 360 deg degrees + 0 360 - 0 127 deg degrees + 0 127 - 0 360 deg degrees + 0 360 - 0 127 deg degrees + 0 127 - 0 360 deg degrees + 0 360 - 0 127 deg degrees + 0 127 - 0 360 deg degrees + 0 360 - 0 127 deg degrees + 0 127 @@ -10465,28 +10039,18 @@ - 0 20 Hz hertz - - - 0 500 - m - meters - - - 0 500 - m - meters + 0 20 - 0.1 km kilometers + 0.1 @@ -10502,30 +10066,30 @@ seconds - 0:Ignore RC Receiver, 1:Ignore MAVLink Overrides, 2:Ignore Receiver Failsafe bit but allow other RC failsafes if setup, 3:FPort Pad, 4:Log RC input bytes, 5:Arming check throttle for 0 input, 6:Skip the arming check for neutral Roll/Pitch/Yaw sticks, 7:Allow Switch reverse, 8:Use passthrough for CRSF telemetry, 9:Suppress CRSF mode/rate message for ELRS systems,10:Enable multiple receiver support, 11:CRSF RSSI shows Link Quality + 0:Ignore RC Receiver, 1:Ignore MAVLink Overrides, 2:Ignore Receiver Failsafe bit but allow other RC failsafes if setup, 3:FPort Pad, 4:Log RC input bytes, 5:Arming check throttle for 0 input, 6:Skip the arming check for neutral Roll/Pitch/Yay sticks, 7:Allow Switch reverse, 8:Use passthrough for CRSF telemetry, 9:Suppress CRSF mode/rate message for ELRS systems, 10:Enable RC Protocol re-detection - 0:All,1:PPM,2:IBUS,3:SBUS,4:SBUS_NI,5:DSM,6:SUMD,7:SRXL,8:SRXL2,9:CRSF,10:ST24,11:FPORT,12:FPORT2,13:FastSBUS + 0:All,1:PPM,2:IBUS,3:SBUS,4:SBUS_NI,5:DSM,6:SUMD,7:SRXL,8:SRXL2,9:CRSF,10:ST24,11:FPORT,12:FPORT2 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -10534,15 +10098,15 @@ - 0 200 PWM PWM in microseconds + 0 200 Do Nothing RTL - Save Trim (4.1 and lower) + Save Trim Save WP Camera Trigger Fence @@ -10557,7 +10121,7 @@ Relay3 On/Off Relay4 On/Off Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL RC Override Enable LearnCruise @@ -10588,14 +10152,11 @@ Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - ArmDisarm (4.2 and higher) - set steering trim to current servo and RC - Torqeedo Clear Err Roll Pitch + Walking Height MainSail Flap - Walking Height Scripting1 Scripting2 Scripting3 @@ -10609,22 +10170,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -10633,15 +10194,15 @@ - 0 200 PWM PWM in microseconds + 0 200 Do Nothing RTL - Save Trim (4.1 and lower) + Save Trim Save WP Camera Trigger Fence @@ -10656,7 +10217,7 @@ Relay3 On/Off Relay4 On/Off Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL RC Override Enable LearnCruise @@ -10687,14 +10248,11 @@ Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - ArmDisarm (4.2 and higher) - set steering trim to current servo and RC - Torqeedo Clear Err Roll Pitch + Walking Height MainSail Flap - Walking Height Scripting1 Scripting2 Scripting3 @@ -10708,22 +10266,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -10732,15 +10290,15 @@ - 0 200 PWM PWM in microseconds + 0 200 Do Nothing RTL - Save Trim (4.1 and lower) + Save Trim Save WP Camera Trigger Fence @@ -10755,7 +10313,7 @@ Relay3 On/Off Relay4 On/Off Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL RC Override Enable LearnCruise @@ -10786,14 +10344,11 @@ Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - ArmDisarm (4.2 and higher) - set steering trim to current servo and RC - Torqeedo Clear Err Roll Pitch + Walking Height MainSail Flap - Walking Height Scripting1 Scripting2 Scripting3 @@ -10807,22 +10362,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -10831,15 +10386,15 @@ - 0 200 PWM PWM in microseconds + 0 200 Do Nothing RTL - Save Trim (4.1 and lower) + Save Trim Save WP Camera Trigger Fence @@ -10854,7 +10409,7 @@ Relay3 On/Off Relay4 On/Off Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL RC Override Enable LearnCruise @@ -10885,14 +10440,11 @@ Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - ArmDisarm (4.2 and higher) - set steering trim to current servo and RC - Torqeedo Clear Err Roll Pitch + Walking Height MainSail Flap - Walking Height Scripting1 Scripting2 Scripting3 @@ -10906,22 +10458,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -10930,15 +10482,15 @@ - 0 200 PWM PWM in microseconds + 0 200 Do Nothing RTL - Save Trim (4.1 and lower) + Save Trim Save WP Camera Trigger Fence @@ -10953,7 +10505,7 @@ Relay3 On/Off Relay4 On/Off Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL RC Override Enable LearnCruise @@ -10984,14 +10536,11 @@ Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - ArmDisarm (4.2 and higher) - set steering trim to current servo and RC - Torqeedo Clear Err Roll Pitch + Walking Height MainSail Flap - Walking Height Scripting1 Scripting2 Scripting3 @@ -11005,22 +10554,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -11029,15 +10578,15 @@ - 0 200 PWM PWM in microseconds + 0 200 Do Nothing RTL - Save Trim (4.1 and lower) + Save Trim Save WP Camera Trigger Fence @@ -11052,7 +10601,7 @@ Relay3 On/Off Relay4 On/Off Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL RC Override Enable LearnCruise @@ -11083,14 +10632,11 @@ Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - ArmDisarm (4.2 and higher) - set steering trim to current servo and RC - Torqeedo Clear Err Roll Pitch + Walking Height MainSail Flap - Walking Height Scripting1 Scripting2 Scripting3 @@ -11104,22 +10650,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -11128,15 +10674,15 @@ - 0 200 PWM PWM in microseconds + 0 200 Do Nothing RTL - Save Trim (4.1 and lower) + Save Trim Save WP Camera Trigger Fence @@ -11151,7 +10697,7 @@ Relay3 On/Off Relay4 On/Off Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL RC Override Enable LearnCruise @@ -11182,14 +10728,11 @@ Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - ArmDisarm (4.2 and higher) - set steering trim to current servo and RC - Torqeedo Clear Err Roll Pitch + Walking Height MainSail Flap - Walking Height Scripting1 Scripting2 Scripting3 @@ -11203,22 +10746,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -11227,15 +10770,15 @@ - 0 200 PWM PWM in microseconds + 0 200 Do Nothing RTL - Save Trim (4.1 and lower) + Save Trim Save WP Camera Trigger Fence @@ -11250,7 +10793,7 @@ Relay3 On/Off Relay4 On/Off Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL RC Override Enable LearnCruise @@ -11281,14 +10824,11 @@ Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - ArmDisarm (4.2 and higher) - set steering trim to current servo and RC - Torqeedo Clear Err Roll Pitch + Walking Height MainSail Flap - Walking Height Scripting1 Scripting2 Scripting3 @@ -11302,22 +10842,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -11326,15 +10866,15 @@ - 0 200 PWM PWM in microseconds + 0 200 Do Nothing RTL - Save Trim (4.1 and lower) + Save Trim Save WP Camera Trigger Fence @@ -11349,7 +10889,7 @@ Relay3 On/Off Relay4 On/Off Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL RC Override Enable LearnCruise @@ -11380,14 +10920,11 @@ Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - ArmDisarm (4.2 and higher) - set steering trim to current servo and RC - Torqeedo Clear Err Roll Pitch + Walking Height MainSail Flap - Walking Height Scripting1 Scripting2 Scripting3 @@ -11401,22 +10938,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -11425,15 +10962,15 @@ - 0 200 PWM PWM in microseconds + 0 200 Do Nothing RTL - Save Trim (4.1 and lower) + Save Trim Save WP Camera Trigger Fence @@ -11448,7 +10985,7 @@ Relay3 On/Off Relay4 On/Off Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL RC Override Enable LearnCruise @@ -11479,14 +11016,11 @@ Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - ArmDisarm (4.2 and higher) - set steering trim to current servo and RC - Torqeedo Clear Err Roll Pitch + Walking Height MainSail Flap - Walking Height Scripting1 Scripting2 Scripting3 @@ -11500,22 +11034,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -11524,15 +11058,15 @@ - 0 200 PWM PWM in microseconds + 0 200 Do Nothing RTL - Save Trim (4.1 and lower) + Save Trim Save WP Camera Trigger Fence @@ -11547,7 +11081,7 @@ Relay3 On/Off Relay4 On/Off Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL RC Override Enable LearnCruise @@ -11578,14 +11112,11 @@ Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - ArmDisarm (4.2 and higher) - set steering trim to current servo and RC - Torqeedo Clear Err Roll Pitch + Walking Height MainSail Flap - Walking Height Scripting1 Scripting2 Scripting3 @@ -11599,22 +11130,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -11623,15 +11154,15 @@ - 0 200 PWM PWM in microseconds + 0 200 Do Nothing RTL - Save Trim (4.1 and lower) + Save Trim Save WP Camera Trigger Fence @@ -11646,7 +11177,7 @@ Relay3 On/Off Relay4 On/Off Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL RC Override Enable LearnCruise @@ -11677,14 +11208,11 @@ Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - ArmDisarm (4.2 and higher) - set steering trim to current servo and RC - Torqeedo Clear Err Roll Pitch + Walking Height MainSail Flap - Walking Height Scripting1 Scripting2 Scripting3 @@ -11698,22 +11226,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -11722,15 +11250,15 @@ - 0 200 PWM PWM in microseconds + 0 200 Do Nothing RTL - Save Trim (4.1 and lower) + Save Trim Save WP Camera Trigger Fence @@ -11745,7 +11273,7 @@ Relay3 On/Off Relay4 On/Off Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL RC Override Enable LearnCruise @@ -11776,14 +11304,11 @@ Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - ArmDisarm (4.2 and higher) - set steering trim to current servo and RC - Torqeedo Clear Err Roll Pitch + Walking Height MainSail Flap - Walking Height Scripting1 Scripting2 Scripting3 @@ -11797,22 +11322,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -11821,15 +11346,15 @@ - 0 200 PWM PWM in microseconds + 0 200 Do Nothing RTL - Save Trim (4.1 and lower) + Save Trim Save WP Camera Trigger Fence @@ -11844,7 +11369,7 @@ Relay3 On/Off Relay4 On/Off Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL RC Override Enable LearnCruise @@ -11875,14 +11400,11 @@ Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - ArmDisarm (4.2 and higher) - set steering trim to current servo and RC - Torqeedo Clear Err Roll Pitch + Walking Height MainSail Flap - Walking Height Scripting1 Scripting2 Scripting3 @@ -11896,22 +11418,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -11920,15 +11442,15 @@ - 0 200 PWM PWM in microseconds + 0 200 Do Nothing RTL - Save Trim (4.1 and lower) + Save Trim Save WP Camera Trigger Fence @@ -11943,7 +11465,7 @@ Relay3 On/Off Relay4 On/Off Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL RC Override Enable LearnCruise @@ -11974,14 +11496,11 @@ Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - ArmDisarm (4.2 and higher) - set steering trim to current servo and RC - Torqeedo Clear Err Roll Pitch + Walking Height MainSail Flap - Walking Height Scripting1 Scripting2 Scripting3 @@ -11995,22 +11514,22 @@ - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -12019,15 +11538,15 @@ - 0 200 PWM PWM in microseconds + 0 200 Do Nothing RTL - Save Trim (4.1 and lower) + Save Trim Save WP Camera Trigger Fence @@ -12042,7 +11561,7 @@ Relay3 On/Off Relay4 On/Off Proximity Avoidance - ArmDisarm (4.1 and lower) + ArmDisarm SmartRTL RC Override Enable LearnCruise @@ -12073,14 +11592,11 @@ Camera Mode Toggle GPS Disable Yaw Disable Airspeed Use - ArmDisarm (4.2 and higher) - set steering trim to current servo and RC - Torqeedo Clear Err Roll Pitch + Walking Height MainSail Flap - Walking Height Scripting1 Scripting2 Scripting3 @@ -12139,14 +11655,6 @@ BB Blue GP0 pin 6 BB Blue GP0 pin 5 BBBMini Pin P8.17 - MainOut1 - MainOut2 - MainOut3 - MainOut4 - MainOut5 - MainOut6 - MainOut7 - MainOut8 @@ -12163,14 +11671,6 @@ BB Blue GP0 pin 6 BB Blue GP0 pin 5 BBBMini Pin P8.18 - MainOut1 - MainOut2 - MainOut3 - MainOut4 - MainOut5 - MainOut6 - MainOut7 - MainOut8 @@ -12187,14 +11687,6 @@ BB Blue GP0 pin 6 BB Blue GP0 pin 5 BBBMini Pin P8.19 - MainOut1 - MainOut2 - MainOut3 - MainOut4 - MainOut5 - MainOut6 - MainOut7 - MainOut8 @@ -12211,14 +11703,6 @@ BB Blue GP0 pin 6 BB Blue GP0 pin 5 BBBMini Pin P8.34 - MainOut1 - MainOut2 - MainOut3 - MainOut4 - MainOut5 - MainOut6 - MainOut7 - MainOut8 @@ -12242,14 +11726,6 @@ BB Blue GP0 pin 6 BB Blue GP0 pin 5 BBBMini Pin P8.13 - MainOut1 - MainOut2 - MainOut3 - MainOut4 - MainOut5 - MainOut6 - MainOut7 - MainOut8 @@ -12266,19 +11742,11 @@ BB Blue GP0 pin 6 BB Blue GP0 pin 5 BBBMini Pin P8.14 - MainOut1 - MainOut2 - MainOut3 - MainOut4 - MainOut5 - MainOut6 - MainOut7 - MainOut8 - + None Analog @@ -12290,7 +11758,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -12303,7 +11771,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -12313,35 +11781,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -12351,24 +11815,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -12384,37 +11848,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -12451,15 +11915,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -12471,7 +11929,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -12484,7 +11942,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -12494,35 +11952,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -12532,24 +11986,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -12565,37 +12019,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -12632,15 +12086,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -12652,7 +12100,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -12665,7 +12113,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -12675,35 +12123,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -12713,24 +12157,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -12746,37 +12190,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -12813,15 +12257,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -12833,7 +12271,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -12846,7 +12284,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -12856,35 +12294,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -12894,24 +12328,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -12927,37 +12361,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -12994,15 +12428,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -13014,7 +12442,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -13027,7 +12455,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -13037,35 +12465,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -13075,24 +12499,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -13108,37 +12532,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -13175,15 +12599,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -13195,7 +12613,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -13208,7 +12626,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -13218,35 +12636,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -13256,24 +12670,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -13289,37 +12703,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -13356,15 +12770,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -13376,7 +12784,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -13389,7 +12797,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -13399,35 +12807,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -13437,24 +12841,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -13470,37 +12874,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -13537,15 +12941,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -13557,7 +12955,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -13570,7 +12968,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -13580,35 +12978,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -13618,24 +13012,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -13651,37 +13045,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -13718,15 +13112,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -13738,7 +13126,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -13751,7 +13139,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -13761,35 +13149,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -13799,24 +13183,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -13832,37 +13216,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -13899,15 +13283,9 @@ High Speed - - 0 65535 - - - 0 65535 - - + None Analog @@ -13919,7 +13297,7 @@ LightWareSerial Bebop MAVLink - USD1_Serial + uLanding LeddarOne MaxbotixSerial TeraRangerI2C @@ -13932,7 +13310,7 @@ LidarLightV3HP PWM BlueRoboticsPing - DroneCAN + UAVCAN BenewakeTFminiPlus-I2C LanbaoPSK-CM8JL65-CC5 BenewakeTF03 @@ -13942,35 +13320,31 @@ GYUS42v2 MSP USD1_CAN - Benewake_CAN SITL - + Not Used - Pixracer - Pixhawk ADC4 - Pixhawk ADC3 - Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - Pixhawk SBUS + PX4-airspeed port + Pixhawk-airspeed port + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 - - 0.001 + m/V meters per volt + 0.001 - 0.001 V volt + 0.001 @@ -13980,24 +13354,24 @@ - 1 cm centimeters + 1 - 1 cm centimeters + 1 Not Used - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + Pixhawk AUXOUT1 + Pixhawk AUXOUT2 + Pixhawk AUXOUT3 + Pixhawk AUXOUT4 + Pixhawk AUXOUT5 + Pixhawk AUXOUT6 PX4 FMU Relay1 PX4 FMU Relay2 PX4IO Relay1 @@ -14013,37 +13387,37 @@ - 0 32767 m meters + 0 32767 - 5 127 - 1 cm centimeters + 5 127 + 1 - + 0 127 1 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -14080,88 +13454,63 @@ High Speed - - 0 65535 - - - 0 65535 - - - + + None - Not Used + PWM AUXPIN EFI Harmonic Notch - ESC Telemetry Motors Bitmask - + 0.001 - + 1 - + 1 - + 0.1 - + Disabled - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + PixhawkAUX1 + PixhawkAUX2 + PixhawkAUX3 + PixhawkAUX4 + PixhawkAUX5 + PixhawkAUX6 - - 0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 - - - - + None - Not Used + PWM AUXPIN EFI Harmonic Notch - ESC Telemetry Motors Bitmask - + 0.001 - - 1 - - - 1 - - - 0.1 - - + Disabled - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + PixhawkAUX1 + PixhawkAUX2 + PixhawkAUX3 + PixhawkAUX4 + PixhawkAUX5 + PixhawkAUX6 - - 0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 - @@ -14181,39 +13530,39 @@ Pixhawk ADC4 Pixhawk ADC3 Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + PixhawkAUX1 + PixhawkAUX2 + PixhawkAUX3 + PixhawkAUX4 + PixhawkAUX5 + PixhawkAUX6 Pixhawk SBUS - - 0 5.0 - 0.01 + V volt + 0.01 + 0 5.0 - - 0 5.0 - 0.01 + V volt + 0.01 + 0 5.0 0 16 - 0 2000 PWM PWM in microseconds + 0 2000 - 0 2000 PWM PWM in microseconds + 0 2000 @@ -14225,52 +13574,52 @@ True - 0 90 - 1 deg degrees + 0 90 + 1 - 0 90 - 1 deg degrees + 0 90 + 1 - 0 90 - 1 deg degrees + 0 90 + 1 - 0 90 - 1 deg degrees + 0 90 + 1 - 0 90 - 1 deg degrees + 0 90 + 1 - 0 5 - 0.1 m/s meters per second + 0 5 + 0.1 + m + meters 5 25 1 - m - meters - 0 20 - 1 m meters + 0 20 + 1 @@ -14313,9 +13662,8 @@ 1024 True - - 0:No Scripts to run message if all scripts have stopped, 1:Runtime messages for memory usage and execution time, 2:Suppress logging scripts to dataflash, 3:log runtime memory usage and execution time - + + @@ -14323,10 +13671,6 @@ - - - - 0:ROMFS, 1:APM/scripts @@ -14389,7 +13733,7 @@ RunCam HottTelem Scripting - Crossfire VTX + Crossfire Generator Winch MSP @@ -14399,10 +13743,6 @@ AHRS SmartAudio FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort True @@ -14454,7 +13794,7 @@ RunCam HottTelem Scripting - Crossfire VTX + Crossfire Generator Winch MSP @@ -14464,10 +13804,6 @@ AHRS SmartAudio FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort True @@ -14519,7 +13855,7 @@ RunCam HottTelem Scripting - Crossfire VTX + Crossfire Generator Winch MSP @@ -14529,10 +13865,6 @@ AHRS SmartAudio FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort True @@ -14584,7 +13916,7 @@ RunCam HottTelem Scripting - Crossfire VTX + Crossfire Generator Winch MSP @@ -14594,10 +13926,6 @@ AHRS SmartAudio FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort True @@ -14649,7 +13977,7 @@ RunCam HottTelem Scripting - Crossfire VTX + Crossfire Generator Winch MSP @@ -14659,10 +13987,6 @@ AHRS SmartAudio FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort True @@ -14714,7 +14038,7 @@ RunCam HottTelem Scripting - Crossfire VTX + Crossfire Generator Winch MSP @@ -14724,10 +14048,6 @@ AHRS SmartAudio FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort True @@ -14751,27 +14071,27 @@ - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate + 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO True - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate + 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO True - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate + 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO True - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate + 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO True - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate + 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO True - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate + 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO True @@ -14832,7 +14152,7 @@ RunCam HottTelem Scripting - Crossfire VTX + Crossfire Generator Winch MSP @@ -14842,10 +14162,6 @@ AHRS SmartAudio FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort True @@ -14869,7 +14185,7 @@ - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate + 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO True @@ -14901,7 +14217,7 @@ RunCam HottTelem Scripting - Crossfire VTX + Crossfire Generator Winch MSP @@ -14911,10 +14227,6 @@ AHRS SmartAudio FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort True @@ -14938,76 +14250,7 @@ - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate - True - - - - None - MAVLink1 - MAVLink2 - Frsky D - Frsky SPort - GPS - Alexmos Gimbal Serial - SToRM32 Gimbal Serial - Rangefinder - FrSky SPort Passthrough (OpenTX) - Lidar360 - Beacon - Volz servo out - SBus servo out - ESC Telemetry - Devo Telemetry - OpticalFlow - RobotisServo - NMEA Output - WindVane - SLCAN - RCIN - MegaSquirt EFI - LTM - RunCam - HottTelem - Scripting - Crossfire VTX - Generator - Winch - MSP - DJI FPV - AirSpeed - ADSB - AHRS - SmartAudio - FETtecOneWire - Torqeedo - AIS - CoDevESC - DisplayPort - - True - - - - 1200 - 2400 - 4800 - 9600 - 19200 - 38400 - 57600 - 111100 - 115200 - 230400 - 256000 - 460800 - 500000 - 921600 - 1500000 - - - - 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO, 12: Ignore Streamrate + 0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO True @@ -15029,33 +14272,28 @@ None - BLHeli32/Kiss - BLHeli_S + BLHeli32/BLHeli_S/Kiss - - 0:Servo 1, 1:Servo 2, 2:Servo 3, 3:Servo 4, 4:Servo 5, 5:Servo 6, 6:Servo 7, 7:Servo 8, 8:Servo 9, 9:Servo 10, 10:Servo 11, 11:Servo 12, 12:Servo 13, 13:Servo 14, 14:Servo 15, 15:Servo 16 - True - + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -15065,7 +14303,6 @@ - GPIO Disabled RCPassThru MountPan @@ -15140,29 +14377,27 @@ SERVOn_TRIM SERVOn_MAX SailMastRotation - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -15172,7 +14407,6 @@ - GPIO Disabled RCPassThru MountPan @@ -15247,29 +14481,27 @@ SERVOn_TRIM SERVOn_MAX SailMastRotation - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -15279,7 +14511,6 @@ - GPIO Disabled RCPassThru MountPan @@ -15354,29 +14585,27 @@ SERVOn_TRIM SERVOn_MAX SailMastRotation - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -15386,7 +14615,6 @@ - GPIO Disabled RCPassThru MountPan @@ -15461,29 +14689,27 @@ SERVOn_TRIM SERVOn_MAX SailMastRotation - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -15493,7 +14719,6 @@ - GPIO Disabled RCPassThru MountPan @@ -15568,29 +14793,27 @@ SERVOn_TRIM SERVOn_MAX SailMastRotation - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -15600,7 +14823,6 @@ - GPIO Disabled RCPassThru MountPan @@ -15675,29 +14897,27 @@ SERVOn_TRIM SERVOn_MAX SailMastRotation - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -15707,7 +14927,6 @@ - GPIO Disabled RCPassThru MountPan @@ -15782,29 +15001,27 @@ SERVOn_TRIM SERVOn_MAX SailMastRotation - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -15814,7 +15031,6 @@ - GPIO Disabled RCPassThru MountPan @@ -15889,29 +15105,27 @@ SERVOn_TRIM SERVOn_MAX SailMastRotation - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -15921,7 +15135,6 @@ - GPIO Disabled RCPassThru MountPan @@ -15996,29 +15209,27 @@ SERVOn_TRIM SERVOn_MAX SailMastRotation - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -16028,7 +15239,6 @@ - GPIO Disabled RCPassThru MountPan @@ -16103,29 +15313,27 @@ SERVOn_TRIM SERVOn_MAX SailMastRotation - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -16135,7 +15343,6 @@ - GPIO Disabled RCPassThru MountPan @@ -16210,29 +15417,27 @@ SERVOn_TRIM SERVOn_MAX SailMastRotation - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -16242,7 +15447,6 @@ - GPIO Disabled RCPassThru MountPan @@ -16317,29 +15521,27 @@ SERVOn_TRIM SERVOn_MAX SailMastRotation - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -16349,7 +15551,6 @@ - GPIO Disabled RCPassThru MountPan @@ -16424,29 +15625,27 @@ SERVOn_TRIM SERVOn_MAX SailMastRotation - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -16456,7 +15655,6 @@ - GPIO Disabled RCPassThru MountPan @@ -16531,29 +15729,27 @@ SERVOn_TRIM SERVOn_MAX SailMastRotation - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -16563,7 +15759,6 @@ - GPIO Disabled RCPassThru MountPan @@ -16638,29 +15833,27 @@ SERVOn_TRIM SERVOn_MAX SailMastRotation - Alarm - Alarm Inverted + PWM + PWM in microseconds 500 2200 1 - PWM - PWM in microseconds - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 - 800 2200 - 1 PWM PWM in microseconds + 800 2200 + 1 @@ -16670,7 +15863,6 @@ - GPIO Disabled RCPassThru MountPan @@ -16745,22 +15937,18 @@ SERVOn_TRIM SERVOn_MAX SailMastRotation - Alarm - Alarm Inverted 0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 - True Disabled Enabled - True @@ -16776,14 +15964,14 @@ - 0 300 s seconds + 0 300 - 0 500 Hz hertz + 0 500 @@ -16802,33 +15990,28 @@ DShot600 DShot1200 - True - + Console - Mavlink Serial Channel1 - Mavlink Serial Channel2 - Mavlink Serial Channel3 - Mavlink Serial Channel4 - Mavlink Serial Channel5 + Serial1 + Serial2 + Serial3 + Serial4 + Serial5 1 127 - True 0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 - True 0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 - True 0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 - True @@ -16871,465 +16054,465 @@ - 0 100 % percent + 0 100 - 1000 2000 ms milliseconds + 1000 2000 - 0 1000 cm/s centimeters per second + 0 1000 - 0 100 % percent + 0 100 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 50 - 1 Hz hertz + 0 50 + 1 - 0 10 m meters + 0 10 0 500 @@ -17344,74 +16527,19 @@ True - True s seconds + True - True s seconds + True + s + seconds True - s - seconds - - - - - - Disabled - Tiller - Motor - - True - - - - Disabled - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - - True - - - - Disabled - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 - - True - - - 0:Log,1:Send debug to GCS - - - 0 100 - 1 - % - percent - - - 0 5 - 0.1 - s - seconds - - - 0 5 - 0.1 - s - seconds @@ -17420,27 +16548,26 @@ None MAVLink IntelT265 - VOXL(ModalAI) True - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 @@ -17455,24 +16582,24 @@ - 0 250 ms milliseconds + 0 250 - 0.05 5.0 m/s meters per second + 0.05 5.0 - 0.1 10.0 m meters + 0.1 10.0 - 0.05 1.0 rad radians + 0.05 1.0 @@ -17499,8 +16626,8 @@ - 5000 6000 True + 5000 6000 0:Pitmode,1:Pitmode until armed,2:Pitmode when disarmed,3:Unlocked,4:Add leading zero byte to requests @@ -17521,48 +16648,48 @@ 1 - 0.001 m meters + 0.001 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 Disabled - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + PixhawkAUX1 + PixhawkAUX2 + PixhawkAUX3 + PixhawkAUX4 + PixhawkAUX5 + PixhawkAUX6 Disabled - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + PixhawkAUX1 + PixhawkAUX2 + PixhawkAUX3 + PixhawkAUX4 + PixhawkAUX5 + PixhawkAUX6 @@ -17576,48 +16703,48 @@ 1 - 0.001 m meters + 0.001 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 - -5 5 - 0.01 m meters + -5 5 + 0.01 Disabled - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + PixhawkAUX1 + PixhawkAUX2 + PixhawkAUX3 + PixhawkAUX4 + PixhawkAUX5 + PixhawkAUX6 Disabled - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + PixhawkAUX1 + PixhawkAUX2 + PixhawkAUX3 + PixhawkAUX4 + PixhawkAUX5 + PixhawkAUX6 @@ -17640,32 +16767,32 @@ Pixhawk ADC4 Pixhawk ADC3 Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + PixhawkAUX1 + PixhawkAUX2 + PixhawkAUX3 + PixhawkAUX4 + PixhawkAUX5 + PixhawkAUX6 Pixhawk SBUS - - 0 5.0 - 0.01 + V volt + 0.01 + 0 5.0 - - 0 5.0 - 0.01 + V volt + 0.01 + 0 5.0 - 0 360 - 1 deg degrees + 1 + 0 360 Hz @@ -17679,16 +16806,16 @@ - 0 360 - 1 deg degrees + 1 + 0 360 - 0 5 - 0.1 m/s meters per second + 0.1 + 0 5 @@ -17708,12 +16835,12 @@ Pixhawk ADC4 Pixhawk ADC3 Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + PixhawkAUX1 + PixhawkAUX2 + PixhawkAUX3 + PixhawkAUX4 + PixhawkAUX5 + PixhawkAUX6 Pixhawk SBUS @@ -17723,20 +16850,20 @@ Pixhawk ADC4 Pixhawk ADC3 Pixhawk ADC6/Pixhawk2 ADC - AUX1 - AUX2 - AUX3 - AUX4 - AUX5 - AUX6 + PixhawkAUX1 + PixhawkAUX2 + PixhawkAUX3 + PixhawkAUX4 + PixhawkAUX5 + PixhawkAUX6 Pixhawk SBUS - 0 3.3 - 0.01 V volt + 0.01 + 0 3.3 Hz @@ -17749,46 +16876,46 @@ - 0 100 - 0.1 m/s meters per second + 0 100 + 0.1 - 0 100 - 0.1 m meters + 0 100 + 0.1 - 0 10 - 0.1 m meters + 0 10 + 0.1 - 0 360 - 1 deg degrees - - 0 360 1 + + deg/s degrees per second + 0 360 + 1 - 0 100 - 0.1 m/s meters per second + 0 100 + 0.1 - 0 60 - 0.1 s seconds + 0 60 + 0.1 @@ -17799,9 +16926,9 @@ - 0 200 rad/s radians per second + 0 200 0.100 2.000 diff --git a/src/FirmwarePlugin/APM/APMParameterFactMetaData.Sub.3.4.xml b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Sub.3.4.xml new file mode 100644 index 0000000..c807a5e --- /dev/null +++ b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Sub.3.4.xml @@ -0,0 +1,6680 @@ + + + + + + +-100 0 + + +True + + +True + +ArduPlane +AntennaTracker +Copter +Rover +ArduSub + + + +1 255 + + + +Mission Planner and DroidPlanner + AP Planner 2 + + + + +Disabled +Enabled + + + +0 10 +.5 +Hz + + +0:Roll,1:Pitch,2:Yaw + +None +Roll +Pitch +Yaw + + + +0.01 2.0 +0.01 + + + +Disabled +Land +RTL + + + +0.1 +Volts + + +50 +mAh + + + +Disabled +Warn only +Disarm +Enter depth hold mode +Enter surface mode + + + + +Disabled +Warn only +Enter surface mode + + + + +Disabled +Warn only + + + + +Disabled +Warn only + + + +Pascal + + +Degrees Centigrade + + + +Disarm +Hold Position +Surface + + + +10 90 + + +100 900 + + + +Disabled +Enabled + + + + +Never change yaw +Face next waypoint +Face next waypoint except RTL +Face along GPS course + + + +50 500 +10 +Centimeters/Second + + +50 500 +10 +cm/s/s + + +0 300 +1 +pwm + + + +Stabilize +DepthHold +Manual + + + + +Stabilize +DepthHold +Manual + + + + +Stabilize +DepthHold +Manual + + + + +Stabilize +DepthHold +Manual + + + + +Stabilize +DepthHold +Manual + + + + +Stabilize +DepthHold +Manual + + + +0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:CTUN,5:NTUN,6:RCIN,7:IMU,8:CMD,9:CURRENT,10:RCOUT,11:OPTFLOW,12:PID,13:COMPASS,14:INAV,15:CAMERA,17:MOTBATT,18:IMU_FAST,19:IMU_RAW + +Default +Default+RCIN +Default+IMU +Default+Motors +NearlyAll-AC315 +NearlyAll +All+FastATT +All+MotBatt +All+FastIMU +All+FastIMU+PID +All+FullIMU +Disabled + + + + +Normal Start-up +Start-up in ESC Calibration mode if throttle high +Start-up in ESC Calibration mode regardless of throttle +Disabled + + + + +None +Stab Roll/Pitch kP +Rate Roll/Pitch kP +Rate Roll/Pitch kI +Rate Roll/Pitch kD +Stab Yaw kP +Rate Yaw kP +Rate Yaw kD +Altitude Hold kP +Throttle Rate kP +Throttle Accel kP +Throttle Accel kI +Throttle Accel kD +Loiter Speed +Loiter Pos kP +Velocity XY kP +Velocity XY kI +WP Speed +Acro RollPitch kP +Acro Yaw kP +Heli Ext Gyro +OF Loiter kP +OF Loiter kI +OF Loiter kD +Declination +Circle Rate +RangeFinder Gain +Rate Pitch kP +Rate Pitch kI +Rate Pitch kD +Rate Roll kP +Rate Roll kI +Rate Roll kD +Rate Pitch FF +Rate Roll FF +Rate Yaw FF + + + +0 32767 + + +0 32767 + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +ResetToArmedYaw +Super Simple Mode +Acro Trainer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +ResetToArmedYaw +Super Simple Mode +Acro Trainer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +ResetToArmedYaw +Super Simple Mode +Acro Trainer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +ResetToArmedYaw +Super Simple Mode +Acro Trainer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +ResetToArmedYaw +Super Simple Mode +Acro Trainer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw + + + + +Do Nothing +Flip +Simple Mode +RTL +Save Trim +Save WP +Camera Trigger +RangeFinder +Fence +ResetToArmedYaw +Super Simple Mode +Acro Trainer +Auto +AutoTune +Land +Gripper +Parachute Enable +Parachute Release +Parachute 3pos +Auto Mission Reset +AttCon Feed Forward +AttCon Accel Limits +Retract Mount +Relay On/Off +Relay2 On/Off +Relay3 On/Off +Relay4 On/Off +Landing Gear +Lost Copter Sound +Motor Emergency Stop +Motor Interlock +Brake +Throw + + + +0:All,1:Baro,2:Compass,3:GPS,4:INS,5:Parameters+Rangefinder,6:RC,7:Voltage + +Disabled +Enabled +Skip Baro +Skip Compass +Skip GPS +Skip INS +Skip Params/Rangefinder +Skip RC +Skip Voltage + + + +0 127 +Seconds + + +1000 8000 +Centi-degrees + + +0 100 + +Very Soft +Soft +Medium +Crisp +Very Crisp + +10 + + + +Land +AltHold +Land even in Stabilize + + + +0.6:Strict, 0.8:Default, 1.0:Relaxed + + + +Disabled +Enabled + + + +0.1 1.0 + + +0.2 1.0 + + +0.1 0.8 + + +1 10 + + +30 400 + + +30 400 + + +0.5 4.0 + + +1000 2000 + + +50 490 +1 +Hz + + +1 10 + + +1 10 + + +0 3 +0.1 + + +0 3 +0.1 + + + +Disabled +Leveling +Leveling and Limited + + + + +Disabled +Very Low +Low +Medium +High +Very High + + + +0.1 6.0 +0.1 + + +0.02 1.00 +0.01 + + +0 4500 +10 +cm/s/s + + +0 4500 +10 +cm/s/s + + +1.000 8.000 + + +0.500 1.500 +0.05 + + +0.000 3.000 + + +0 1000 +Percent*10 + + +0.000 0.400 + + +1.000 100.000 +Hz + + +1.000 3.000 + + +0.500 2.000 + + +0:Roll,1:Pitch,2:Yaw + +All +Roll Only +Pitch Only +Yaw Only +Roll and Pitch +Roll and Yaw +Pitch and Yaw + + + +0.05 0.10 + + +0.001 0.006 + + + +Do Not Use in RTL and Land +Use in RTL and Land + + + +0 5 + + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +MAVlink1 +MAVLink2 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Lidar +FrSky SPort Passthrough (OpenTX) +Lidar360 +Aerotenna uLanding +Pozyx Beacon + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Lidar +FrSky SPort Passthrough (OpenTX) +Lidar360 +Aerotenna uLanding +Pozyx Beacon + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Lidar +FrSky SPort Passthrough (OpenTX) +Lidar360 +Aerotenna uLanding +Pozyx Beacon + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Lidar +FrSky SPort Passthrough (OpenTX) +Lidar360 +Aerotenna uLanding +Pozyx Beacon + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Lidar +FrSky SPort Passthrough (OpenTX) +Lidar360 +Aerotenna uLanding +Pozyx Beacon + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Reversed +Normal + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Reversed +Normal + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Reversed +Normal + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Reversed +Normal + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Reversed +Normal + + + +0 200 +pwm + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Reversed +Normal + + + +0 200 +pwm + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Reversed +Normal + + + +0 200 +pwm + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Reversed +Normal + + + +0 200 +pwm + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Reversed +Normal + + + +0 200 +pwm + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Reversed +Normal + + + +0 200 +pwm + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Reversed +Normal + + + +0 200 +pwm + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Reversed +Normal + + + +0 200 +pwm + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Reversed +Normal + + + +0 200 +pwm + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Reversed +Normal + + + +0 200 +pwm + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_toggle +enter_mode_1 +enter_mode_2 +enter_mode_3 +enter_mode_4 +enter_mode_5 +enter_mode_6 +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 + + + + + + +Servo +Relay + + + +0 50 +seconds + + +1000 2000 +pwm + + +1000 2000 +pwm + + +0 1000 +meters + + + +Low +High + + + +0 10000 +milliseconds + + +0 180 +Degrees + + + +Disabled +PX4 AUX1 +PX4 AUX2 +PX4 AUX3 +PX4 AUX4(fast capture) +PX4 AUX5 +PX4 AUX6 + + + + +TriggerLow +TriggerHigh + + + + + + +Disabled +APM2 A9 pin +APM1 relay +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +APM2 A9 pin +APM1 relay +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +APM2 A9 pin +APM1 relay +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +APM2 A9 pin +APM1 relay +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Off +On +NoChange + + + + + +-400 400 +1 +milligauss + + +-400 400 +1 +milligauss + + +-400 400 +1 +milligauss + + +-3.142 3.142 +0.01 +Radians + + + +Disabled +Internal-Learning +EKF-Learning + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Use Throttle +Use Current + + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw136 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll90 + + + + +Internal +External +ForcedExternal + + + +-400 400 +1 +milligauss + + +-400 400 +1 +milligauss + + +-400 400 +1 +milligauss + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + + +FirstCompass +SecondCompass +ThirdCompass + + + +-400 400 +1 +milligauss + + +-400 400 +1 +milligauss + + +-400 400 +1 +milligauss + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + + + + + + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw136 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll90 + + + + +Internal +External +ForcedExternal + + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw136 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll90 + + + + +Internal +External +ForcedExternal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +4 32 + +Very Strict +Default +Relaxed +Very Relaxed + +0.1 + + + + + + +rad/s + + +rad/s + + +rad/s + + +rad/s + + +rad/s + + +rad/s + + +rad/s + + +rad/s + + +rad/s + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s + + +-3.5 3.5 +m/s/s + + +-3.5 3.5 +m/s/s + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s + + +-3.5 3.5 +m/s/s + + +-3.5 3.5 +m/s/s + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s + + +-3.5 3.5 +m/s/s + + +-3.5 3.5 +m/s/s + + +0 127 +Hz + + +0 127 +Hz + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +0.05 50 + + + +Never +Start-up only + + + + +Don't adjust the trims +Assume first orientation was level +Assume ACC_BODYFIX is perfectly aligned to the vehicle + + + + +IMU 1 +IMU 2 +IMU 3 + + + +m + + +m + + +m + + +m + + +m + + +m + + +m + + +m + + +m + + +True + + +True + + +True + + +True + + +True + + +True + + + + + + +0 2000 +50 +cm/s + + +100 1000 +1 +cm + + +0 1000 +50 +cm/s + + +0 500 +10 +cm/s + + +0 2000 +50 +cm/s + + +50 500 +10 +cm/s/s + + +50 500 +10 +cm/s/s + + +500 5000 +1 +cm/s/s/s + + +100 981 +1 +cm/s/s + + +25 250 +1 +cm/s/s + + + +Disable +Enable + + + + + +0 10000 +100 +cm + + +-90 90 +1 +deg/s + + + + +500 18000 +100 +Centi-Degrees/Sec + + +0 72000 + +Disabled +Slow +Medium +Fast + +1000 +Centi-Degrees/Sec/Sec + + +0 72000 + +Disabled +Slow +Medium +Fast + +1000 +Centi-Degrees/Sec/Sec + + + +Disabled +Enabled + + + +0 180000 + +Disabled +Slow +Medium +Fast + +1000 +Centi-Degrees/Sec/Sec + + +0 180000 + +Disabled +Slow +Medium +Fast + +1000 +Centi-Degrees/Sec/Sec + + + +Disabled +Enabled + + + +3.000 12.000 + + +3.000 12.000 + + +3.000 6.000 + + +0.5 10.0 + + +0.08 0.30 +0.005 + + +0.01 0.5 +0.01 + + +0 1 +0.01 +Percent + + +0.0 0.02 +0.001 + + +1 100 +1 +Hz + + +0.08 0.30 +0.005 + + +0.01 0.5 +0.01 + + +0 1 +0.01 +Percent + + +0.0 0.02 +0.001 + + +1 100 +1 +Hz + + +0.10 0.50 +0.005 + + +0.010 0.05 +0.01 + + +0 1 +0.01 +Percent + + +0.000 0.02 +0.001 + + +1 100 +1 +Hz + + +0.1 0.25 + + +0.5 0.9 + + + + +0.5 5 +0.1 +Hz + + + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + + + +0.0 1.0 +.01 + + + +Disabled +Enabled + + + +0.1 0.4 +.01 + + +0.1 0.4 +.01 + + +0 127 +1 +m/s + + +-0.1745 +0.1745 +0.01 +Radians + + +-0.1745 +0.1745 +0.01 +Radians + + +-0.1745 +0.1745 +0.01 +Radians + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw136 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 + + + +0.001 0.5 +.01 + + +0 10 +1 + + + +Disabled +Enabled +Enable EKF2 + + + + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +Centi-Degrees + + +-18000 17999 +1 +Centi-Degrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +Centi-Degrees + + +-18000 17999 +1 +Centi-Degrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +Centi-Degrees + + +-18000 17999 +1 +Centi-Degrees + + +0 100 +1 + + +0.0 0.2 +.005 +Seconds + + +0.0 0.2 +.005 +Seconds + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + +True + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +Centi-Degrees + + +-18000 17999 +1 +Centi-Degrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +Centi-Degrees + + +-18000 17999 +1 +Centi-Degrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +Centi-Degrees + + +-18000 17999 +1 +Centi-Degrees + + +0.0 0.2 +.005 +Seconds + + +0.0 0.2 +.005 +Seconds + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + + + + + + +None +File +MAVLink +BothFileAndMAVLink + + + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +SMBus +Bebop + + + + +Disabled +A0 +A1 +Pixhawk +A13 +PX4 + + + + +Disabled +A1 +A2 +Pixhawk +A12 +PX4 + + + + + +Amps/Volt + + +Volts + + +50 +mAh + + +1 +Watts + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +SMBus +Bebop + + + + +Disabled +A0 +A1 +Pixhawk +A13 +PX4 + + + + +Disabled +A1 +A2 +Pixhawk +A12 +PX4 + + + + + +Amps/Volt + + +Volts + + +50 +mAh + + +1 +Amps + + + + + +No PWMs +Two PWMs +Four PWMs +Six PWMs +Three PWMs and One Capture + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled + +True + + + +Disabled +50Hz +75Hz +100Hz +150Hz +200Hz +250Hz +300Hz + +True + + +-32767 32768 + + + +Disabled +Enabled +Dynamic ID/Update + + + +0:Ch1,1:Ch2,2:Ch3,3:Ch4,4:Ch5,5:Ch6,6:Ch7,7:Ch8,8:Ch9,9:Ch10,10:Ch11,11:Ch12,12:Ch13,13:Ch14 + +Disabled +Enabled + +True + + +-1 80 +degreesC + + + +AUTO +PX4V1 +Pixhawk +Pixhawk2 +Pixracer +PixhawkMini +Pixhawk2Slim +VRBrain 5.1 +VRBrain 5.2 +VR Micro Brain 5.1 +VR Micro Brain 5.2 +VRBrain Core 1.0 +VRBrain 5.4 + +True + + + + +True +True +1 +pascals + + +True +True +1 +degrees celsius + + +0.1 +meters + + + +FirstBaro +2ndBaro +3rdBaro + + + + +Disabled +Bus0 + + + +1.0:Fresh Water, 1.024:Salt Water + + +pascals + + + +Keep +Reset + +True + + + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +PX4-UAVCAN +SBF +GSOF +QURT +ERB +MAV +NOVA + +True + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +PX4-UAVCAN +SBF +GSOF + +True + + + +Portable +Stationary +Pedestrian +Automotive +Sea +Airborne1G +Airborne2G +Airborne4G + + + + +Disabled +Enabled + + + + +Any +FloatRTK +IntegerRTK + +True + + + +Disabled +Enabled +NoChange + + + +-100 90 +Degrees + + + +send to first GPS +send to 2nd GPS +send to all + + + + +None +All +External only + + + + +Disabled +log every sample +log every 5 samples + +True + + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + + + + +Do not save config +Save config +Save only when needed + + + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + + + + +Disables automatic configuration +Enable automatic configuration + + + + +10Hz +8Hz +5Hz + + + + +10Hz +8Hz +5Hz + + + +m + + +m + + +m + + +m + + +m + + +m + + + + + +Disabled +Pixhawk Aux1 +Pixhawk Aux2 +Pixhawk Aux3 +Pixhawk Aux4 +Pixhawk Aux5 +Pixhawk Aux6 +Pixhawk 3.3ADC1 +Pixhawk 3.3ADC2 +Pixhawk 6.6ADC + + + + +Low +High + + + + +Disabled +Pixhawk Aux1 +Pixhawk Aux2 +Pixhawk Aux3 +Pixhawk Aux4 +Pixhawk Aux5 +Pixhawk Aux6 +Pixhawk 3.3ADC1 +Pixhawk 3.3ADC2 +Pixhawk 6.6ADC + + + + +Low +High + + + + +Disabled +Pixhawk Aux1 +Pixhawk Aux2 +Pixhawk Aux3 +Pixhawk Aux4 +Pixhawk Aux5 +Pixhawk Aux6 +Pixhawk 3.3ADC1 +Pixhawk 3.3ADC2 +Pixhawk 6.6ADC + + + + +Low +High + + + + + + +Disabled +ShowSlips +ShowOverruns + + + + +50Hz +100Hz +200Hz +250Hz +300Hz +400Hz + +True + + + + + +Disabled +Enabled + + + +0:Altitude,1:Circle,2:Polygon + +None +Altitude +Circle +Altitude and Circle +Polygon +Altitude and Polygon +Circle and Polygon +All + + + + +Report Only +RTL or Land + + + +10 1000 +1 +Meters + + +30 10000 +Meters + + +1 10 +Meters + + +1 20 + + +10 1000 +1 +Meters + + + + +0:StopAtFence,1:UseProximitySensor + +None +StopAtFence +UseProximitySensor +All + + + + + + + +0.1 +kilometers + + + +DoNotIncludeHome +IncludeHome + + + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + +0.0 1.5 +0.1 + + +0 500 +pwm + + +0.25 0.8 + + +0.9:Low, 0.95:Default, 1.0:High + + +6 35 +Volts + + +6 35 +Volts + + +0 200 +Amps + + + +Normal +OneShot +OneShot125 +Brushed16kHz + +True + + +0 2000 + + +0 2000 + + +0.0:Low, 0.15:Default, 0.3:High + + +0.0:Low, 0.1:Default, 0.2:High + + +0 10 +Seconds + + +0.2 0.8 + + + +Disabled +Learn +LearnAndSave + + + + +PWM enabled while disarmed +PWM disabled while disarmed + + + + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + + + + +Disabled +Enabled + + + +0.05 5.0 +0.05 + + +0.05 5.0 +0.05 + + +0.1 10.0 +0.1 +meters + + +0.1 10.0 +0.1 +meters + + +0.01 0.5 +0.01 + + +0.5 5.0 +0.1 +m/s + + +0.01 1.0 +0.1 + + +0.0 1.0 +0.1 + + +0.001 0.05 +0.001 +rad/s + + +0.05 1.0 +0.01 +m/s/s + + +0.0000001 0.00001 +rad/s + + +0.00001 0.001 +m/s/s + + +0.0001 0.01 +gauss/s + + +0.0001 0.01 +gauss/s + + +0 500 +10 +milliseconds + + +0 500 +10 +milliseconds + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS use optical flow + + + +1 100 +1 + + +1 100 +1 + + +1 100 +1 + + +1 100 +1 + + +1 100 +1 + + + +Speed and Height +Acceleration +Never +Always + + + +100 500 +50 + + +10 50 +5 +meters + + +1 50 +1 + + +0.05 1.0 +0.05 +rad/s + + +1 100 +1 + + +0 500 +10 +milliseconds + + +1 100 +1 + + +1.0 4.0 +0.1 + + + +Trust EKF more +Trust DCM more + + + + +Use Baro +Use Range Finder + + + +0:NSats,1:HDoP,2:speed error,3:horiz pos error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + + + + +Disabled +Enabled + + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s + + +0.05 5.0 +0.05 +m/s + + +100 1000 +25 + + +0.1 10.0 +0.1 +m + + +100 1000 +25 + + +10 100 +5 +m + + +0 250 +10 +msec + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + + + +0.1 10.0 +0.1 +m + + +100 1000 +25 + + +0 250 +10 +msec + + +0.01 0.5 +0.01 +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s + + +100 1000 +25 + + +0.1 10.0 +0.1 +m + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s + + +0.05 1.0 +0.05 +rad/s + + +100 1000 +25 + + +0 250 +10 +msec + + +0.0001 0.1 +0.0001 +rad/s + + +0.01 1.0 +0.01 +m/s/s + + +0.00001 0.001 +rad/s/s + + +0.000001 0.001 +1/s + + +0.00001 0.001 +m/s/s/s + + +0.01 1.0 +0.1 +m/s/s + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:horiz pos error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +1 127 + + +50 200 +% + + +0.5 50.0 +m/s + + + +Disabled +FirstIMU +FirstAndSecondIMU +AllIMUs + + + +0.05 1.0 +0.05 +gauss + + +100 1000 +25 + + +10 50 +5 + + +0.00001 0.01 +gauss/s + + +0.00001 0.01 +gauss/s + + +-1 70 +1 +% + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m + + +100 1000 +25 + + +0 250 +10 +msec + + + + +0 32766 +1 + + + +Resume Mission +Restart Mission + + + + + + +None +Analog +MaxbotixI2C +PulsedLightI2C +PX4-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +meters/Volt + + +0.001 +Volts + + + +Linear +Inverted +Hyperbolic + + + +1 +centimeters + + +1 +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +milliseconds + + + +No +Yes + + + +0 32767 +meters + + +0 127 +1 +centimeters + + +0 127 +1 + + +m + + +m + + +m + + + +None +Analog +MaxbotixI2C +PulsedLightI2C +PX4-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +meters/Volt + + +0.001 +Volts + + + +Linear +Inverted +Hyperbolic + + + +1 +centimeters + + +1 +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +milliseconds + + + +No +Yes + + + +0 127 +1 +centimeters + + +0 127 +1 + + +m + + +m + + +m + + + +None +Analog +APM2-MaxbotixI2C +APM2-PulsedLightI2C +PX4-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +meters/Volt + + +0.001 +Volts + + + +Linear +Inverted +Hyperbolic + + + +1 +centimeters + + +1 +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +milliseconds + + + +No +Yes + + + +0 127 +1 +centimeters + + +0 127 +1 + + +m + + +m + + +m + + + +None +Analog +APM2-MaxbotixI2C +APM2-PulsedLightI2C +PX4-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +meters/Volt + + +0.001 +Volts + + + +Linear +Inverted +Hyperbolic + + + +1 +centimeters + + +1 +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +milliseconds + + + +No +Yes + + + +0 127 +1 +centimeters + + +0 127 +1 + + +m + + +m + + +m + + + + + +Disable +Enable + + + +1 +meters + + + + + +Disabled +Enabled + + + +-200 +200 +1 + + +-200 +200 +1 + + +-18000 +18000 +1 + + +m + + +m + + +m + + +0 255 + + + + + +None +PX4-PWM + + + +0.001 + + +1 + + +1 + + +0.1 + + + +None +PX4-PWM + + + +0.001 + + + + + +Off +Low +Medium +High + + + + +Disable +Enable + + + + +Disable +Enable + + + + + + +None +LightWareSF40C + + + + +Default +Upside Down + + + +-180 180 + + +0 360 + + +0 45 + + +0 360 + + +0 45 + + +0 360 + + +0 45 + + +0 360 + + +0 45 + + +0 360 + + +0 45 + + +0 360 + + +0 45 + + + +None +LightWareSF40C + + + + +Default +Upside Down + + + +-180 180 + + + + + +Disabled +Enabled + + + + +None +Servo +EPM + + + +1000 2000 + + +1000 2000 + + +1000 2000 + + +0 255 +seconds + + +0 255 + + + diff --git a/src/FirmwarePlugin/APM/APMParameterFactMetaData.Sub.3.5.xml b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Sub.3.5.xml new file mode 100644 index 0000000..8756cfa --- /dev/null +++ b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Sub.3.5.xml @@ -0,0 +1,8765 @@ + + + + + + +-100 0 +cm + + +True + + +True + +ArduPlane +AntennaTracker +Copter +Rover +ArduSub + + + +1 255 + + + + +0 10 +.5 +Hz + + +0:Roll,1:Pitch,2:Yaw + +None +Roll +Pitch +Yaw + + + +0.01 2.0 +0.01 + + + +Disabled +Warn only +Disarm +Enter surface mode + + + +0.1 +Volts + + +50 +mAh + + + +Disabled +Warn only +Disarm +Enter depth hold mode +Enter surface mode + + + + +Disabled +Warn only +Enter surface mode + + + + +Disabled +Warn only + + + + +Disabled +Warn only + + + +Pascal + + +Degrees Centigrade + + + +Disarm +Hold Position +Surface + + + + +Disabled +Warn Only +Disarm + + + +0.1 3.0 +Seconds + + +10 90 + + + +Disabled +Enabled + + + + +Never change yaw +Face next waypoint +Face next waypoint except RTL +Face along GPS course +Correct crosstrack error + + + +50 500 +10 +Centimeters/Second + + +50 500 +10 +cm/s/s + + +0 300 +1 +pwm + + +0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:CTUN,5:NTUN,6:RCIN,7:IMU,8:CMD,9:CURRENT,10:RCOUT,11:OPTFLOW,12:PID,13:COMPASS,14:INAV,15:CAMERA,17:MOTBATT,18:IMU_FAST,19:IMU_RAW + +Default +Default+RCIN +Default+IMU +Default+Motors +NearlyAll-AC315 +NearlyAll +All+FastATT +All+MotBatt +All+FastIMU +All+FastIMU+PID +All+FullIMU +Disabled + + + +1000 8000 +Centi-degrees + + +0 100 + +Very Soft +Soft +Medium +Crisp +Very Crisp + +10 + + + +Disabled +Warn only +Disarm + + + +0.6:Strict, 0.8:Default, 1.0:Relaxed + + + +Disabled +Warn only +Disarm + + + +0.1 1.0 + + +0.2 1.0 + + +0.1 0.8 + + +1 10 + + +1 10 +PWM + + +0.5 4.0 + + + +BlueROV1 +Vectored +Vectored_6DOF +Vectored_6DOF_90 +SimpleROV-3 +SimpleROV-4 +SimpleROV-5 +Custom + +True + + +50 490 +1 +Hz + + +0 500 +10 +%/s + + +1 10 + + +1 10 + + +0 3 +0.1 + + +0 3 +0.1 + + + +Disabled +Leveling +Leveling and Limited + + + + +Disabled +Very Low +Low +Medium +High +Very High + + + +0.1 6.0 +0.1 + + +0.02 1.00 +0.01 + + +0 4500 +10 +cm/s/s + + +0 4500 +10 +cm/s/s + + +1.000 8.000 + + +0.500 1.500 +0.05 + + +0.000 3.000 + + +0 1000 +Percent*10 + + +0.000 0.400 + + +1.000 100.000 +Hz + + +1.000 3.000 + + +0.500 2.000 + + + +Do Not Use in RTL and SURFACE +Use in RTL and SURFACE + + + + + +0.0 1.0 +.01 + + + +Disabled +Enabled + + + +0.1 0.4 +.01 + + +0.1 0.4 +.01 + + +0 127 +1 +m/s + + +-0.1745 +0.1745 +0.01 +Radians + + +-0.1745 +0.1745 +0.01 +Radians + + +-0.1745 +0.1745 +0.01 +Radians + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw136 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 + + + +0.001 0.5 +.01 + + +0 10 +1 + + + +Disabled +Enable EKF2 +Enable EKF3 + + + + + + +Disabled +THR_MIN PWM when disarmed +0 PWM when disarmed + + + +0:All,1:Barometer,2:Compass,3:GPS lock,4:INS,5:Parameters,6:RC Channels,7:Board voltage,8:Battery Level,10:Logging Available,11:Hardware safety switch,12:GPS Configuration + +None +All +Barometer +Compass +GPS Lock +INS(INertial Sensors - accels & gyros) +Parameters(unused) +RC Channels +Board voltage +Battery Level +LoggingAvailable +Hardware safety switch +GPS configuration + + + +0.25 3.0 +m/s/s + + +0.1 +Volts + + +0.1 +Volts + + + + +500 18000 +100 +Centi-Degrees/Sec + + +0 72000 + +Disabled +Slow +Medium +Fast + +1000 +Centi-Degrees/Sec/Sec + + + +Disabled +Enabled + + + +0 180000 + +Disabled +Slow +Medium +Fast + +1000 +Centi-Degrees/Sec/Sec + + +0 180000 + +Disabled +Slow +Medium +Fast + +1000 +Centi-Degrees/Sec/Sec + + + +Disabled +Enabled + + + +0.0 12.000 + + +0.0 12.000 + + +0.0 6.000 + + +0.5 10.0 + + +0.0 0.30 +0.005 + + +0.0 0.5 +0.01 + + +0 1 +0.01 +Percent + + +0.0 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz + + +0.0 0.30 +0.005 + + +0.0 0.5 +0.01 + + +0 1 +0.01 +Percent + + +0.0 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz + + +0.0 0.50 +0.005 + + +0.0 0.05 +0.01 + + +0 1 +0.01 +Percent + + +0.000 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz + + +0.1 0.25 + + +0.5 0.9 + + +0.5 0.9 + + + + +0:StopAtFence,1:UseProximitySensor + +None +StopAtFence +UseProximitySensor +All + + + +0 4500 + + +3 30 +meters + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell + + + + +Disabled +A0 +A1 +Pixhawk/Pixracer/Navio2 +A5 +A10 +A13/Pixhawk2_PM2 +PX4-v1 + + + + +Disabled +A1 +A2 +Pixhawk/Pixracer/Navio2 +A11 +A12/Pixhawk2_PM2 +PX4-v1 + + + + + +Amps/Volt + + +Volts + + +50 +mAh + + +1 +Watts + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell + + + + +Disabled +A0 +A1 +Pixhawk/Pixracer/Navio2 +A5 +A10 +A13/Pixhawk2_PM2 +PX4-v1 + + + + +Disabled +A1 +A2 +Pixhawk/Pixracer/Navio2 +A11 +A12/Pixhawk2_PM2 +PX4-v1 + + + + + +Amps/Volt + + +Volts + + +50 +mAh + + +1 +Amps + + + + + +No PWMs +Two PWMs +Four PWMs +Six PWMs +Three PWMs and One Capture + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled + +True + + + +Disabled +50Hz +75Hz +100Hz +150Hz +200Hz +250Hz +300Hz + +True + + +-32768 32767 + + +0:Ch1,1:Ch2,2:Ch3,3:Ch4,4:Ch5,5:Ch6,6:Ch7,7:Ch8,8:Ch9,9:Ch10,10:Ch11,11:Ch12,12:Ch13,13:Ch14 + +Disabled +Enabled + +True + + +-1 80 +degreesC + + + +AUTO +PX4V1 +Pixhawk +Pixhawk2 +Pixracer +PixhawkMini +Pixhawk2Slim +VRBrain 5.1 +VRBrain 5.2 +VR Micro Brain 5.1 +VR Micro Brain 5.2 +VRBrain Core 1.0 +VRBrain 5.4 +Intel Aero FC +AUAV2.1 + +True + + + +Disabled +Enabled + +True + + + + + +Disabled +Enabled first channel +Enabled both channels + + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + +Disabled +Enabled + + + + + +1 250 + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Servo +Relay + + + +0 50 +deciseconds + + +1000 2000 +pwm + + +1000 2000 +pwm + + +0 1000 +meters + + + +Low +High + + + +0 10000 +milliseconds + + +0 180 +Degrees + + + +Disabled +PX4 AUX1 +PX4 AUX2 +PX4 AUX3 +PX4 AUX4(fast capture) +PX4 AUX5 +PX4 AUX6 + + + + +TriggerLow +TriggerHigh + + + + + +0 10000 +100 +cm + + +-90 90 +1 +deg/s + + + + +-400 400 +1 +milligauss + + +-400 400 +1 +milligauss + + +-400 400 +1 +milligauss + + +-3.142 3.142 +0.01 +Radians + + + +Disabled +Internal-Learning +EKF-Learning + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Use Throttle +Use Current + + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw136 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll90 + + + + +Internal +External +ForcedExternal + + + +-400 400 +1 +milligauss + + +-400 400 +1 +milligauss + + +-400 400 +1 +milligauss + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + + +FirstCompass +SecondCompass +ThirdCompass + + + +-400 400 +1 +milligauss + + +-400 400 +1 +milligauss + + +-400 400 +1 +milligauss + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + +-1000 1000 +1 +Offset per Amp or at Full Throttle + + + + + + + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw136 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll90 + + + + +Internal +External +ForcedExternal + + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw136 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll90 + + + + +Internal +External +ForcedExternal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +4 32 + +Very Strict +Strict +Default +Relaxed + +0.1 + + +500 3000 +1 + + + + + +Disabled +Enabled + + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s + + +0.05 5.0 +0.05 +m/s + + +100 1000 +25 + + +0.1 10.0 +0.1 +m + + +100 1000 +25 + + +10 100 +5 +m + + +0 250 +10 +milliseconds + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + + + +0.1 10.0 +0.1 +m + + +100 1000 +25 + + +0 250 +10 +milliseconds + + +0.01 0.5 +0.01 +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s + + +100 1000 +25 + + +0.1 10.0 +0.1 +m + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s + + +0.05 1.0 +0.05 +rad/s + + +100 1000 +25 + + +0 127 +10 +milliseconds + + +0.0001 0.1 +0.0001 +rad/s + + +0.01 1.0 +0.01 +m/s/s + + +0.00001 0.001 +rad/s/s + + +0.000001 0.001 +1/s + + +0.00001 0.001 +m/s/s/s + + +0.01 1.0 +0.1 +m/s/s + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU + + +50 200 +% + + +0.5 50.0 +m + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU + + +0.05 1.0 +0.05 +rad + + +100 1000 +25 + + +10 50 +5 +cs + + +0.00001 0.01 +gauss/s + + +0.00001 0.01 +gauss/s + + +-1 70 +1 +% + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m + + +100 1000 +25 + + +0 127 +10 +milliseconds + + +2.0 6.0 +0.5 +m/s + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF + + + + + +Disabled +Enabled + + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s + + +0.05 5.0 +0.05 +m/s + + +100 1000 +25 + + +0.1 10.0 +0.1 +m + + +100 1000 +25 + + +10 100 +5 +m + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + + + +0.1 10.0 +0.1 +m + + +100 1000 +25 + + +0 250 +10 +milliseconds +True + + +0.01 0.5 +0.01 +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s + + +100 1000 +25 + + +0.1 10.0 +0.1 +m + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s + + +0.05 1.0 +0.05 +rad/s + + +100 1000 +25 + + +0 250 +10 +milliseconds +True + + +0.0001 0.1 +0.0001 +rad/s + + +0.01 1.0 +0.01 +m/s/s + + +0.00001 0.001 +rad/s/s + + +0.00001 0.001 +m/s/s/s + + +0.01 1.0 +0.1 +m/s/s + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU + + +50 200 +% + + +0.5 50.0 +m + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU + + +0.05 1.0 +0.05 +rad + + +100 1000 +25 + + +10 50 +5 +cs + + +0.00001 0.01 +gauss/s + + +0.00001 0.01 +gauss/s + + +-1 70 +1 +% + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m + + +100 1000 +25 + + +0 250 +10 +milliseconds +True + + +2.0 6.0 +0.5 +m/s + + +0.5 2.5 +0.1 +m/s/s + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF + + + + + +Disabled +Enabled + + + +0:Altitude,1:Circle,2:Polygon + +None +Altitude +Circle +Altitude and Circle +Polygon +Altitude and Polygon +Circle and Polygon +All + + + + +Report Only +RTL or Land + + + +10 1000 +1 +Meters + + +30 10000 +Meters + + +1 10 +Meters + + +1 20 + + +-100 100 +1 +Meters + + + + + +Disabled +Enabled + + + +-200 +200 +1 + + +-200 +200 +1 + + +-18000 +18000 +1 + + +m + + +m + + +m + + +0 127 + + + + +True +True +1 +pascals + + +True +True +1 +degrees celsius + + +0.1 +meters + + + +FirstBaro +2ndBaro +3rdBaro + + + + +Disabled +Bus0 +Bus1 + + + +1.0:Freshwater,1.024:Saltwater + + +True +True +1 +pascals + + +True +True +1 +pascals + + + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +QURT +ERB +MAV +NOVA + +True + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +QURT +ERB +MAV +NOVA + +True + + + +Portable +Stationary +Pedestrian +Automotive +Sea +Airborne1G +Airborne2G +Airborne4G + + + + +Disabled +UseBest +Blend + + + + +Any +FloatRTK +IntegerRTK + +True + + + +Disabled +Enabled +NoChange + + + +-100 90 +Degrees + + + +send to first GPS +send to 2nd GPS +send to all + + + + +None (0x0000) +All (0xFFFF) +External only (0xFF00) + + + + +Disabled +log every sample +log every 5 samples + +True + + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + + + + +Do not save config +Save config +Save only when needed + + + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + + + + +Disables automatic configuration +Enable automatic configuration + + + +50 200 + +10Hz +8Hz +5Hz + +milliseconds + + +50 200 + +10Hz +8Hz +5Hz + +milliseconds + + +m + + +m + + +m + + +m + + +m + + +m + + +0 250 +milliseconds + + +0 250 +milliseconds + + +0:Horiz Pos,1:Vert Pos,2:Speed + + +5.0 30.0 +seconds + + + + + +Disabled +Enabled + + + + +None +Servo +EPM + + + +1000 2000 +PWM + + +1000 2000 +PWM + + +1000 2000 +PWM + + +0 255 +seconds + + +0 255 + + + + + + +rad/s + + +rad/s + + +rad/s + + +rad/s + + +rad/s + + +rad/s + + +rad/s + + +rad/s + + +rad/s + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s + + +-3.5 3.5 +m/s/s + + +-3.5 3.5 +m/s/s + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s + + +-3.5 3.5 +m/s/s + + +-3.5 3.5 +m/s/s + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s + + +-3.5 3.5 +m/s/s + + +-3.5 3.5 +m/s/s + + +0 127 +Hz + + +0 127 +Hz + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +0.05 50 + + + +Never +Start-up only + + + + +Don't adjust the trims +Assume first orientation was level +Assume ACC_BODYFIX is perfectly aligned to the vehicle + + + + +IMU 1 +IMU 2 +IMU 3 + + + +m + + +m + + +m + + +m + + +m + + +m + + +m + + +m + + +m + + +True + + +True + + +True + + +True + + +True + + +True + + + + + + + +Disabled +Pixhawk Aux1 +Pixhawk Aux2 +Pixhawk Aux3 +Pixhawk Aux4 +Pixhawk Aux5 +Pixhawk Aux6 +Pixhawk 3.3ADC1 +Pixhawk 3.3ADC2 +Pixhawk 6.6ADC + + + + +Low +High + + + + +Disabled +Pixhawk Aux1 +Pixhawk Aux2 +Pixhawk Aux3 +Pixhawk Aux4 +Pixhawk Aux5 +Pixhawk Aux6 +Pixhawk 3.3ADC1 +Pixhawk 3.3ADC2 +Pixhawk 6.6ADC + + + + +Low +High + + + + +Disabled +Pixhawk Aux1 +Pixhawk Aux2 +Pixhawk Aux3 +Pixhawk Aux4 +Pixhawk Aux5 +Pixhawk Aux6 +Pixhawk 3.3ADC1 +Pixhawk 3.3ADC2 +Pixhawk 6.6ADC + + + + +Low +High + + + + + + +None +File +MAVLink +BothFileAndMAVLink + + + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + + +0 32766 +1 + + + +Resume Mission +Restart Mission + + + + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +Centi-Degrees + + +-18000 17999 +1 +Centi-Degrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +Centi-Degrees + + +-18000 17999 +1 +Centi-Degrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +Centi-Degrees + + +-18000 17999 +1 +Centi-Degrees + + +0 100 +1 + + +0.0 0.2 +.005 +Seconds + + +0.0 0.2 +.005 +Seconds + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + +True + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + +-180.00 179.99 +1 +Degrees + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +Centi-Degrees + + +-18000 17999 +1 +Centi-Degrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +Centi-Degrees + + +-18000 17999 +1 +Centi-Degrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +Centi-Degrees + + +-18000 17999 +1 +Centi-Degrees + + +0.0 0.2 +.005 +Seconds + + +0.0 0.2 +.005 +Seconds + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + + + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + +0.0 1.5 +0.1 + + +0 500 +pwm + + +0.25 0.8 + + +0.9:Low, 0.95:Default, 1.0:High + + +6 35 +Volts + + +6 35 +Volts + + +0 200 +Amps + + + +Normal +OneShot +OneShot125 +Brushed16kHz + +True + + +0 2000 + + +0 2000 + + +0.0:Low, 0.15:Default, 0.3:High + + +0.0:Low, 0.1:Default, 0.2:High + + +0 10 +Seconds + + +0.2 0.8 + + + +Disabled +Learn +LearnAndSave + + + + +PWM enabled while disarmed +PWM disabled while disarmed + + + +5 80 +1 +Degrees + + +0 2 +0.1 +Seconds + + + + + +Off +Low +Medium +High + + + + +Disable +Enable + + + + +Disable +Enable + + + + +Disable +ssd1306 +sh1106 + + + + + + +None +LightWareSF40C +MAVLink +TeraRangerTower +RangeFinder + + + + +Default +Upside Down + + + +-180 180 +degrees + + +0 360 +degrees + + +0 45 +degrees + + +0 360 +degrees + + +0 45 +degrees + + +0 360 +degrees + + +0 45 +degrees + + +0 360 +degrees + + +0 45 +degrees + + +0 360 +degrees + + +0 45 +degrees + + +0 360 +degrees + + +0 45 +degrees + + + +None +LightWareSF40C +MAVLink +TeraRangerTower +RangeFinder + + + + +Default +Upside Down + + + +-180 180 +degrees + + + + +0.5 5 +0.1 +Hz + + + + + + +0.1 +kilometers + + + +DoNotIncludeHome +IncludeHome + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + +0 200 +pwm + + + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + + + + +Disabled +APM2 A9 pin +APM1 relay +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +APM2 A9 pin +APM1 relay +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +APM2 A9 pin +APM1 relay +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Disabled +APM2 A9 pin +APM1 relay +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +Off +On +NoChange + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TrOneI2C +LidarLiteV3-I2C + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +meters/Volt + + +0.001 +Volts + + + +Linear +Inverted +Hyperbolic + + + +1 +centimeters + + +1 +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +milliseconds + + + +No +Yes + + + +0 32767 +meters + + +5 127 +1 +centimeters + + +0 127 +1 + + +m + + +m + + +m + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TrOneI2C +LidarLiteV3-I2C + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +meters/Volt + + +0.001 +Volts + + + +Linear +Inverted +Hyperbolic + + + +1 +centimeters + + +1 +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +milliseconds + + + +No +Yes + + + +0 127 +1 +centimeters + + +0 127 +1 + + +m + + +m + + +m + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TrOneI2C +LidarLiteV3-I2C + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +meters/Volt + + +0.001 +Volts + + + +Linear +Inverted +Hyperbolic + + + +1 +centimeters + + +1 +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +milliseconds + + + +No +Yes + + + +0 127 +1 +centimeters + + +0 127 +1 + + +m + + +m + + +m + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TrOneI2C +LidarLiteV3-I2C + + + + +Not Used +APM2-A0 +APM2-A1 +APM2-A2 +APM2-A3 +APM2-A4 +APM2-A5 +APM2-A6 +APM2-A7 +APM2-A8 +APM2-A9 +PX4-airspeed port +Pixhawk-airspeed port +APM1-airspeed port + + + +0.001 +meters/Volt + + +0.001 +Volts + + + +Linear +Inverted +Hyperbolic + + + +1 +centimeters + + +1 +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +milliseconds + + + +No +Yes + + + +0 127 +1 +centimeters + + +0 127 +1 + + +m + + +m + + +m + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + + +None +PX4-PWM +AUXPIN + + + +0.001 + + +1 + + +1 + + +0.1 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +None +PX4-PWM +AUXPIN + + + +0.001 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + + + +Disabled +ShowSlips +ShowOverruns + + + + +50Hz +100Hz +200Hz +250Hz +300Hz +400Hz + +True + + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +460800 +500000 +921600 +1500000 + + + + +MAVlink1 +MAVLink2 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Lidar +FrSky SPort Passthrough (OpenTX) +Lidar360 +Aerotenna uLanding +Pozyx Beacon + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Lidar +FrSky SPort Passthrough (OpenTX) +Lidar360 +Aerotenna uLanding +Pozyx Beacon + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Lidar +FrSky SPort Passthrough (OpenTX) +Lidar360 +Aerotenna uLanding +Pozyx Beacon + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Lidar +FrSky SPort Passthrough (OpenTX) +Lidar360 +Aerotenna uLanding +Pozyx Beacon + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Lidar +FrSky SPort Passthrough (OpenTX) +Lidar360 +Aerotenna uLanding +Pozyx Beacon + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +500000 +921600 +1500000 + + + + + + +Disable +Enable + + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight + + + + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + +800 2200 +1 +pwm + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoiler1 +DifferentialSpoiler2 +AileronWithInput +Elevator +ElevatorWithInput +Rudder +Flaperon1 +Flaperon2 +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight + + + + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + +0 10 +1 +Hz + + + + + +Disable +Enable + + + +1 +meters + + + + +20 2000 +50 +cm/s + + +100 1000 +1 +cm + + +10 1000 +50 +cm/s + + +10 500 +10 +cm/s + + +20 2000 +50 +cm/s + + +50 500 +10 +cm/s/s + + +50 500 +10 +cm/s/s + + +500 5000 +1 +cm/s/s/s + + +100 981 +1 +cm/s/s + + +25 250 +1 +cm/s/s + + + +Disable +Enable + + + + diff --git a/src/FirmwarePlugin/APM/APMParameterFactMetaData.Sub.3.6.xml b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Sub.3.6.xml new file mode 100644 index 0000000..9239b7e --- /dev/null +++ b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Sub.3.6.xml @@ -0,0 +1,12574 @@ + + + + + + +-100 0 +cm +centimeters + + +True + + +1 255 + + + + +0 10 +.5 +Hz +hertz + + +0:Roll,1:Pitch,2:Yaw + +None +Roll +Pitch +Yaw + + + +0.01 2.0 +0.01 + + + +Disabled +Warn only +Disarm +Enter depth hold mode +Enter surface mode + + + + +Disabled +Warn only +Enter surface mode + + + + +Disabled +Warn only + + + + +Disabled +Warn only + + + +Pa +pascal + + +degC +degrees Celsius + + + +Disarm +Hold Position +Surface + + + + +Disabled +Warn Only +Disarm + + + +0.1 3.0 +s +seconds + + +10 90 + + + +Never change yaw +Face next waypoint +Face next waypoint except RTL +Face along GPS course +Correct crosstrack error + + + +50 500 +10 +cm/s +centimeters per second + + +50 500 +10 +cm/s +centimeters per second + + +50 500 +10 +cm/s/s +centimeters per square second + + +0 300 +1 +PWM +PWM in microseconds + + +0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:CTUN,5:NTUN,6:RCIN,7:IMU,8:CMD,9:CURRENT,10:RCOUT,11:OPTFLOW,12:PID,13:COMPASS,14:INAV,15:CAMERA,17:MOTBATT,18:IMU_FAST,19:IMU_RAW + +Default +Default+RCIN +Default+IMU +Default+Motors +NearlyAll-AC315 +NearlyAll +All+FastATT +All+MotBatt +All+FastIMU +All+FastIMU+PID +All+FullIMU +Disabled + + + +1000 8000 +cdeg +centidegrees + + + +Disabled +Warn only +Disarm + + + +0.6:Strict, 0.8:Default, 1.0:Relaxed + + + +Disabled +Warn only +Disarm + + + +0.1 1.0 + + +0.2 1.0 + + +0.1 0.8 + + +1 10 + + +1 10 +PWM +PWM in microseconds + + +0.5 4.0 + + + +BlueROV1 +Vectored +Vectored_6DOF +Vectored_6DOF_90 +SimpleROV-3 +SimpleROV-4 +SimpleROV-5 +Custom + +True + + +50 490 +1 +Hz +hertz + + +1 10 + + +1 10 + + +0 3 +0.1 + + +0 3 +0.1 + + + +Disabled +Leveling +Leveling and Limited + + + + +Disabled +Very Low +Low +Medium +High +Very High + + + + +Do Not Use in RTL and SURFACE +Use in RTL and SURFACE + + + + + +0.0 1.0 +.01 + + + +Disabled +Enabled + + + +0.1 0.4 +.01 + + +0.1 0.4 +.01 + + +0 127 +1 +m/s +meters per second + + +-0.1745 +0.1745 +0.01 +rad +radians + + +-0.1745 +0.1745 +0.01 +rad +radians + + +-0.1745 +0.1745 +0.01 +rad +radians + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 +Custom + + + +0.001 0.5 +.01 + + +0 10 +1 + + + +Disabled +Enable EKF2 +Enable EKF3 + + + +-180 180 +1 +deg +degrees + + +-180 180 +1 +deg +degrees + + +-180 180 +1 +deg +degrees + + + + + +Disabled +THR_MIN PWM when disarmed +0 PWM when disarmed + + + +0:All,1:Barometer,2:Compass,3:GPS lock,4:INS,5:Parameters,6:RC Channels,7:Board voltage,8:Battery Level,9:Airspeed,10:Logging Available,11:Hardware safety switch,12:GPS Configuration,13:System + +None +All +Barometer +Compass +GPS Lock +INS(INertial Sensors - accels & gyros) +Parameters(unused) +RC Channels +Board voltage +Battery Level +Airspeed +LoggingAvailable +Hardware safety switch +GPS configuration +System + + + +0.25 3.0 +m/s/s +meters per square second + + + +Disabled +ArmingOnly +ArmOrDisarm + + + +0:Land,1:VTOL Land,2:DO_LAND_START,3:Takeoff,4:VTOL Takeoff,5:Rallypoint + + + + +500 18000 +100 +cdeg/s +centidegrees per second + + +0 72000 + +Disabled +VerySlow +Slow +Medium +Fast + +1000 +cdeg/s/s +centidegrees per square second + + + +Disabled +Enabled + + + +0 180000 + +Disabled +VerySlow +Slow +Medium +Fast + +1000 +cdeg/s/s +centidegrees per square second + + +0 180000 + +Disabled +VerySlow +Slow +Medium +Fast + +1000 +cdeg/s/s +centidegrees per square second + + + +Disabled +Enabled + + + +0.0 12.000 + + +0.0 12.000 + + +0.0 6.000 + + +0.5 10.0 + + +0 1080 + +Disabled +Slow +Medium +Fast + +1 +deg/s +degrees per second + + +0 1080 + +Disabled +Slow +Medium +Fast + +1 +deg/s +degrees per second + + +0 1080 + +Disabled +Slow +Medium +Fast + +1 +deg/s +degrees per second + + +0 1 +0.5:Very Soft, 0.2:Soft, 0.15:Medium, 0.1:Crisp, 0.05:Very Crisp +0.01 +s +seconds + + +0.0 0.30 +0.005 + + +0.0 0.5 +0.01 + + +0 1 +0.01 +% +percent + + +0.0 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz +hertz + + +0.0 0.30 +0.005 + + +0.0 0.5 +0.01 + + +0 1 +0.01 +% +percent + + +0.0 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz +hertz + + +0.0 0.50 +0.005 + + +0.0 0.05 +0.01 + + +0 1 +0.01 +% +percent + + +0.000 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz +hertz + + +0.1 0.25 + + +0.5 0.9 + + +0.5 0.9 + + + + +0:StopAtFence,1:UseProximitySensor,2:StopAtBeaconFence + +None +StopAtFence +UseProximitySensor +StopAtFence and UseProximitySensor +StopAtBeaconFence +All + + + +0 4500 +cdeg +centidegrees + + +1 30 +m +meters + + +1 10 +m +meters + + + +Slide +Stop + + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +50 +mAh +milliampere hour + + +1 +W +watt + + + + +0 120 +1 +s +seconds + + + +Raw Voltage +Sag Compensated Voltage + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +0.1 +V +volt + + +50 +mAh +milliampere hour + + + + + +No PWMs +One PWMs +Two PWMs +Three PWMs +Four PWMs +Five PWMs +Six PWMs +Seven PWMs +Eight PWMs + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled + +True + + + +Disabled +50Hz +75Hz +100Hz +150Hz +200Hz +250Hz +300Hz + +True + + +-32768 32767 + + +0:Ch1,1:Ch2,2:Ch3,3:Ch4,4:Ch5,5:Ch6,6:Ch7,7:Ch8,8:Ch9,9:Ch10,10:Ch11,11:Ch12,12:Ch13,13:Ch14 + +Disabled +Enabled + +True + + +-1 80 +degC +degrees Celsius + + + +AUTO +PX4V1 +Pixhawk +Cube/Pixhawk2 +Pixracer +PixhawkMini +Pixhawk2Slim +VRBrain 5.1 +VRBrain 5.2 +VR Micro Brain 5.1 +VR Micro Brain 5.2 +VRBrain Core 1.0 +VRBrain 5.4 +Intel Aero FC +AUAV2.1 + +True + + + +Disabled +Enabled + +True + + +0:ActiveForSafetyEnable,1:ActiveForSafetyDisable,2:ActiveWhenArmed,3:Force safety on when the aircraft disarms + + +4.0 5.5 +0.1 +V +volt + + +3.3 12.0 +0.1 +V +volt + + +0 32 +1 + + + +3.3V +5V + + + + + + +None +CYRF6936 + + + + +Auto +DSM2 +DSMX + + + +0 4 + + + +NotDisabled +Disabled + + + +0 16 + + +0 16 + + + +Disabled +Enabled + + + +1 8 + + + +Disabled +MinChannel +MidChannel +MaxChannel +MinChannelCW +MidChannelCW +MaxChannelCW + + + + +Mode1 +Mode2 + + + + +Disabled +TestChan1 +TestChan2 +TestChan3 +TestChan4 +TestChan5 +TestChan6 +TestChan7 +TestChan8 + + + +0 16 + + +0 16 + + +1 8 + + +0 40 + + +0 120 + + +0 31 + + + + +0:GPS,1:MAVLINK_SYSTEM_TIME,2:HW + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Servo +Relay + + + +0 50 +ds +deciseconds + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +0 1000 +m +meters + + + +Low +High + + + +0 10000 +ms +milliseconds + + +0 180 +deg +degrees + + + +Disabled +AUX1 +AUX2 +AUX3 +AUX4 +AUX5 +AUX6 + +True + + + +TriggerLow +TriggerHigh + + + + +Always +Only when in AUTO + + + + +Default +BMMCC + + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + +0 32767 + + + + +0 10000 +100 +cm +centimeters + + +-90 90 +1 +deg/s +degrees per second + + + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-3.142 3.142 +0.01 +rad +radians + + + +Disabled +Internal-Learning +EKF-Learning +InFlight-Learning + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Use Throttle +Use Current + + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + + +FirstCompass +SecondCompass +ThirdCompass + + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-400 400 +1 +mGauss +milligauss + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +-1000 1000 +1 +mGauss/A +milligauss per ampere + + +True + + +True + + +True + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +4 32 + +Very Strict +Strict +Default +Relaxed + +0.1 + + +500 3000 +1 + + +0:HMC5883,1:LSM303D,2:AK8963,3:BMM150,4:LSM9DS1,5:LIS3MDL,6:AK09916,7:IST8310,8:ICM20948,9:MMC3416,11:UAVCAN,12:QMC5883,14:MAG3110,15:IST8308 + + +0 100 +1 +% +percent + + + +Disabled +CheckOnly +CheckAndFix + + + + + + + + + + +Disabled +Enabled + + + + + + +Disabled +Enabled + + + +0 2 +0.01 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.000001 0.001 +Hz +hertz + + +0.00001 0.005 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +2.0 6.0 +0.5 +m/s +meters per second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + +0 127 +1 +ms +milliseconds +True + + + +None +Navigation +Terrain + +True + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + +True + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.00001 0.005 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +2.0 6.0 +0.5 +m/s +meters per second + + +0.5 2.5 +0.1 +m/s/s +meters per square second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + +0.05 0.5 +0.05 +m/s +meters per second + + +0.5 5.0 +0.1 +m/s +meters per second + + +0.01 1.0 +0.1 +m/s +meters per second + + + +None +Navigation +Terrain + +True + + + + + +Disabled +Enabled + + + +0:Altitude,1:Circle,2:Polygon + +None +Altitude +Circle +Altitude and Circle +Polygon +Altitude and Polygon +Circle and Polygon +All + + + + +Report Only +RTL or Land +Always Land +SmartRTL or RTL or Land +Brake or Land + + + +10 1000 +1 +m +meters + + +30 10000 +m +meters + + +1 10 +m +meters + + +1 20 + + +-100 100 +1 +m +meters + + + + + +None +PX4Flow +Pixart +Bebop +CXOF +MAVLink + +True + + +-200 +200 +1 + + +-200 +200 +1 + + +-18000 +18000 +1 + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +0 127 + + + +Disabled +Enabled + + + + + +True +True +1 +Pa +pascal + + +True +1 +degC +degrees Celsius + + +0.1 +m +meters + + + +FirstBaro +2ndBaro +3rdBaro + + + + +Disabled +Bus0 +Bus1 + + + +1.0:Freshwater,1.024:Saltwater + + +True +True +1 +Pa +pascal + + +True +True +1 +Pa +pascal + + +0 100 +1 +% +percent + + +0:BMP085,1:BMP280,2:MS5611,3:MS5607,4:MS5637,5:FBM320,6:DPS280,7:LPS25H,8:Keller + +BMP085 +BMP280 +MS5611 +MS5607 +MS5637 +FBM320 +DPS280 +LPS25H +Keller + + + + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA + +True + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA + +True + + + +Portable +Stationary +Pedestrian +Automotive +Sea +Airborne1G +Airborne2G +Airborne4G + + + + +Disabled +UseBest +Blend +UseSecond + + + + +Any +FloatRTK +IntegerRTK + +True + + + +Disabled +Enabled +NoChange + + + +-100 90 +deg +degrees + + + +send to first GPS +send to 2nd GPS +send to all + + + + +None (0x0000) +All (0xFFFF) +External only (0xFF00) + + + + +Ignore +Always log +Stop logging when disarmed (SBF only) +Only log every five samples (uBlox only) + +True + + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + + + + +Do not save config +Save config +Save only when needed + + + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + + + + +Disables automatic configuration +Enable automatic configuration + + + +50 200 + +10Hz +8Hz +5Hz + +ms +milliseconds + + +50 200 + +10Hz +8Hz +5Hz + +ms +milliseconds + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +0 250 +ms +milliseconds +True + + +0 250 +ms +milliseconds +True + + +0:Horiz Pos,1:Vert Pos,2:Speed + + +5.0 30.0 +s +seconds + + + + + +Disabled +Enabled + + + + +None +Servo +EPM + + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +0 255 +s +seconds + + +0 255 + + + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +-3.5 3.5 +m/s/s +meters per square second + + +0 127 +Hz +hertz + + +0 127 +Hz +hertz + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +0.05 50 + + + +Never +Start-up only + + + + +Don't adjust the trims +Assume first orientation was level +Assume ACC_BODYFIX is perfectly aligned to the vehicle + + + + +IMU 1 +IMU 2 +IMU 3 + + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +-10 10 +m +meters + + +True + + +True + + +True + + +True + + +True + + +True + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU + +FirstIMUOnly +FirstAndSecondIMU + + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU + +FirstIMUOnly +FirstAndSecondIMU +FirstSecondAndThirdIMU +AllIMUs + + + + + +32 + + +0:IMU1,1:IMU2,2:IMU3 + +None +First IMU +All + + + +0:Sensor-Rate Logging (sample at full sensor rate seen by AP) + + +10 +ms +milliseconds + + +1 + + + + + +Disabled +Enabled + + + +10 200 +Hz +hertz + + +5 50 +Hz +hertz + + +5 30 +dB +decibel + + + + + +Disabled +Pixhawk Aux1 +Pixhawk Aux2 +Pixhawk Aux3 +Pixhawk Aux4 +Pixhawk Aux5 +Pixhawk Aux6 +Pixhawk 3.3ADC1 +Pixhawk 3.3ADC2 +Pixhawk 6.6ADC + + + + +Low +High + + + + +Disabled +Pixhawk Aux1 +Pixhawk Aux2 +Pixhawk Aux3 +Pixhawk Aux4 +Pixhawk Aux5 +Pixhawk Aux6 +Pixhawk 3.3ADC1 +Pixhawk 3.3ADC2 +Pixhawk 6.6ADC + + + + +Low +High + + + + +Disabled +Pixhawk Aux1 +Pixhawk Aux2 +Pixhawk Aux3 +Pixhawk Aux4 +Pixhawk Aux5 +Pixhawk Aux6 +Pixhawk 3.3ADC1 +Pixhawk 3.3ADC2 +Pixhawk 6.6ADC + + + + +Low +High + + + + + +0:File,1:MAVLink,2:Block + +None +File +MAVLink +File and MAVLink +Block +Block and MAVLink + + + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +kB +kilobytes + + + + +0 45 +1 +deg +degrees + + +20 2000 +50 +cm/s +centimeters per second + + +100 981 +1 +cm/s/s +centimeters per square second + + +25 250 +1 +cm/s/s +centimeters per square second + + +500 5000 +1 +cm/s/s/s +centimeters per cubic second + + +0 2 +0.1 +s +seconds + + + + +0 32766 +1 + + + +Resume Mission +Restart Mission + + + +0:Clear Mission on reboot + + + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + +0 100 +1 + + +0.0 0.2 +.005 +s +seconds + + +0.0 0.2 +.005 +s +seconds + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + +True + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + +-180.00 179.99 +1 +deg +degrees + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +-18000 17999 +1 +cdeg +centidegrees + + +-18000 17999 +1 +cdeg +centidegrees + + +0.0 0.2 +.005 +s +seconds + + +0.0 0.2 +.005 +s +seconds + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + + + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + +0.0 1.5 +0.1 + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + +0 500 +PWM +PWM in microseconds + + +0.25 0.8 + + +0.9:Low, 0.95:Default, 1.0:High + + +6 35 +V +volt + + +6 35 +V +volt + + +0 200 +A +ampere + + + +Normal +OneShot +OneShot125 +Brushed +DShot150 +DShot300 +DShot600 +DShot1200 + +True + + +0 2000 +PWM +PWM in microseconds + + +0 2000 +PWM +PWM in microseconds + + +0.0:Low, 0.15:Default, 0.3:High + + +0.0:Low, 0.1:Default, 0.2:High + + +0 10 +s +seconds + + +0.2 0.8 + + + +Disabled + + + + +PWM enabled while disarmed +PWM disabled while disarmed + + + +5 80 +1 +deg +degrees + + +0 2 +0.1 +s +seconds + + +0 5 +0.1 + + + +First battery +Second battery + + + +0 .5 +0.001 +s +seconds + + +0 .5 +0.001 +s +seconds + + + + + +Off +Low +Medium +High + + + + +Disable +Enable + + + + +Standard +MAVLink +OutbackChallenge + + + + +Disable +ssd1306 +sh1106 + + + + +Disabled +Aircraft +Rover + + + + +Disabled + + + +0:Build in LED, 1:Internal ToshibaLED, 2:External ToshibaLED, 3:External PCA9685, 4:Oreo LED, 5:UAVCAN, 6:NCP5623 External, 7:NCP5623 Internal + + + +LowIsOn +HighIsOn + + + + + + +None +LightWareSF40C +MAVLink +TeraRangerTower +RangeFinder +RPLidarA2 +TeraRangerTowerEvo +SITL +MorseSITL + +True + + + +Default +Upside Down + + + +-180 180 +deg +degrees + + +0 360 +deg +degrees + + +0 45 +deg +degrees + + +0 360 +deg +degrees + + +0 45 +deg +degrees + + +0 360 +deg +degrees + + +0 45 +deg +degrees + + +0 360 +deg +degrees + + +0 45 +deg +degrees + + +0 360 +deg +degrees + + +0 45 +deg +degrees + + +0 360 +deg +degrees + + +0 45 +deg +degrees + + + +None +LightWareSF40C +MAVLink +TeraRangerTower +RangeFinder +RPLidarA2 +TeraRangerTowerEvo + +True + + + +Default +Upside Down + + + +-180 180 +deg +degrees + + + + +0.5 5 +0.1 +Hz +hertz + + +1.000 3.000 + + +1.000 8.000 + + +0.500 1.500 +0.05 + + +0.000 3.000 + + +0 1000 +d% +decipercent + + +0.000 0.400 + + +1.000 100.000 +Hz +hertz + + +0.500 2.000 + + +0.1 6.0 +0.1 + + +0.02 1.00 +0.01 + + +0.00 1.00 +0.001 + + +0 4500 +10 +cm/s/s +centimeters per square second + + +0 100 +Hz +hertz + + +0 100 +Hz +hertz + + +0 45 +1 +deg +degrees + + + + + + +0.1 +km +kilometers + + + +DoNotIncludeHome +IncludeHome + + + + + +0.0 120.0 +s +seconds + + +0:Ignore RC Receiver, 1:Ignore MAVLink Overrides, 2:Ignore Receiver Failsafe + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + +0 200 +PWM +PWM in microseconds + + + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1-8 +1 +True + + +1 8 +1-8 +1 +True + + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Off +On +NoChange + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PX4-PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +0.001 +m/V +meters per volt + + +0.001 +V +volt + + + +Linear +Inverted +Hyperbolic + + + +1 +cm +centimeters + + +1 +cm +centimeters + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + +1 +ms +milliseconds + + + +No +Yes + + + +0 32767 +m +meters + + +5 127 +1 +cm +centimeters + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +PX4-PWM +AUXPIN + + + +0.001 + + +1 + + +1 + + +0.1 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +None +PX4-PWM +AUXPIN + + + +0.001 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + + + +Disabled +ShowSlips +ShowOverruns + + + + +50Hz +100Hz +200Hz +250Hz +300Hz +400Hz + +True + + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +460800 +500000 +921600 +1500000 + + + + +MAVlink1 +MAVLink2 + +True + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + +0 120 +s +seconds + + + + + +Disable +Enable + + + +25 400 +Hz +hertz + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +500 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + +800 2200 +1 +PWM +PWM in microseconds + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + +Disabled +Enabled + + + + +Disabled +TestMotor1 +TestMotor2 +TestMotor3 +TestMotor4 +TestMotor5 +TestMotor6 +TestMotor7 +TestMotor8 + + + +0 300 +s +seconds + + +0 500 +Hz +hertz + + + +Disabled +Enabled + + + + +None +OneShot +OneShot125 +Brushed +DShot150 +DShot300 +DShot600 +DShot1200 + + + + +Console +Telem1 +Telem2 +Telem3 +Telem4 +Telem5 + + + +1 127 + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + + +0 4095 + + +0 4095 + + + + +25 250 +Hz +hertz + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + +0 10 +1 +Hz +hertz + + + + + +Disable +Enable + + + +1 +m +meters + + + + +20 2000 +50 +cm/s +centimeters per second + + +10 1000 +1 +cm +centimeters + + +10 1000 +50 +cm/s +centimeters per second + + +10 500 +10 +cm/s +centimeters per second + + +50 500 +10 +cm/s/s +centimeters per square second + + +50 500 +10 +cm/s/s +centimeters per square second + + + +Disable +Enable + + + + diff --git a/src/FirmwarePlugin/APM/APMParameterFactMetaData.Sub.4.0.xml b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Sub.4.0.xml new file mode 100644 index 0000000..62ae698 --- /dev/null +++ b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Sub.4.0.xml @@ -0,0 +1,13283 @@ + + + + + + +cm +centimeters +-100 0 + + +True + + +1 255 + + + + +Hz +hertz +0 10 +.5 + + + +None +Roll +Pitch +Yaw + +0:Roll,1:Pitch,2:Yaw + + +0.01 2.0 +0.01 + + + +Disabled +Warn only +Disarm +Enter depth hold mode +Enter surface mode + + + + +Disabled +Warn only +Enter surface mode + + + + +Disabled +Warn only + + + + +Disabled +Warn only + + + +Pa +pascal + + +degC +degrees Celsius + + + +Disarm +Hold Position +Surface + + + + +Disabled +Warn Only +Disarm + + + +s +seconds +0.1 3.0 + + +10 90 + + + +Never change yaw +Face next waypoint +Face next waypoint except RTL +Face along GPS course +Correct crosstrack error + + + +cm/s +centimeters per second +50 500 +10 + + +cm/s +centimeters per second +50 500 +10 + + +cm/s/s +centimeters per square second +50 500 +10 + + +0 300 +PWM +PWM in microseconds +1 + + + +Default +Default+RCIN +Default+IMU +Default+Motors +NearlyAll-AC315 +NearlyAll +All+FastATT +All+MotBatt +All+FastIMU +All+FastIMU+PID +All+FullIMU +Disabled + +0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:CTUN,5:NTUN,6:RCIN,7:IMU,8:CMD,9:CURRENT,10:RCOUT,11:OPTFLOW,12:PID,13:COMPASS,14:INAV,15:CAMERA,17:MOTBATT,18:IMU_FAST,19:IMU_RAW + + +cdeg +centidegrees +1000 8000 + + + +Disabled +Warn only +Disarm + + + +0.6:Strict, 0.8:Default, 1.0:Relaxed + + + +Disabled +Warn only +Disarm + + + +0.1 1.0 + + +0.2 1.0 + + +0.1 0.8 + + +1 10 + + +1 10 +PWM +PWM in microseconds + + +0.5 4.0 + + +True + +BlueROV1 +Vectored +Vectored_6DOF +Vectored_6DOF_90 +SimpleROV-3 +SimpleROV-4 +SimpleROV-5 +Custom + + + +Hz +hertz +50 490 +1 + + +1 10 + + +1 10 + + +0 3 +0.1 + + +0 3 +0.1 + + + +Disabled +Leveling +Leveling and Limited + + + + +Disabled +Very Low +Low +Medium +High +Very High + + + + +Do Not Use in RTL and SURFACE +Use in RTL and SURFACE + + + + + +0.0 1.0 +.01 + + + +Disabled +Enabled + + + +0.1 0.4 +.01 + + +0.1 0.4 +.01 + + +0 127 +m/s +meters per second +1 + + +rad +radians +-0.1745 +0.1745 +0.01 + + +rad +radians +-0.1745 +0.1745 +0.01 + + +rad +radians +-0.1745 +0.1745 +0.01 + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 +Custom + + + +0.001 0.5 +.01 + + +0 10 +1 + + + +Disabled +Enable EKF2 +Enable EKF3 + + + +-180 180 +deg +degrees +1 + + +-180 180 +deg +degrees +1 + + +-180 180 +deg +degrees +1 + + + + + +Disabled +THR_MIN PWM when disarmed +0 PWM when disarmed + + + +m/s/s +meters per square second +0.25 3.0 + + + +Disabled +ArmingOnly +ArmOrDisarm + + + +0:Land,1:VTOL Land,2:DO_LAND_START,3:Takeoff,4:VTOL Takeoff,5:Rallypoint + + + +None +All +Barometer +Compass +GPS Lock +INS(INertial Sensors - accels & gyros) +Parameters(unused) +RC Channels +Board voltage +Battery Level +Airspeed +LoggingAvailable +Hardware safety switch +GPS configuration +System + +0:All,1:Barometer,2:Compass,3:GPS lock,4:INS,5:Parameters,6:RC Channels,7:Board voltage,8:Battery Level,9:Airspeed,10:Logging Available,11:Hardware safety switch,12:GPS Configuration,13:System,14:Mission,15:Rangefinder + + + + +cdeg/s +centidegrees per second +500 18000 +100 + + +cdeg/s/s +centidegrees per square second +0 72000 + +Disabled +VerySlow +Slow +Medium +Fast + +1000 + + + +Disabled +Enabled + + + +cdeg/s/s +centidegrees per square second +0 180000 +1000 + +Disabled +VerySlow +Slow +Medium +Fast + + + +cdeg/s/s +centidegrees per square second +0 180000 +1000 + +Disabled +VerySlow +Slow +Medium +Fast + + + + +Disabled +Enabled + + + +0.0 12.000 + + +0.0 12.000 + + +0.0 6.000 + + +0.5 10.0 + + +deg/s +degrees per second +0 1080 +1 + +Disabled +Slow +Medium +Fast + + + +deg/s +degrees per second +0 1080 +1 + +Disabled +Slow +Medium +Fast + + + +deg/s +degrees per second +0 1080 +1 + +Disabled +Slow +Medium +Fast + + + +s +seconds +0 1 +0.01 +0.5:Very Soft, 0.2:Soft, 0.15:Medium, 0.1:Crisp, 0.05:Very Crisp + + +0.0 0.30 +0.005 + + +0.0 0.5 +0.01 + + +0 1 +0.01 +% +percent + + +0.0 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz +hertz + + +1 100 +1 +Hz +hertz + + +1 100 +1 +Hz +hertz + + +0.0 0.30 +0.005 + + +0.0 0.5 +0.01 + + +0 1 +0.01 +% +percent + + +0.0 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz +hertz + + +1 100 +1 +Hz +hertz + + +1 100 +1 +Hz +hertz + + +0.0 0.50 +0.005 + + +0.0 0.05 +0.01 + + +0 1 +0.01 +% +percent + + +0.000 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz +hertz + + +1 100 +1 +Hz +hertz + + +1 100 +1 +Hz +hertz + + +0.1 0.25 + + +0.5 0.9 + + +0.5 0.9 + + +1 100 +1 +Hz +hertz + + +1 100 +1 +Hz +hertz + + +1 100 +1 +Hz +hertz + + + + + +None +UseFence +UseProximitySensor +UseFence and UseProximitySensor +UseBeaconFence +All + +0:UseFence,1:UseProximitySensor,2:UseBeaconFence + + +cdeg +centidegrees +0 4500 + + +m +meters +1 30 + + +m +meters +1 10 + + + +Slide +Stop + + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Maxell +UAVCAN-BatteryInfo +BLHeli ESC +SumOfFollowing +FuelFlow +FuelLevelPWM + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Pixhawk2_PM2 +CubeOrange +CubeOrange_PM2 +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + +W +watt +1 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + + + +No PWMs +One PWMs +Two PWMs +Three PWMs +Four PWMs +Five PWMs +Six PWMs +Seven PWMs +Eight PWMs + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled + +True + + + +Disabled +50Hz +75Hz +100Hz +150Hz +200Hz +250Hz +300Hz + +True + + +-32768 32767 + + + +Disabled +Enabled + +0:Ch1,1:Ch2,2:Ch3,3:Ch4,4:Ch5,5:Ch6,6:Ch7,7:Ch8,8:Ch9,9:Ch10,10:Ch11,11:Ch12,12:Ch13,13:Ch14 +True + + +-1 80 +degC +degrees Celsius + + + +AUTO +PX4V1 +Pixhawk +Cube/Pixhawk2 +Pixracer +PixhawkMini +Pixhawk2Slim +VRBrain 5.1 +VRBrain 5.2 +VR Micro Brain 5.1 +VR Micro Brain 5.2 +VRBrain Core 1.0 +VRBrain 5.4 +Intel Aero FC +AUAV2.1 + +True + + + +Disabled +Enabled + +True + + +0:ActiveForSafetyEnable,1:ActiveForSafetyDisable,2:ActiveWhenArmed,3:Force safety on when the aircraft disarms + + +V +volt +4.0 5.5 +0.1 + + +V +volt +3.3 12.0 +0.1 + + +0 32 +1 + + + +3.3V +5V + + + +0:Enable hardware watchdog + + +0 10000 +ms +milliseconds + + + + + +None +CYRF6936 +CC2500 +BK2425 + + + + +Auto +DSM2 +DSMX + + + +0 4 + + + +NotDisabled +Disabled + + + +0 16 + + +0 16 + + + +Disabled +Enabled + + + +1 8 + + + +Disabled +MinChannel +MidChannel +MaxChannel +MinChannelCW +MidChannelCW +MaxChannelCW + + + + +Mode1 +Mode2 + + + + +Disabled +TestChan1 +TestChan2 +TestChan3 +TestChan4 +TestChan5 +TestChan6 +TestChan7 +TestChan8 + + + +0 16 + + +0 16 + + +1 8 + + +0 40 + + +0 120 + + +0 31 + + + + +0:GPS,1:MAVLINK_SYSTEM_TIME,2:HW + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Servo +Relay + + + +ds +deciseconds +0 50 + + +PWM +PWM in microseconds +1000 2000 + + +PWM +PWM in microseconds +1000 2000 + + +m +meters +0 1000 + + + +Low +High + + + +ms +milliseconds +0 10000 + + +deg +degrees +0 180 + + + +Disabled +AUX1 +AUX2 +AUX3 +AUX4 +AUX5 +AUX6 + +True + + + +TriggerLow +TriggerHigh + + + + +Always +Only when in AUTO + + + + +Default +BMMCC + + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +UAVCAN +KDECAN +ToshibaCAN + +True + + + + + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + +Disabled +Major messages +All messages + + + + + + +Disabled +First driver +Second driver + +True + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + +0 32767 + + + + +cm +centimeters +0 10000 +100 + + +deg/s +degrees per second +-90 90 +1 + + + + +-400 400 +mGauss +milligauss +1 + + +-400 400 +mGauss +milligauss +1 + + +-400 400 +mGauss +milligauss +1 + + +-3.142 3.142 +rad +radians +0.01 + + + +Disabled +Internal-Learning +EKF-Learning +InFlight-Learning + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Use Throttle +Use Current + + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + +-400 400 +mGauss +milligauss +1 + + +-400 400 +mGauss +milligauss +1 + + +-400 400 +mGauss +milligauss +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + + +FirstCompass +SecondCompass +ThirdCompass + + + +-400 400 +mGauss +milligauss +1 + + +-400 400 +mGauss +milligauss +1 + + +-400 400 +mGauss +milligauss +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +True + + +True + + +True + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 + + + + +Internal +External +ForcedExternal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +4 32 + +Very Strict +Strict +Default +Relaxed + +0.1 + + +500 3000 +1 + + +0:HMC5883,1:LSM303D,2:AK8963,3:BMM150,4:LSM9DS1,5:LIS3MDL,6:AK09916,7:IST8310,8:ICM20948,9:MMC3416,11:UAVCAN,12:QMC5883,14:MAG3110,15:IST8308 + + +% +percent +0 100 +1 + + + +Disabled +CheckOnly +CheckAndFix + + + + + + + + + + +Disabled +Enabled + + + + + + +Disabled +Enabled + + + +0 2 +0.01 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.000001 0.001 +Hz +hertz + + +0.00001 0.005 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +2.0 6.0 +0.5 +m/s +meters per second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + +0 127 +1 +ms +milliseconds +True + + + +None +Navigation +Terrain + +True + + +0 500 +mGauss +milligauss + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +True +ms +milliseconds + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always +Use external yaw sensor + +True + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 250 +10 +True +ms +milliseconds + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.00001 0.005 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +True +ms +milliseconds + + +2.0 6.0 +0.5 +m/s +meters per second + + +0.5 2.5 +0.1 +m/s/s +meters per square second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + +0.05 0.5 +0.05 +m/s +meters per second + + +0.5 5.0 +0.1 +m/s +meters per second + + +0.01 1.0 +0.1 +m/s +meters per second + + + +None +Navigation +Terrain + +True + + + + + +Disabled +Enabled + + + + +None +Altitude +Circle +Altitude and Circle +Polygon +Altitude and Polygon +Circle and Polygon +All + +0:Altitude,1:Circle,2:Polygon + + + +Report Only +RTL or Land +Always Land +SmartRTL or RTL or Land +Brake or Land + + + +m +meters +10 1000 +1 + + +m +meters +30 10000 + + +m +meters +1 10 + + +1 20 + + +m +meters +-100 100 +1 + + + + + +None +PX4Flow +Pixart +Bebop +CXOF +MAVLink +UAVCAN + +True + + +-200 +200 +1 + + +-200 +200 +1 + + +-18000 +18000 +1 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +0 127 + + + +Disabled +Enabled + + + + + +Pa +pascal +1 +True +True + + +degC +degrees Celsius +1 +True + + +m +meters +0.1 + + + +FirstBaro +2ndBaro +3rdBaro + + + + +Disabled +Bus0 +Bus1 + + + +1.0:Freshwater,1.024:Saltwater + + +Pa +pascal +1 +True +True + + +Pa +pascal +1 +True +True + + +% +percent +0 100 +1 + + +0:BMP085,1:BMP280,2:MS5611,3:MS5607,4:MS5637,5:FBM320,6:DPS280,7:LPS25H,8:Keller,10:MS5837,11:BMP388 + +BMP085 +BMP280 +MS5611 +MS5607 +MS5637 +FBM320 +DPS280 +LPS25H +Keller +MS5837 +BMP388 + + + + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA +HemisphereNMEA + +True + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA +HemisphereNMEA + +True + + + +Portable +Stationary +Pedestrian +Automotive +Sea +Airborne1G +Airborne2G +Airborne4G + + + + +Disabled +UseBest +Blend +UseSecond + + + + +Any +FloatRTK +IntegerRTK + +True + + + +Disabled +Enabled +NoChange + + + +-100 90 +deg +degrees + + + +send to first GPS +send to 2nd GPS +send to all + + + + +None (0x0000) +All (0xFFFF) +External only (0xFF00) + + + + +Ignore +Always log +Stop logging when disarmed (SBF only) +Only log every five samples (uBlox only) + +True + + + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + + + +Do not save config +Save config +Save only when needed + + + + +Leave as currently configured +GPS-NoSBAS +GPS+SBAS +Galileo-NoSBAS +Galileo+SBAS +Beidou +GPS+IMES+QZSS+SBAS (Japan Only) +GLONASS +GLONASS+SBAS +GPS+GLONASS+SBAS + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLOSNASS + + + +Disables automatic configuration +Enable automatic configuration + + + +ms +milliseconds + +10Hz +8Hz +5Hz + +50 200 + + +ms +milliseconds + +10Hz +8Hz +5Hz + +50 200 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +ms +milliseconds +0 250 +True + + +ms +milliseconds +0 250 +True + + +0:Horiz Pos,1:Vert Pos,2:Speed + + +s +seconds +5.0 30.0 + + + + + +Disabled +Enabled + + + + +None +Servo +EPM + + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +0 255 +s +seconds + + +0 255 + + + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +rad/s +radians per second + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +0.8 1.2 + + +0.8 1.2 + + +0.8 1.2 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +m/s/s +meters per square second +-3.5 3.5 + + +Hz +hertz +0 256 + + +Hz +hertz +0 256 + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +0.05 50 + + + +Never +Start-up only + + + + +Don't adjust the trims +Assume first orientation was level +Assume ACC_BODYFIX is perfectly aligned to the vehicle + + + + +IMU 1 +IMU 2 +IMU 3 + + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +m +meters +-10 10 + + +True + + +True + + +True + + +True + + +True + + +True + + + +FirstIMUOnly +FirstAndSecondIMU + +0:FirstIMU,1:SecondIMU,2:ThirdIMU + + + +FirstIMUOnly +FirstAndSecondIMU +FirstSecondAndThirdIMU +AllIMUs + +0:FirstIMU,1:SecondIMU,2:ThirdIMU + + + + + +Disabled +Enabled + + + +10 400 +Hz +hertz + + +5 100 +Hz +hertz + + +5 30 +dB +decibel + + +0:1st harmonic,1:2nd harmonic,2:3rd harmonic,3:4th hamronic,4:5th harmonic,5:6th harmonic,6:7th harmonic,7:8th harmonic +True + + +0.1 0.9 +True + + + + +32 +True + + + +None +First IMU +All + +0:IMU1,1:IMU2,2:IMU3 +True + + +0:Sensor-Rate Logging (sample at full sensor rate seen by AP), 1: Sample post-filtering + + +ms +milliseconds +10 + + +1 + + + + + +Disabled +Enabled + + + +5 30 +dB +decibel + + +10 400 +Hz +hertz + + +5 100 +Hz +hertz + + + + + +Disabled +Pixhawk Aux1 +Pixhawk Aux2 +Pixhawk Aux3 +Pixhawk Aux4 +Pixhawk Aux5 +Pixhawk Aux6 +Pixhawk 3.3ADC1 +Pixhawk 3.3ADC2 +Pixhawk 6.6ADC + +True + + + +Low +High + + + + +Disabled +Pixhawk Aux1 +Pixhawk Aux2 +Pixhawk Aux3 +Pixhawk Aux4 +Pixhawk Aux5 +Pixhawk Aux6 +Pixhawk 3.3ADC1 +Pixhawk 3.3ADC2 +Pixhawk 6.6ADC + +True + + + +Low +High + + + + +Disabled +Pixhawk Aux1 +Pixhawk Aux2 +Pixhawk Aux3 +Pixhawk Aux4 +Pixhawk Aux5 +Pixhawk Aux6 +Pixhawk 3.3ADC1 +Pixhawk 3.3ADC2 +Pixhawk 6.6ADC + +True + + + +Low +High + + + + + + +None +File +MAVLink +File and MAVLink +Block +Block and MAVLink + +0:File,1:MAVLink,2:Block + + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +kB +kilobytes + + +s +seconds + + + + +deg +degrees +0 45 +1 + + +cm/s +centimeters per second +20 2000 +50 + + +cm/s/s +centimeters per square second +100 981 +1 + + +cm/s/s +centimeters per square second +25 250 +1 + + +cm/s/s/s +centimeters per cubic second +500 5000 +1 + + +s +seconds +0 2 +0.1 + + + + +0 32766 +1 +True + + + +Resume Mission +Restart Mission + + + +0:Clear Mission on reboot + + + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + +0 100 +1 + + +s +seconds +0.0 0.2 +.005 + + +s +seconds +0.0 0.2 +.005 + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + +True + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +1 + + +cdeg +centidegrees +-18000 17999 +1 + + +s +seconds +0.0 0.2 +.005 + + +s +seconds +0.0 0.2 +.005 + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + + + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + +0.0 1.5 +0.1 + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + +0 500 +PWM +PWM in microseconds + + +0.25 0.8 + + +0.9:Low, 0.95:Default, 1.0:High + + +6 35 +V +volt + + +6 35 +V +volt + + +0 200 +A +ampere + + + +Normal +OneShot +OneShot125 +Brushed +DShot150 +DShot300 +DShot600 +DShot1200 + +True + + +PWM +PWM in microseconds +0 2000 + + +PWM +PWM in microseconds +0 2000 + + +0.0:Low, 0.15:Default, 0.3:High + + +0.0:Low, 0.1:Default, 0.2:High + + +0 10 +s +seconds + + +0.2 0.8 + + + +Disabled + + + + +PWM enabled while disarmed +PWM disabled while disarmed + + + +5 80 +deg +degrees +1 + + +0 2 +s +seconds +0.1 + + +0 5 +0.1 + + + +First battery +Second battery + + + +0 .5 +s +seconds +0.001 + + +0 .5 +s +seconds +0.001 + + + + + +Off +Low +Medium +High + + + + +Disable +Enable + + + + +Standard +MAVLink +OutbackChallenge +TrafficLight + + + + +Disable +ssd1306 +sh1106 +SITL + + + + +Disabled +Aircraft +Rover + + + + +Disabled + + + +0:Build in LED, 1:Internal ToshibaLED, 2:External ToshibaLED, 3:External PCA9685, 4:Oreo LED, 5:UAVCAN, 6:NCP5623 External, 7:NCP5623 Internal, 8:NeoPixel + + + +LowIsOn +HighIsOn + + + +0 100 +% +percent + + + + + +None +LightWareSF40C +MAVLink +TeraRangerTower +RangeFinder +RPLidarA2 +TeraRangerTowerEvo +SITL +MorseSITL +AirSimSITL + +True + + + +Default +Upside Down + + + +deg +degrees +-180 180 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + +deg +degrees +0 360 + + +deg +degrees +0 45 + + + +None +LightWareSF40C +MAVLink +TeraRangerTower +RangeFinder +RPLidarA2 +TeraRangerTowerEvo + +True + + + +Default +Upside Down + + + +deg +degrees +-180 180 + + + + +Hz +hertz +0.5 5 +0.1 + + +1.000 3.000 + + +1.000 8.000 + + +0.500 1.500 +0.05 + + +0.000 3.000 + + +0 1000 +d% +decipercent + + +0.000 0.400 + + +1.000 100.000 +Hz +hertz + + +0.500 2.000 + + +0.1 6.0 +0.1 + + +0.02 1.00 +0.01 + + +0.00 1.00 +0.001 + + +0 4500 +10 +cm/s/s +centimeters per square second + + +0 100 +Hz +hertz + + +0 100 +Hz +hertz + + +deg +degrees +0 45 +1 + + + + + + +km +kilometers +0.1 + + + +DoNotIncludeHome +IncludeHome + + + + + +0.0 120.0 +s +seconds + + +0:Ignore RC Receiver, 1:Ignore MAVLink Overrides, 2:Ignore Receiver Failsafe + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +KillIMU1 +KillIMU2 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +KillIMU1 +KillIMU2 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +KillIMU1 +KillIMU2 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +KillIMU1 +KillIMU2 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +KillIMU1 +KillIMU2 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +KillIMU1 +KillIMU2 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +KillIMU1 +KillIMU2 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +KillIMU1 +KillIMU2 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +KillIMU1 +KillIMU2 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +KillIMU1 +KillIMU2 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +KillIMU1 +KillIMU2 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +KillIMU1 +KillIMU2 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +KillIMU1 +KillIMU2 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +KillIMU1 +KillIMU2 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +KillIMU1 +KillIMU2 + + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + +Do Nothing +ModeRTL +Camera Trigger +ModeAuto +Auto Mission Reset +Relay On/Off +Landing Gear +Relay2 On/Off +Lost Plane Sound +Motor Emergency Stop +Relay3 On/Off +Relay4 On/Off +ArmDisarm +InvertedFlight +RC Override Enable +ModeManual +ModeGuided +Clear Waypoints +Compass Learn +Reverse Throttle +GPS Disable +Relay5 +Relay6 +ModeCircle +KillIMU1 +KillIMU2 + + + + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True +1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8 + + +1 8 +1 +True +1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8 + + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Off +On +NoChange + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFMiniPlus + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFMiniPlus + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFMiniPlus + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFMiniPlus + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFMiniPlus + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFMiniPlus + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFMiniPlus + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFMiniPlus + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFMiniPlus + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLiteV2-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X +NMEA +WASP-LRF +BenewakeTF02 +BenewakeTFmini +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFMiniPlus + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters + + +m +meters + + +m +meters + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +PX4-PWM +AUXPIN + + + +0.001 + + +1 + + +1 + + +0.1 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +None +PX4-PWM +AUXPIN + + + +0.001 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + + + +Disabled +ShowSlips +ShowOverruns + + + + +50Hz +100Hz +200Hz +250Hz +300Hz +400Hz + +True + + + + + +None +Lua Scripts + +True + + +1000 1000000 +10000 + + +1024 1048576 +1024 +True + + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +460800 +500000 +921600 +1500000 + + + + +MAVlink1 +MAVLink2 + +True + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + +0 120 +s +seconds + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +256000 +500000 +921600 +1500000 + + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 4:Swap +True + + + + + +Disable +Enable + + + +25 400 +Hz +hertz + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +Flap_auto +Aileron +mount_pan +mount_tilt +mount_roll +mount_open +camera_trigger +release +mount2_pan +mount2_tilt +mount2_roll +mount2_open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +EPM +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +MotorTilt +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Choke +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +tiltMotorLeft +tiltMotorRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +Camera ISO +Camera Focus +Camera Shutter Speed +Script 1 +Script 2 +Script 3 +Script 4 +Script 5 +Script 6 +Script 7 +Script 8 +Script 9 +Script 10 +Script 11 +Script 12 +Script 13 +Script 14 +Script 15 +Script 16 + + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + +Disabled +Enabled + + + + +Disabled +TestMotor1 +TestMotor2 +TestMotor3 +TestMotor4 +TestMotor5 +TestMotor6 +TestMotor7 +TestMotor8 + + + +s +seconds +0 300 + + +Hz +hertz +0 500 + + + +Disabled +Enabled + + + + +None +OneShot +OneShot125 +Brushed +DShot150 +DShot300 +DShot600 +DShot1200 + + + + +Console +Telem1 +Telem2 +Telem3 +Telem4 +Telem5 + + + +1 127 + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + + +0 4095 + + +0 4095 + + + + +25 250 +Hz +hertz + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + +Hz +hertz +0 10 +1 + + + + + +Disable +Enable + + + +m +meters +1 + + + + +cm/s +centimeters per second +20 2000 +50 + + +cm +centimeters +5 1000 +1 + + +cm/s +centimeters per second +10 1000 +50 + + +cm/s +centimeters per second +10 500 +10 + + +cm/s/s +centimeters per square second +50 500 +10 + + +cm/s/s +centimeters per square second +50 500 +10 + + + +Disable +Enable + + + + diff --git a/src/FirmwarePlugin/APM/APMParameterFactMetaData.Sub.4.1.xml b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Sub.4.1.xml new file mode 100644 index 0000000..3fb0b59 --- /dev/null +++ b/src/FirmwarePlugin/APM/APMParameterFactMetaData.Sub.4.1.xml @@ -0,0 +1,15203 @@ + + + + + + +cm +centimeters +-100 0 + + +True + + +1 255 + + + + +Hz +hertz +0 10 +.5 + + + +None +Roll +Pitch +Yaw + +0:Roll,1:Pitch,2:Yaw + + +0.01 2.0 +0.01 + + + +Disabled +Warn only +Disarm +Enter depth hold mode +Enter surface mode + + + + +Disabled +Warn only +Enter surface mode + + + + +Disabled +Warn only + + + + +Disabled +Warn only + + + +Pa +pascal + + +degC +degrees Celsius + + + +Disarm +Hold Position +Surface + + + + +Disabled +Warn Only +Disarm + + + +s +seconds +0.1 3.0 + + +10 90 + + + +Never change yaw +Face next waypoint +Face next waypoint except RTL +Face along GPS course +Correct crosstrack error + + + +cm/s +centimeters per second +50 500 +10 + + +cm/s +centimeters per second +50 500 +10 + + +cm/s/s +centimeters per square second +50 500 +10 + + +0 300 +PWM +PWM in microseconds +1 + + + +Default +Default+RCIN +Default+IMU +Default+Motors +NearlyAll-AC315 +NearlyAll +All+FastATT +All+MotBatt +All+FastIMU +All+FastIMU+PID +All+FullIMU +Disabled + +0:ATTITUDE_FAST,1:ATTITUDE_MED,2:GPS,3:PM,4:CTUN,5:NTUN,6:RCIN,7:IMU,8:CMD,9:CURRENT,10:RCOUT,11:OPTFLOW,12:PID,13:COMPASS,14:INAV,15:CAMERA,17:MOTBATT,18:IMU_FAST,19:IMU_RAW + + +cdeg +centidegrees +10 +1000 8000 + + + +Disabled +Warn only +Disarm + + + +0.6:Strict,0.8:Default,1.0:Relaxed + + + +Disabled +Warn only +Disarm + + + +0.1 1.0 + + +0.2 1.0 + + +0.1 0.8 + + +1 10 + + +1 10 +PWM +PWM in microseconds + + +0.5 4.0 + + +True + +BlueROV1 +Vectored +Vectored_6DOF +Vectored_6DOF_90 +SimpleROV-3 +SimpleROV-4 +SimpleROV-5 +Custom + + + +Hz +hertz +50 490 +1 + + +1 10 + + +1 10 + + +0 3 +0.1 + + +0 3 +0.1 + + + +Disabled +Leveling +Leveling and Limited + + + + +Disabled +Very Low +Low +Medium +High +Very High + + + + + + + +0.0 1.0 +.01 + + + +Disabled +Enabled + + + +0.1 0.4 +.01 + + +0.1 0.4 +.01 + + +0 127 +m/s +meters per second +1 + + +rad +radians +-0.1745 +0.1745 +0.01 + + +rad +radians +-0.1745 +0.1745 +0.01 + + +rad +radians +-0.1745 +0.1745 +0.01 + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 +Custom + + + +0.001 0.5 +.01 + + +0 10 +1 + + + +Disabled +Enable EKF2 +Enable EKF3 +ExternalAHRS + + + +-180 180 +deg +degrees +1 + + +-180 180 +deg +degrees +1 + + +-180 180 +deg +degrees +1 + + + + +m/s/s +meters per square second +0.25 3.0 + + + +Disabled +ArmingOnly +ArmOrDisarm + + + +0:Land,1:VTOL Land,2:DO_LAND_START,3:Takeoff,4:VTOL Takeoff,5:Rallypoint + + +0:All,1:Barometer,2:Compass,3:GPS lock,4:INS,5:Parameters,6:RC Channels,7:Board voltage,8:Battery Level,10:Logging Available,11:Hardware safety switch,12:GPS Configuration,13:System,14:Mission,15:Rangefinder,16:Camera,17:AuxAuth,18:VisualOdometry,19:FFT + + + + + +None +I2C-MS4525D0 +Analog +I2C-MS5525 +I2C-MS5525 (0x76) +I2C-MS5525 (0x77) +I2C-SDP3X +I2C-DLVR-5in +UAVCAN +I2C-DLVR-10in +I2C-DLVR-20in +I2C-DLVR-30in +I2C-DLVR-60in +NMEA water speed +MSP +ASP5033 + + + + +DoNotUse +Use +UseWhenZeroThrottle + + + +0.1 + + +0.1 + + + + + + + + + +Disable +Enable + + + + + + +Bus0(internal) +Bus1(external) +Bus2(auxillary) + + + + +FirstSensor +2ndSensor + + + +0:Disable sensor, 1:Re-enable sensor + + +m/s +meters per second + + +m/s +meters per second + + + +None +I2C-MS4525D0 +Analog +I2C-MS5525 +I2C-MS5525 (0x76) +I2C-MS5525 (0x77) +I2C-SDP3X +I2C-DLVR-5in +UAVCAN +I2C-DLVR-10in +I2C-DLVR-20in +I2C-DLVR-30in +I2C-DLVR-60in +NMEA water speed +MSP +ASP5033 + + + + +Don't Use +use +UseWhenZeroThrottle + + + +0.1 + + +0.1 + + + + + + + + + +Disable +Enable + + + + + + +Bus0(internal) +Bus1(external) +Bus2(auxillary) + + + + + +cdeg/s +centidegrees per second +500 18000 +100 + + +cdeg/s/s +centidegrees per square second +0 72000 + +Disabled +VerySlow +Slow +Medium +Fast + +1000 + + + +Disabled +Enabled + + + +cdeg/s/s +centidegrees per square second +0 180000 +1000 + +Disabled +VerySlow +Slow +Medium +Fast + + + +cdeg/s/s +centidegrees per square second +0 180000 +1000 + +Disabled +VerySlow +Slow +Medium +Fast + + + + +Disabled +Enabled + + + +0.0 12.000 + + +0.0 12.000 + + +0.0 6.000 + + +0.5 10.0 + + +deg/s +degrees per second +0 1080 +1 + +Disabled +Slow +Medium +Fast + + + +deg/s +degrees per second +0 1080 +1 + +Disabled +Slow +Medium +Fast + + + +deg/s +degrees per second +0 1080 +1 + +Disabled +Slow +Medium +Fast + + + +s +seconds +0 1 +0.01 +0.5:Very Soft,0.2:Soft,0.15:Medium,0.1:Crisp,0.05:Very Crisp + + +0.0 0.30 +0.005 + + +0.0 0.5 +0.01 + + +0 1 +0.01 + + +0.0 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz +hertz + + +1 100 +1 +Hz +hertz + + +1 100 +1 +Hz +hertz + + +0 200 +0.5 + + +0.0 0.30 +0.005 + + +0.0 0.5 +0.01 + + +0 1 +0.01 + + +0.0 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz +hertz + + +1 100 +1 +Hz +hertz + + +1 100 +1 +Hz +hertz + + +0 200 +0.5 + + +0.0 0.50 +0.005 + + +0.0 0.05 +0.01 + + +0 1 +0.01 + + +0.000 0.02 +0.001 + + +0 0.5 +0.001 + + +1 100 +1 +Hz +hertz + + +1 100 +1 +Hz +hertz + + +1 100 +1 +Hz +hertz + + +0 200 +0.5 + + +0.1 0.25 + + +0.5 0.9 + + +0.5 0.9 + + +1 100 +1 +Hz +hertz + + +1 100 +1 +Hz +hertz + + +1 100 +1 +Hz +hertz + + + + +0:UseFence,1:UseProximitySensor,2:UseBeaconFence + + +m +meters +1 10 + + +m/s +meters per second +0 2 + + +m/s/s +meters per square second +0 9 + + +m +meters +0 2 + + + + +Pa +pascal +1 +True +True + + +degC +degrees Celsius +1 +True + + +m +meters +0.1 + + + +FirstBaro +2ndBaro +3rdBaro + + + + +Disabled +Bus0 +Bus1 + + + +1.0:Freshwater,1.024:Saltwater + + +Pa +pascal +1 +True +True + + +Pa +pascal +1 +True +True + + +% +percent +0 100 +1 + + +0:BMP085,1:BMP280,2:MS5611,3:MS5607,4:MS5637,5:FBM320,6:DPS280,7:LPS25H,8:Keller,9:MS5837,10:BMP388,11:SPL06,12:MSP + + +True + + +True + + +True + + + + + +Disabled +Enabled + + + +-1.0 1.0 +0.05 + + +-1.0 1.0 +0.05 + + +-1.0 1.0 +0.05 + + +-1.0 1.0 +0.05 + + + + + +Disabled +Enabled + + + +-1.0 1.0 +0.05 + + +-1.0 1.0 +0.05 + + +-1.0 1.0 +0.05 + + +-1.0 1.0 +0.05 + + + + + +Disabled +Enabled + + + +-1.0 1.0 +0.05 + + +-1.0 1.0 +0.05 + + +-1.0 1.0 +0.05 + + +-1.0 1.0 +0.05 + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Generic +UAVCAN-BatteryInfo +ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign +SMBus-Maxell +Generator-Elec +Generator-Fuel +Rotoye + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Navigator +Pixhawk2_PM2/CubeOrange_PM2 +CubeOrange +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +CubeOrange_PM2/Navigator +Pixhawk2_PM2 +CubeOrange +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + +0:Ignore UAVCAN SoC + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Generic +UAVCAN-BatteryInfo +ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign +SMBus-Maxell +Generator-Elec +Generator-Fuel +Rotoye + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Navigator +Pixhawk2_PM2/CubeOrange_PM2 +CubeOrange +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +CubeOrange_PM2/Navigator +Pixhawk2_PM2 +CubeOrange +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + +0:Ignore UAVCAN SoC + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Generic +UAVCAN-BatteryInfo +ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign +SMBus-Maxell +Generator-Elec +Generator-Fuel +Rotoye + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Navigator +Pixhawk2_PM2/CubeOrange_PM2 +CubeOrange +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +CubeOrange_PM2/Navigator +Pixhawk2_PM2 +CubeOrange +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + +0:Ignore UAVCAN SoC + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Generic +UAVCAN-BatteryInfo +ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign +SMBus-Maxell +Generator-Elec +Generator-Fuel +Rotoye + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Navigator +Pixhawk2_PM2/CubeOrange_PM2 +CubeOrange +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +CubeOrange_PM2/Navigator +Pixhawk2_PM2 +CubeOrange +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + +0:Ignore UAVCAN SoC + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Generic +UAVCAN-BatteryInfo +ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign +SMBus-Maxell +Generator-Elec +Generator-Fuel +Rotoye + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Navigator +Pixhawk2_PM2/CubeOrange_PM2 +CubeOrange +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +CubeOrange_PM2/Navigator +Pixhawk2_PM2 +CubeOrange +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + +0:Ignore UAVCAN SoC + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Generic +UAVCAN-BatteryInfo +ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign +SMBus-Maxell +Generator-Elec +Generator-Fuel +Rotoye + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Navigator +Pixhawk2_PM2/CubeOrange_PM2 +CubeOrange +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +CubeOrange_PM2/Navigator +Pixhawk2_PM2 +CubeOrange +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + +0:Ignore UAVCAN SoC + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Generic +UAVCAN-BatteryInfo +ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign +SMBus-Maxell +Generator-Elec +Generator-Fuel +Rotoye + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Navigator +Pixhawk2_PM2/CubeOrange_PM2 +CubeOrange +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +CubeOrange_PM2/Navigator +Pixhawk2_PM2 +CubeOrange +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + +0:Ignore UAVCAN SoC + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Generic +UAVCAN-BatteryInfo +ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign +SMBus-Maxell +Generator-Elec +Generator-Fuel +Rotoye + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Navigator +Pixhawk2_PM2/CubeOrange_PM2 +CubeOrange +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +CubeOrange_PM2/Navigator +Pixhawk2_PM2 +CubeOrange +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + +0:Ignore UAVCAN SoC + + + + + +Disabled +Analog Voltage Only +Analog Voltage and Current +Solo +Bebop +SMBus-Generic +UAVCAN-BatteryInfo +ESC +SumOfFollowing +FuelFlow +FuelLevelPWM +SMBUS-SUI3 +SMBUS-SUI6 +NeoDesign +SMBus-Maxell +Generator-Elec +Generator-Fuel +Rotoye + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +Navigator +Pixhawk2_PM2/CubeOrange_PM2 +CubeOrange +Durandal +PX4-v1 + +True + + + +Disabled +Pixhawk/Pixracer/Navio2/Pixhawk2_PM1 +CubeOrange_PM2/Navigator +Pixhawk2_PM2 +CubeOrange +Durandal +PX4-v1 + +True + + + + +A/V +ampere per volt + + +V +volt + + +mAh +milliampere hour +50 + + + + +s +seconds +1 +0 120 + + + +Raw Voltage +Sag Compensated Voltage + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + + +None +Disarm +Enter surface mode + + + + +None +Disarm +Enter surface mode + + + +V +volt +0.1 + + +mAh +milliampere hour +50 + + +0 3 + + +0:Ignore UAVCAN SoC + + + + + +No PWMs +One PWMs +Two PWMs +Three PWMs +Four PWMs +Five PWMs +Six PWMs +Seven PWMs +Eight PWMs + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled +Auto + +True + + + +Disabled +Enabled + +True + + + +Disabled +50Hz +75Hz +100Hz +150Hz +200Hz +250Hz +300Hz + +True + + +-32768 32767 + + +0:Output1,1:Output2,2:Output3,3:Output4,4:Output5,5:Output6,6:Output7,7:Output8,8:Output9,9:Output10,10:Output11,11:Output12,12:Output13,13:Output14 +True + + +-1 80 +degC +degrees Celsius + + + +AUTO +PX4V1 +Pixhawk +Cube/Pixhawk2 +Pixracer +PixhawkMini +Pixhawk2Slim +Intel Aero FC +Pixhawk Pro +AUAV2.1 +PCNC1 +MINDPXV2 +SP01 +CUAVv5/FMUV5 +VRX BRAIN51 +VRX BRAIN52 +VRX BRAIN52E +VRX UBRAIN51 +VRX UBRAIN52 +VRX CORE10 +VRX BRAIN54 +PX4 FMUV6 +PX4 OLDDRIVERS + +True + + + +Disabled +Enabled + +True + + +0:ActiveForSafetyEnable,1:ActiveForSafetyDisable,2:ActiveWhenArmed,3:Force safety on when the aircraft disarms + + +V +volt +4.0 5.5 +0.1 + + +V +volt +3.3 12.0 +0.1 + + +0 32 +1 + + + +3.3V +5V + + + +0:Enable hardware watchdog, 1:Disable MAVftp, 2:Enable set of internal parameters, 3:Enable Debug Pins + + +0 10000 +ms +milliseconds + + +1 500 +1 + + +0 1 +0.1 + + +0 100 +1 + + +0 10 +1 +True + + + + + +None +CYRF6936 +CC2500 +BK2425 + + + + +Auto +DSM2 +DSMX + + + +0 4 + + + +NotDisabled +Disabled + + + +0 16 + + +0 16 + + + +Disabled +Enabled + + + +1 8 + + + +Disabled +MinChannel +MidChannel +MaxChannel +MinChannelCW +MidChannelCW +MaxChannelCW + + + + +Mode1 +Mode2 + + + + +Disabled +TestChan1 +TestChan2 +TestChan3 +TestChan4 +TestChan5 +TestChan6 +TestChan7 +TestChan8 + + + +0 16 + + +0 16 + + +1 8 + + +0 40 + + +0 120 + + +0 31 + + + + +0:GPS,1:MAVLINK_SYSTEM_TIME,2:HW + + +-720 +840 + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + +Disabled +shift +arm_toggle +arm +disarm +mode_manual +mode_stabilize +mode_depth_hold +mode_poshold +mode_auto +mode_circle +mode_guided +mode_acro +mount_center +mount_tilt_up +mount_tilt_down +camera_trigger +camera_source_toggle +mount_pan_right +mount_pan_left +lights1_cycle +lights1_brighter +lights1_dimmer +lights2_cycle +lights2_brighter +lights2_dimmer +gain_toggle +gain_inc +gain_dec +trim_roll_inc +trim_roll_dec +trim_pitch_inc +trim_pitch_dec +input_hold_set +roll_pitch_toggle +relay_1_on +relay_1_off +relay_1_toggle +relay_2_on +relay_2_off +relay_2_toggle +relay_3_on +relay_3_off +relay_3_toggle +servo_1_inc +servo_1_dec +servo_1_min +servo_1_max +servo_1_center +servo_2_inc +servo_2_dec +servo_2_min +servo_2_max +servo_2_center +servo_3_inc +servo_3_dec +servo_3_min +servo_3_max +servo_3_center +servo_1_min_momentary +servo_1_max_momentary +servo_1_min_toggle +servo_1_max_toggle +servo_2_min_momentary +servo_2_max_momentary +servo_2_min_toggle +servo_2_max_toggle +servo_3_min_momentary +servo_3_max_momentary +servo_3_min_toggle +servo_3_max_toggle +custom_1 +custom_2 +custom_3 +custom_4 +custom_5 +custom_6 +relay_4_on +relay_4_off +relay_4_toggle +relay_1_momentary +relay_2_momentary +relay_3_momentary +relay_4_momentary + + + + + + +Servo +Relay +GoPro in Solo Gimbal + + + +ds +deciseconds +0 50 + + +PWM +PWM in microseconds +1000 2000 + + +PWM +PWM in microseconds +1000 2000 + + +m +meters +0 1000 + + + +Low +High + + + +ms +milliseconds +0 10000 + + +deg +degrees +0 180 + + + +Disabled +AUX1 +AUX2 +AUX3 +AUX4 +AUX5 +AUX6 + +True + + + +TriggerLow +TriggerHigh + + + + +Always +Only when in AUTO + + + + +Default +BMMCC + + + + + + +Disabled +RunCam Split Micro/RunCam with UART +RunCam Split +RunCam Split4 4k +RunCam Hybrid + + + +0:Power Button,1:WiFi Button,2:Change Mode,3:5-Key OSD,4:Settings Access,5:DisplayPort,6:Start Recording,7:Stop Recording + + + + + + + + +0:Stick yaw right,1:Stick roll right,2:3-position switch,3:2-position switch,4:Autorecording enabled + + + + +0 4 + +Log None +Log Error +Log Warning and below +Log Info and below +Log Everything + + + + + + +Disabled +UAVCAN +ToshibaCAN +PiccoloCAN +CANTester +KDECAN +PacketDigitalCAN + +True + + + + + + + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +Hz +hertz +1 500 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15, 15: Servo 16 + + +Hz +hertz +1 500 + + + + +0 4 + +TEST_NONE +TEST_LOOPBACK +TEST_BUSOFF_RECOVERY +TEST_UAVCAN_DNA +TEST_TOSHIBA_CAN +TEST_KDE_CAN +TEST_UAVCAN_ESC + + + +us +microseconds + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + +0:ClearDNADatabase,1:IgnoreDNANodeConflicts + + + + + +Disabled +UAVCAN +ToshibaCAN +PiccoloCAN +CANTester +KDECAN +PacketDigitalCAN + +True + + + + + + + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +Hz +hertz +1 500 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15, 15: Servo 16 + + +Hz +hertz +1 500 + + + + +0 4 + +TEST_NONE +TEST_LOOPBACK +TEST_BUSOFF_RECOVERY +TEST_UAVCAN_DNA +TEST_TOSHIBA_CAN +TEST_KDE_CAN +TEST_UAVCAN_ESC + + + +us +microseconds + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + +0:ClearDNADatabase,1:IgnoreDNANodeConflicts + + + + + +Disabled +UAVCAN +ToshibaCAN +PiccoloCAN +CANTester +KDECAN +PacketDigitalCAN + +True + + + + + + + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +Hz +hertz +1 500 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15, 15: Servo 16 + + +Hz +hertz +1 500 + + + + +0 4 + +TEST_NONE +TEST_LOOPBACK +TEST_BUSOFF_RECOVERY +TEST_UAVCAN_DNA +TEST_TOSHIBA_CAN +TEST_KDE_CAN +TEST_UAVCAN_ESC + + + +us +microseconds + + + + +1 250 + + +0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15 + + +0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16 + + +1 200 +Hz +hertz + + +0:ClearDNADatabase,1:IgnoreDNANodeConflicts + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + + + +Disabled +First driver +Second driver + +True + + +10000 1000000 + + + + + +Disabled +First interface +Second interface + +True + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + +0 127 + + +0 127 + + + + +cm +centimeters +0 200000 +100 + + +deg/s +degrees per second +-90 90 +1 + + +0:manual control, 1:face direction of travel, 2:Start at center rather than on perimeter + + + + +-400 400 +mGauss +milligauss +1 +1 + + +-400 400 +mGauss +milligauss +1 +1 + + +-400 400 +mGauss +milligauss +1 + + +-3.142 3.142 +rad +radians +0.01 + + + +Disabled +Internal-Learning +EKF-Learning +InFlight-Learning + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Use Throttle +Use Current + +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 +Custom + + + + +Internal +External +ForcedExternal + + + +-400 400 +mGauss +milligauss +1 +1 + + +-400 400 +mGauss +milligauss +1 +1 + + +-400 400 +mGauss +milligauss +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +-400 400 +mGauss +milligauss +1 +1 + + +-400 400 +mGauss +milligauss +1 +1 + + +-400 400 +mGauss +milligauss +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 +1 + + +-1000 1000 +mGauss/A +milligauss per ampere +1 + + +True + + +True + + +True + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 +Custom + + + + +Internal +External +ForcedExternal + + + + +Disabled +Enabled + + + + +None +Yaw45 +Yaw90 +Yaw135 +Yaw180 +Yaw225 +Yaw270 +Yaw315 +Roll180 +Roll180Yaw45 +Roll180Yaw90 +Roll180Yaw135 +Pitch180 +Roll180Yaw225 +Roll180Yaw270 +Roll180Yaw315 +Roll90 +Roll90Yaw45 +Roll90Yaw90 +Roll90Yaw135 +Roll270 +Roll270Yaw45 +Roll270Yaw90 +Roll270Yaw135 +Pitch90 +Pitch270 +Pitch180Yaw90 +Pitch180Yaw270 +Roll90Pitch90 +Roll180Pitch90 +Roll270Pitch90 +Roll90Pitch180 +Roll270Pitch180 +Roll90Pitch270 +Roll180Pitch270 +Roll270Pitch270 +Roll90Pitch180Yaw90 +Roll90Yaw270 +Yaw293Pitch68Roll180 +Pitch315 +Roll90Pitch315 +Custom + + + + +Internal +External +ForcedExternal + + + +1 + + +1 + + + + +1 + + +1 + + + + +1 + + +1 + + + + +1 + + +1 + + + + +1 + + +1 + + + + +1 + + +1 + + + + +4 32 + +Very Strict +Strict +Default +Relaxed + +0.1 + + +500 3000 +1 + + +0:HMC5883,1:LSM303D,2:AK8963,3:BMM150,4:LSM9DS1,5:LIS3MDL,6:AK09916,7:IST8310,8:ICM20948,9:MMC3416,11:UAVCAN,12:QMC5883,14:MAG3110,15:IST8308,16:RM3100,17:MSP,18:ExternalAHRS + + +% +percent +0 100 +1 + + + +Disabled +CheckOnly +CheckAndFix + + + +True + + +True + + +True + + + +Disabled +Enabled + + + +0 1.3 + + +0 1.3 + + +0 1.3 + + +0:CalRequireGPS + + +True + + +True + + +True + + +True + + +True + + +-180 180 +deg +degrees +1 +True + + +-180 180 +deg +degrees +1 +True + + +-180 180 +deg +degrees +1 +True + + + + + +Disabled +Enabled + + + +0 2 +0.01 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +None +VectorNav + + + +Hz +hertz + + + + + +Disabled +Enabled + +True + + + +GPS 3D Vel and 2D Pos +GPS 2D vel and 2D pos +GPS 2D pos +No GPS + + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + + +Use Baro +Use Range Finder +Use GPS +Use Range Beacon + +True + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +ms +milliseconds +True + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always + + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.000001 0.001 +Hz +hertz + + +0.00001 0.005 +m/s/s/s +meters per cubic second + + +0.01 1.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 127 +10 +ms +milliseconds +True + + +2.0 6.0 +0.5 +m/s +meters per second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + + +None +Navigation +Terrain + +True + + +0 500 +mGauss +milligauss + + +0.1 30.0 +Hz +hertz +False + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +1 10 +1 +True + + + + + +Disabled +Enabled + +True + + +0.05 5.0 +0.05 +m/s +meters per second + + +0.05 5.0 +0.05 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +10 100 +5 +m +meters + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +True +ms +milliseconds + + +0.01 0.5 +0.01 +Gauss +gauss + + + +When flying +When manoeuvring +Never +After first climb yaw reset +Always +Use external yaw sensor (Deprecated in 4.1+ see EK3_SRCn_YAW) +External yaw sensor with compass fallback (Deprecated in 4.1+ see EK3_SRCn_YAW) + +True + + +100 1000 +25 + + +0.5 5.0 +0.1 +m/s +meters per second + + +100 1000 +25 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +1.0 4.0 +0.1 +rad/s +radians per second + + +0.05 1.0 +0.05 +rad/s +radians per second + + +100 1000 +25 + + +0 250 +10 +True +ms +milliseconds + + +0.0001 0.1 +0.0001 +rad/s +radians per second + + +0.01 1.0 +0.01 +m/s/s +meters per square second + + +0.00001 0.001 +rad/s/s +radians per square second + + +0.00001 0.005 +m/s/s/s +meters per cubic second + + +0.01 2.0 +0.1 +m/s/s +meters per square second + + +0.0 2.0 +0.1 + + +0:NSats,1:HDoP,2:speed error,3:position error,4:yaw error,5:pos drift,6:vert speed,7:horiz speed + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU,3:FourthIMU,4:FifthIMU,5:SixthIMU +True + + +50 200 +% +percent + + +0.5 50.0 +m +meters + + +0:Always,1:WhenNoYawSensor +True + + +0.05 1.0 +0.05 +rad +radians + + +100 1000 +25 + + +10 50 +5 +cs +centiseconds + + +0.00001 0.01 +Gauss/s +gauss per second + + +0.00001 0.01 +Gauss/s +gauss per second + + +-1 70 +1 +% +percent + + +0 0.2 +0.01 + + +0.1 10.0 +0.1 +m +meters + + +100 1000 +25 + + +0 250 +10 +True +ms +milliseconds + + +2.0 6.0 +0.5 +m/s +meters per second + + +0.5 2.5 +0.1 +m/s/s +meters per square second + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:Correct when using Baro height,1:Correct when using range finder height,2:Apply corrections to local position +True + + +0.05 0.5 +0.05 +m/s +meters per second + + +0.5 5.0 +0.1 +m/s +meters per second + + +0.01 1.0 +0.1 +m/s +meters per second + + + +None +Navigation +Terrain + +True + + +0.1 30.0 +Hz +hertz +False + + +0 500 +mGauss +milligauss + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +0:FirstEKF,1:SecondEKF,2:ThirdEKF,3:FourthEKF,4:FifthEKF,5:SixthEKF +True + + +1 10 +1 +True + + +0.05 1 +0.05 + + +0:EnableGPSAffinity,1:EnableBaroAffinity,2:EnableCompassAffinity,3:EnableAirspeedAffinity +True + + +0.0 1000.0 +kg/m/m +kilograms per square meter + + +50.0 1000.0 +kg/m/m +kilograms per square meter + + +0.1 2.0 +0.1 +m/s/s +meters per square second + + +0.0 1.0 +0.01 +1/s +per second + + +1.0 10.0 +0.5 + + +0.0 10.0 +0.5 + + +0 2 +1 + + + + + +None +GPS +Beacon +ExternalNav + + + + +None +GPS +Beacon +OpticalFlow +ExternalNav +WheelEncoder + + + + +None +Baro +RangeFinder +GPS +Beacon +ExternalNav + + + + +None +GPS +Beacon +ExternalNav + + + + +None +Compass +GPS +GPS with Compass Fallback +ExternalNav +GSF + + + + +None +GPS +Beacon +ExternalNav + + + + +None +GPS +Beacon +OpticalFlow +ExternalNav +WheelEncoder + + + + +None +Baro +RangeFinder +GPS +Beacon +ExternalNav + + + + +None +GPS +Beacon +ExternalNav + + + + +None +Compass +GPS +GPS with Compass Fallback +ExternalNav +GSF + + + + +None +GPS +Beacon +ExternalNav + + + + +None +GPS +Beacon +OpticalFlow +ExternalNav +WheelEncoder + + + + +None +Baro +RangeFinder +GPS +Beacon +ExternalNav + + + + +None +GPS +Beacon +ExternalNav + + + + +None +Compass +GPS +GPS with Compass Fallback +ExternalNav +GSF + + + +0:FuseAllVelocities + + + + + +Disabled +Enabled + + + +0:Max altitude,1:Circle,2:Polygon,3:Min altitude + + + +Report Only +RTL or Land + + + +m +meters +10 1000 +1 + + +m +meters +30 10000 + + +m +meters +1 10 + + +1 20 + + +m +meters +-100 100 +1 + + + + + +Disabled +Enabled + +True + + +20 400 +Hz +hertz + + +20 495 +Hz +hertz + + +0 4 +True + + +32 1024 +True + + +0 0.9 +True + + +0 250 + + +0.01 0.9 + + +0.0 100.0 + + +0 100 + + +0 200 + + +0 100 +True + + + +Auto +Center Frequency +Lower-Shoulder Frequency +Upper-Shoulder Frequency +Roll-Axis +Pitch-Axis + + + + + + +None +PX4Flow +Pixart +Bebop +CXOF +MAVLink +UAVCAN +MSP +UPFLOW + +True + + +-200 +200 +1 + + +-200 +200 +1 + + +cdeg +centidegrees +-17999 +18000 +10 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +0 127 + + + + + +Disable +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 + + + + +Disable +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 + + + + +Disable +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 + + + + +Disable +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 + + + + + + +Disabled +IE 650w 800w Fuel Cell +IE 2.4kW Fuel Cell +Richenpower + +True + + + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA +HemisphereNMEA +uBlox-MovingBaseline-Base +uBlox-MovingBaseline-Rover +MSP +AllyStar +ExternalAHRS + +True + + + +None +AUTO +uBlox +MTK +MTK19 +NMEA +SiRF +HIL +SwiftNav +UAVCAN +SBF +GSOF +ERB +MAV +NOVA +HemisphereNMEA +uBlox-MovingBaseline-Base +uBlox-MovingBaseline-Rover +MSP +AllyStar +ExternalAHRS + +True + + + +Portable +Stationary +Pedestrian +Automotive +Sea +Airborne1G +Airborne2G +Airborne4G + + + + +Use primary +UseBest +Blend +Use primary if 3D fix or better + + + + +Any +FloatRTK +IntegerRTK + +True + + + +Disabled +Enabled +NoChange + + + +-100 90 +deg +degrees + + + +send to first GPS +send to 2nd GPS +send to all + + + + +None (0x0000) +All (0xFFFF) +External only (0xFF00) + + + + +Ignore +Always log +Stop logging when disarmed (SBF only) +Only log every five samples (uBlox only) + +True + + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLONASS + + + +Do not save config +Save config +Save only when needed + + + +0:GPS,1:SBAS,2:Galileo,3:Beidou,4:IMES,5:QZSS,6:GLONASS + + + +Disables automatic configuration +Enable automatic configuration + + + +ms +milliseconds + +10Hz +8Hz +5Hz + +50 200 + + +ms +milliseconds + +10Hz +8Hz +5Hz + +50 200 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +ms +milliseconds +0 250 +True + + +ms +milliseconds +0 250 +True + + +0:Horiz Pos,1:Vert Pos,2:Speed + + +s +seconds +5.0 30.0 + + +0:Use UART2 for moving baseline on ublox,1:Use base station for GPS yaw on SBF,2:Use baudrate 115200 + + +0 10 +1 +True + + +0 10 +1 +True + + +1 + +FirstGPS +SecondGPS + + + +True + + +True + + + + + + + + + +Relative to alternate GPS instance +RelativeToCustomBase + +True + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + + + + +Relative to alternate GPS instance +RelativeToCustomBase + +True + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + + + + +Disabled +Enabled + + + + +None +Servo +EPM + + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +1000 2000 +PWM +PWM in microseconds + + +0 255 +s +seconds + + +0 255 + + + + +rad/s +radians per second +1 + + +rad/s +radians per second +1 + + +rad/s +radians per second +1 + + +rad/s +radians per second +1 + + +rad/s +radians per second +1 + + +rad/s +radians per second +1 + + +rad/s +radians per second +1 + + +rad/s +radians per second +1 + + +rad/s +radians per second +1 + + +0.8 1.2 +1 + + +0.8 1.2 +1 + + +0.8 1.2 +1 + + +m/s/s +meters per square second +-3.5 3.5 +1 + + +m/s/s +meters per square second +-3.5 3.5 +1 + + +m/s/s +meters per square second +-3.5 3.5 +1 + + +0.8 1.2 +1 + + +0.8 1.2 +1 + + +0.8 1.2 +1 + + +m/s/s +meters per square second +-3.5 3.5 +1 + + +m/s/s +meters per square second +-3.5 3.5 +1 + + +m/s/s +meters per square second +-3.5 3.5 +1 + + +0.8 1.2 +1 + + +0.8 1.2 +1 + + +0.8 1.2 +1 + + +m/s/s +meters per square second +-3.5 3.5 +1 + + +m/s/s +meters per square second +-3.5 3.5 +1 + + +m/s/s +meters per square second +-3.5 3.5 +1 + + +Hz +hertz +0 256 + + +Hz +hertz +0 256 + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +0.05 50 + + + +Never +Start-up only + + + + +Don't adjust the trims +Assume first orientation was level +Assume ACC_BODYFIX is perfectly aligned to the vehicle + + + + +IMU 1 +IMU 2 +IMU 3 + + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-10 10 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +True + + +True + + +True + + +True + + +True + + +True + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU + + +0:FirstIMU,1:SecondIMU,2:ThirdIMU + + + +1kHz +2kHz +4kHz +8kHz + +True + + +degC +degrees Celsius +1 + + +degC +degrees Celsius +1 + + +degC +degrees Celsius +1 + + +degC +degrees Celsius +1 + + +degC +degrees Celsius +1 + + +degC +degrees Celsius +1 + + +0:PersistParams + + + + + +Disabled +Enabled + + + +10 495 +Hz +hertz + + +5 250 +Hz +hertz + + +5 50 +dB +decibel + + +0:1st harmonic,1:2nd harmonic,2:3rd harmonic,3:4th hamronic,4:5th harmonic,5:6th harmonic,6:7th harmonic,7:8th harmonic +True + + +0.0 1.0 +True + + +0 4 + +Disabled +Throttle +RPM Sensor +ESC Telemetry +Dynamic FFT + + + +0:Double notch,1:Dynamic harmonic,2:Update at loop rate +True + + + + +32 +True + + +0:IMU1,1:IMU2,2:IMU3 +True + + +0:Sensor-Rate Logging (sample at full sensor rate seen by AP), 1: Sample post-filtering + + +ms +milliseconds +10 + + +1 + + + + + +Disabled +Enabled + + + +5 30 +dB +decibel + + +10 400 +Hz +hertz + + +5 100 +Hz +hertz + + + + + +Disabled +Enabled +LearnCalibration + +True + + +-70 80 +degC +degrees Celsius +1 + + +-70 80 +degC +degrees Celsius +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + + + +Disabled +Enabled +LearnCalibration + +True + + +-70 80 +degC +degrees Celsius +1 + + +-70 80 +degC +degrees Celsius +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + + + +Disabled +Enabled +LearnCalibration + +True + + +-70 80 +degC +degrees Celsius +1 + + +-70 80 +degC +degrees Celsius +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + + + +Disabled +Pixhawk Aux1 +Pixhawk Aux2 +Pixhawk Aux3 +Pixhawk Aux4 +Pixhawk Aux5 +Pixhawk Aux6 +Pixhawk 3.3ADC1 +Pixhawk 3.3ADC2 +Pixhawk 6.6ADC +Navigator Built-In + +True + + + +Low +High + + + + +Disabled +Pixhawk Aux1 +Pixhawk Aux2 +Pixhawk Aux3 +Pixhawk Aux4 +Pixhawk Aux5 +Pixhawk Aux6 +Pixhawk 3.3ADC1 +Pixhawk 3.3ADC2 +Pixhawk 6.6ADC +Navigator Leak1 + +True + + + +Low +High + + + + +Disabled +Pixhawk Aux1 +Pixhawk Aux2 +Pixhawk Aux3 +Pixhawk Aux4 +Pixhawk Aux5 +Pixhawk Aux6 +Pixhawk 3.3ADC1 +Pixhawk 3.3ADC2 +Pixhawk 6.6ADC +Navigator Leak1 + +True + + + +Low +High + + + + + +0:File,1:MAVLink,2:Block + + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + +kB +kilobytes + + +s +seconds + + +MB +megabyte +10 1000 + + + + +deg +degrees +0 45 +1 + + +cm/s +centimeters per second +20 3500 +50 + + +cm/s/s +centimeters per square second +100 981 +1 + + +cm/s/s +centimeters per square second +25 250 +1 + + +cm/s/s/s +centimeters per cubic second +500 5000 +1 + + +s +seconds +0 2 +0.1 + + + + +0 32766 +1 +True + + + +Resume Mission +Restart Mission + + + +0:Clear Mission on reboot + + + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + +True + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +10 + + +cdeg +centidegrees +-18000 17999 +10 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +10 + + +cdeg +centidegrees +-18000 17999 +10 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +10 + + +cdeg +centidegrees +-18000 17999 +10 + + +0 100 +1 + + +s +seconds +0.0 0.2 +.005 + + +s +seconds +0.0 0.2 +.005 + + + +Retracted +Neutral +MavLink Targeting +RC Targeting +GPS Point + + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + +deg +degrees +-180.00 179.99 +1 + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +Enabled + + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +10 + + +cdeg +centidegrees +-18000 17999 +10 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +10 + + +cdeg +centidegrees +-18000 17999 +10 + + + +Disabled +RC5 +RC6 +RC7 +RC8 +RC9 +RC10 +RC11 +RC12 + + + +cdeg +centidegrees +-18000 17999 +10 + + +cdeg +centidegrees +-18000 17999 +10 + + +s +seconds +0.0 0.2 +.005 + + +s +seconds +0.0 0.2 +.005 + + + +None +Servo +3DR Solo +Alexmos Serial +SToRM32 MAVLink +SToRM32 Serial + + + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + +0.0 1.5 +0.1 + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + + +normal +reverse + + + +0 500 +PWM +PWM in microseconds + + +-1.0 1.0 + + +0.9:Low,0.95:Default,1.0:High + + +6 53 +V +volt + + +6 42 +V +volt + + +0 200 +A +ampere + + + +Normal +OneShot +OneShot125 +Brushed +DShot150 +DShot300 +DShot600 +DShot1200 + +True + + +PWM +PWM in microseconds +0 2000 + + +PWM +PWM in microseconds +0 2000 + + +0.0:Low,0.15:Default,0.3:High + + +0.0:Low,0.1:Default,0.2:High + + +0 10 +s +seconds + + +0.2 0.8 + + + +Disabled + + + + +PWM enabled while disarmed +PWM disabled while disarmed + + + +5 80 +deg +degrees +1 + + +0 2 +s +seconds +0.1 + + +0 5 +0.1 + + + +First battery +Second battery + + + +0 .5 +s +seconds +0.001 + + +0 .5 +s +seconds +0.001 + + +0 5 +s +seconds +0.001 + + + + + +Auto +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 + + + +0:EnableTelemetryMode + + + + + +Off +Low +Medium +High + + + +0:Built-in buzzer, 1:DShot, 2:UAVCAN + + + +Standard +MAVLink/Scripting/AP_Periph +OutbackChallenge +TrafficLight + + + + +Disable +ssd1306 +sh1106 +SITL + + + + +Disabled +Aircraft +Rover + + + + +Disabled + + + +0:Built-in LED, 1:Internal ToshibaLED, 2:External ToshibaLED, 3:External PCA9685, 4:Oreo LED, 5:UAVCAN, 6:NCP5623 External, 7:NCP5623 Internal, 8:NeoPixel, 9:ProfiLED, 10:Scripting, 11:DShot + + + +LowIsOn +HighIsOn + + + +0 100 +% +percent + + +1 32 +True + + + + + +None +LightwareSF40c +LightWareSF40C-legacy +MAVLink +TeraRangerTower +RangeFinder +RPLidarA2 +TeraRangerTowerEvo +LightwareSF45B +SITL +AirSimSITL + +True + + + +Default +Upside Down + + + +deg +degrees +-180 180 + + +deg +degrees +0 360 + + +deg +degrees +0 127 + + +deg +degrees +0 360 + + +deg +degrees +0 127 + + +deg +degrees +0 360 + + +deg +degrees +0 127 + + +deg +degrees +0 360 + + +deg +degrees +0 127 + + +deg +degrees +0 360 + + +deg +degrees +0 127 + + +deg +degrees +0 360 + + +deg +degrees +0 127 + + + +Off +On + + + +Hz +hertz +0 20 + + + + +Hz +hertz +0.5 5 +0.1 + + +1.000 3.000 + + +1.000 8.000 + + +0.02 1.00 +0.01 + + +1.000 8.000 + + +0.00 1.00 +0.001 + + +0 1 +0.01 + + +0 100 +Hz +hertz + + +0 100 +Hz +hertz + + +0.200 1.500 +0.05 + + +0.000 3.000 + + +0 1000 +d% +decipercent + + +0.000 0.400 + + +0 0.5 +0.001 + + +1 50 +1 +Hz +hertz + + +1 100 +1 +Hz +hertz + + +1 100 +1 +Hz +hertz + + +0 200 +0.5 + + +0.500 2.000 + + +0.1 6.0 +0.1 + + +0.02 1.00 +0.01 + + +0.00 1.00 +0.001 + + +0 4500 +10 +cm/s/s +centimeters per square second + + +0 100 +Hz +hertz + + +0 100 +Hz +hertz + + +0 6 +0.01 + + +deg +degrees +0 45 +1 + + +m/s/s/s +meters per cubic second +1 20 +1 + + +m/s/s/s +meters per cubic second +5 50 +1 + + + + + + +km +kilometers +0.1 + + + +DoNotIncludeHome +IncludeHome + + + + + +0.0 120.0 +s +seconds + + +0:Ignore RC Receiver, 1:Ignore MAVLink Overrides, 2:Ignore Receiver Failsafe bit but allow other RC failsafes if setup, 3:FPort Pad, 4:Log RC input bytes, 5:Arming check throttle for 0 input, 6:Skip the arming check for neutral Roll/Pitch/Yay sticks, 7:Allow Switch reverse, 8:Use passthrough for CRSF telemetry, 9:Suppress CRSF mode/rate message for ELRS systems, 10:Enable RC Protocol re-detection + + +0:All,1:PPM,2:IBUS,3:SBUS,4:SBUS_NI,5:DSM,6:SUMD,7:SRXL,8:SRXL2,9:CRSF,10:ST24,11:FPORT,12:FPORT2 + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + +PWM +PWM in microseconds +0 200 + + + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + +1 8 +1 +True + + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 +BBBMini Pin P8.17 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 +BBBMini Pin P8.18 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 +BBBMini Pin P8.19 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 +BBBMini Pin P8.34 + + + + +Off +On +NoChange + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 +BBBMini Pin P8.13 + + + + +Disabled +BB Blue GP0 pin 4 +AUXOUT1 +AUXOUT2 +AUXOUT3 +AUXOUT4 +AUXOUT5 +AUXOUT6 +BB Blue GP0 pin 3 +BB Blue GP0 pin 6 +BB Blue GP0 pin 5 +BBBMini Pin P8.14 + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X or VL53L1X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +LanbaoPSK-CM8JL65-CC5 +BenewakeTF03 +VL53L1X-ShortRange +LeddarVu8-Serial +HC-SR04 +GYUS42v2 +MSP +USD1_CAN +SITL + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X or VL53L1X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +LanbaoPSK-CM8JL65-CC5 +BenewakeTF03 +VL53L1X-ShortRange +LeddarVu8-Serial +HC-SR04 +GYUS42v2 +MSP +USD1_CAN +SITL + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X or VL53L1X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +LanbaoPSK-CM8JL65-CC5 +BenewakeTF03 +VL53L1X-ShortRange +LeddarVu8-Serial +HC-SR04 +GYUS42v2 +MSP +USD1_CAN +SITL + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X or VL53L1X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +LanbaoPSK-CM8JL65-CC5 +BenewakeTF03 +VL53L1X-ShortRange +LeddarVu8-Serial +HC-SR04 +GYUS42v2 +MSP +USD1_CAN +SITL + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X or VL53L1X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +LanbaoPSK-CM8JL65-CC5 +BenewakeTF03 +VL53L1X-ShortRange +LeddarVu8-Serial +HC-SR04 +GYUS42v2 +MSP +USD1_CAN +SITL + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X or VL53L1X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +LanbaoPSK-CM8JL65-CC5 +BenewakeTF03 +VL53L1X-ShortRange +LeddarVu8-Serial +HC-SR04 +GYUS42v2 +MSP +USD1_CAN +SITL + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X or VL53L1X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +LanbaoPSK-CM8JL65-CC5 +BenewakeTF03 +VL53L1X-ShortRange +LeddarVu8-Serial +HC-SR04 +GYUS42v2 +MSP +USD1_CAN +SITL + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X or VL53L1X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +LanbaoPSK-CM8JL65-CC5 +BenewakeTF03 +VL53L1X-ShortRange +LeddarVu8-Serial +HC-SR04 +GYUS42v2 +MSP +USD1_CAN +SITL + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X or VL53L1X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +LanbaoPSK-CM8JL65-CC5 +BenewakeTF03 +VL53L1X-ShortRange +LeddarVu8-Serial +HC-SR04 +GYUS42v2 +MSP +USD1_CAN +SITL + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +Analog +MaxbotixI2C +LidarLite-I2C +PWM +BBB-PRU +LightWareI2C +LightWareSerial +Bebop +MAVLink +uLanding +LeddarOne +MaxbotixSerial +TeraRangerI2C +LidarLiteV3-I2C +VL53L0X or VL53L1X +NMEA +WASP-LRF +BenewakeTF02 +Benewake-Serial +LidarLightV3HP +PWM +BlueRoboticsPing +UAVCAN +BenewakeTFminiPlus-I2C +LanbaoPSK-CM8JL65-CC5 +BenewakeTF03 +VL53L1X-ShortRange +LeddarVu8-Serial +HC-SR04 +GYUS42v2 +MSP +USD1_CAN +SITL + + + + +Not Used +PX4-airspeed port +Pixhawk-airspeed port +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 + + + +m/V +meters per volt +0.001 + + +V +volt +0.001 + + + +Linear +Inverted +Hyperbolic + + + +cm +centimeters +1 + + +cm +centimeters +1 + + + +Not Used +Pixhawk AUXOUT1 +Pixhawk AUXOUT2 +Pixhawk AUXOUT3 +Pixhawk AUXOUT4 +Pixhawk AUXOUT5 +Pixhawk AUXOUT6 +PX4 FMU Relay1 +PX4 FMU Relay2 +PX4IO Relay1 +PX4IO Relay2 +PX4IO ACC1 +PX4IO ACC2 + + + + +No +Yes + + + +m +meters +0 32767 + + +cm +centimeters +5 127 +1 + + +0 127 +1 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + + +Forward +Forward-Right +Right +Back-Right +Back +Back-Left +Left +Forward-Left +Up +Down + + + +0 255 + + +0 255 + + +0 10000 + + +0 255 + + +-1 255 + + + +Low Speed +High Speed + + + + + + +None +PWM +AUXPIN +EFI +Harmonic Notch + + + +0.001 + + +1 + + +1 + + +0.1 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + +None +PWM +AUXPIN +EFI +Harmonic Notch + + + +0.001 + + + +Disabled +PixhawkAUX1 +PixhawkAUX2 +PixhawkAUX3 +PixhawkAUX4 +PixhawkAUX5 +PixhawkAUX6 + + + + + + +Disabled +ShowSlips +ShowOverruns + + + + +50Hz +100Hz +200Hz +250Hz +300Hz +400Hz + +True + + +0:Enable per-task perf info + + + + + +None +Lua Scripts + +True + + +1000 1000000 +10000 + + +1024 1048576 +1024 +True + + + + + + + + + + + + +0:ROMFS, 1:APM/scripts +True + + + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +230400 +256000 +460800 +500000 +921600 +1500000 + + + + +MAVlink1 +MAVLink2 + +True + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN +MegaSquirt EFI +LTM +RunCam +HottTelem +Scripting +Crossfire +Generator +Winch +MSP +DJI FPV +AirSpeed +ADSB +AHRS +SmartAudio +FETtecOneWire + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +230400 +256000 +460800 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN +MegaSquirt EFI +LTM +RunCam +HottTelem +Scripting +Crossfire +Generator +Winch +MSP +DJI FPV +AirSpeed +ADSB +AHRS +SmartAudio +FETtecOneWire + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +230400 +256000 +460800 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN +MegaSquirt EFI +LTM +RunCam +HottTelem +Scripting +Crossfire +Generator +Winch +MSP +DJI FPV +AirSpeed +ADSB +AHRS +SmartAudio +FETtecOneWire + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +230400 +256000 +460800 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN +MegaSquirt EFI +LTM +RunCam +HottTelem +Scripting +Crossfire +Generator +Winch +MSP +DJI FPV +AirSpeed +ADSB +AHRS +SmartAudio +FETtecOneWire + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +230400 +256000 +460800 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN +MegaSquirt EFI +LTM +RunCam +HottTelem +Scripting +Crossfire +Generator +Winch +MSP +DJI FPV +AirSpeed +ADSB +AHRS +SmartAudio +FETtecOneWire + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +230400 +256000 +460800 +500000 +921600 +1500000 + + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN +MegaSquirt EFI +LTM +RunCam +HottTelem +Scripting +Crossfire +Generator +Winch +MSP +DJI FPV +AirSpeed +ADSB +AHRS +SmartAudio +FETtecOneWire + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +230400 +256000 +460800 +500000 +921600 +1500000 + + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO +True + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO +True + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + + +Disabled +Serial0 +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 +Serial6 + + + +0 120 +s +seconds + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN +MegaSquirt EFI +LTM +RunCam +HottTelem +Scripting +Crossfire +Generator +Winch +MSP +DJI FPV +AirSpeed +ADSB +AHRS +SmartAudio +FETtecOneWire + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +230400 +256000 +460800 +500000 +921600 +1500000 + + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO +True + + + +None +MAVLink1 +MAVLink2 +Frsky D +Frsky SPort +GPS +Alexmos Gimbal Serial +SToRM32 Gimbal Serial +Rangefinder +FrSky SPort Passthrough (OpenTX) +Lidar360 +Beacon +Volz servo out +SBus servo out +ESC Telemetry +Devo Telemetry +OpticalFlow +RobotisServo +NMEA Output +WindVane +SLCAN +RCIN +MegaSquirt EFI +LTM +RunCam +HottTelem +Scripting +Crossfire +Generator +Winch +MSP +DJI FPV +AirSpeed +ADSB +AHRS +SmartAudio +FETtecOneWire + +True + + + +1200 +2400 +4800 +9600 +19200 +38400 +57600 +111100 +115200 +230400 +256000 +460800 +500000 +921600 +1500000 + + + +0:InvertRX, 1:InvertTX, 2:HalfDuplex, 3:Swap, 4: RX_PullDown, 5: RX_PullUp, 6: TX_PullDown, 7: TX_PullUp, 8: RX_NoDMA, 9: TX_NoDMA, 10: Don't forward mavlink to/from, 11: DisableFIFO +True + + + + +25 400 +Hz +hertz + + + +1Khz +loop-rate +double loop-rate +triple loop-rate +quadruple loop rate + + + + +None +BLHeli32/BLHeli_S/Kiss + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +FlapAuto +Aileron +MountPan +MountTilt +MountRoll +MountOpen +CameraTrigger +Mount2Pan +Mount2Tilt +Mount2Roll +Mount2Open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +SprayerPump +SprayerSpinner +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +TiltMotorsFront +TiltMotorsRear +TiltMotorRearLeft +TiltMotorRearRight +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +TiltMotorFrontLeft +TiltMotorFrontRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +CameraISO +CameraAperture +CameraFocus +CameraShutterSpeed +Script1 +Script2 +Script3 +Script4 +Script5 +Script6 +Script7 +Script8 +Script9 +Script10 +Script11 +Script12 +Script13 +Script14 +Script15 +Script16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +RateRoll +RatePitch +RateThrust +RateYaw +WingSailElevator +ProfiLED1 +ProfiLED2 +ProfiLED3 +ProfiLEDClock +Winch Clutch +SERVOn_MIN +SERVOn_TRIM +SERVOn_MAX +SailMastRotation + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +FlapAuto +Aileron +MountPan +MountTilt +MountRoll +MountOpen +CameraTrigger +Mount2Pan +Mount2Tilt +Mount2Roll +Mount2Open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +SprayerPump +SprayerSpinner +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +TiltMotorsFront +TiltMotorsRear +TiltMotorRearLeft +TiltMotorRearRight +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +TiltMotorFrontLeft +TiltMotorFrontRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +CameraISO +CameraAperture +CameraFocus +CameraShutterSpeed +Script1 +Script2 +Script3 +Script4 +Script5 +Script6 +Script7 +Script8 +Script9 +Script10 +Script11 +Script12 +Script13 +Script14 +Script15 +Script16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +RateRoll +RatePitch +RateThrust +RateYaw +WingSailElevator +ProfiLED1 +ProfiLED2 +ProfiLED3 +ProfiLEDClock +Winch Clutch +SERVOn_MIN +SERVOn_TRIM +SERVOn_MAX +SailMastRotation + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +FlapAuto +Aileron +MountPan +MountTilt +MountRoll +MountOpen +CameraTrigger +Mount2Pan +Mount2Tilt +Mount2Roll +Mount2Open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +SprayerPump +SprayerSpinner +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +TiltMotorsFront +TiltMotorsRear +TiltMotorRearLeft +TiltMotorRearRight +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +TiltMotorFrontLeft +TiltMotorFrontRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +CameraISO +CameraAperture +CameraFocus +CameraShutterSpeed +Script1 +Script2 +Script3 +Script4 +Script5 +Script6 +Script7 +Script8 +Script9 +Script10 +Script11 +Script12 +Script13 +Script14 +Script15 +Script16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +RateRoll +RatePitch +RateThrust +RateYaw +WingSailElevator +ProfiLED1 +ProfiLED2 +ProfiLED3 +ProfiLEDClock +Winch Clutch +SERVOn_MIN +SERVOn_TRIM +SERVOn_MAX +SailMastRotation + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +FlapAuto +Aileron +MountPan +MountTilt +MountRoll +MountOpen +CameraTrigger +Mount2Pan +Mount2Tilt +Mount2Roll +Mount2Open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +SprayerPump +SprayerSpinner +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +TiltMotorsFront +TiltMotorsRear +TiltMotorRearLeft +TiltMotorRearRight +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +TiltMotorFrontLeft +TiltMotorFrontRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +CameraISO +CameraAperture +CameraFocus +CameraShutterSpeed +Script1 +Script2 +Script3 +Script4 +Script5 +Script6 +Script7 +Script8 +Script9 +Script10 +Script11 +Script12 +Script13 +Script14 +Script15 +Script16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +RateRoll +RatePitch +RateThrust +RateYaw +WingSailElevator +ProfiLED1 +ProfiLED2 +ProfiLED3 +ProfiLEDClock +Winch Clutch +SERVOn_MIN +SERVOn_TRIM +SERVOn_MAX +SailMastRotation + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +FlapAuto +Aileron +MountPan +MountTilt +MountRoll +MountOpen +CameraTrigger +Mount2Pan +Mount2Tilt +Mount2Roll +Mount2Open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +SprayerPump +SprayerSpinner +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +TiltMotorsFront +TiltMotorsRear +TiltMotorRearLeft +TiltMotorRearRight +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +TiltMotorFrontLeft +TiltMotorFrontRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +CameraISO +CameraAperture +CameraFocus +CameraShutterSpeed +Script1 +Script2 +Script3 +Script4 +Script5 +Script6 +Script7 +Script8 +Script9 +Script10 +Script11 +Script12 +Script13 +Script14 +Script15 +Script16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +RateRoll +RatePitch +RateThrust +RateYaw +WingSailElevator +ProfiLED1 +ProfiLED2 +ProfiLED3 +ProfiLEDClock +Winch Clutch +SERVOn_MIN +SERVOn_TRIM +SERVOn_MAX +SailMastRotation + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +FlapAuto +Aileron +MountPan +MountTilt +MountRoll +MountOpen +CameraTrigger +Mount2Pan +Mount2Tilt +Mount2Roll +Mount2Open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +SprayerPump +SprayerSpinner +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +TiltMotorsFront +TiltMotorsRear +TiltMotorRearLeft +TiltMotorRearRight +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +TiltMotorFrontLeft +TiltMotorFrontRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +CameraISO +CameraAperture +CameraFocus +CameraShutterSpeed +Script1 +Script2 +Script3 +Script4 +Script5 +Script6 +Script7 +Script8 +Script9 +Script10 +Script11 +Script12 +Script13 +Script14 +Script15 +Script16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +RateRoll +RatePitch +RateThrust +RateYaw +WingSailElevator +ProfiLED1 +ProfiLED2 +ProfiLED3 +ProfiLEDClock +Winch Clutch +SERVOn_MIN +SERVOn_TRIM +SERVOn_MAX +SailMastRotation + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +FlapAuto +Aileron +MountPan +MountTilt +MountRoll +MountOpen +CameraTrigger +Mount2Pan +Mount2Tilt +Mount2Roll +Mount2Open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +SprayerPump +SprayerSpinner +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +TiltMotorsFront +TiltMotorsRear +TiltMotorRearLeft +TiltMotorRearRight +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +TiltMotorFrontLeft +TiltMotorFrontRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +CameraISO +CameraAperture +CameraFocus +CameraShutterSpeed +Script1 +Script2 +Script3 +Script4 +Script5 +Script6 +Script7 +Script8 +Script9 +Script10 +Script11 +Script12 +Script13 +Script14 +Script15 +Script16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +RateRoll +RatePitch +RateThrust +RateYaw +WingSailElevator +ProfiLED1 +ProfiLED2 +ProfiLED3 +ProfiLEDClock +Winch Clutch +SERVOn_MIN +SERVOn_TRIM +SERVOn_MAX +SailMastRotation + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +FlapAuto +Aileron +MountPan +MountTilt +MountRoll +MountOpen +CameraTrigger +Mount2Pan +Mount2Tilt +Mount2Roll +Mount2Open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +SprayerPump +SprayerSpinner +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +TiltMotorsFront +TiltMotorsRear +TiltMotorRearLeft +TiltMotorRearRight +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +TiltMotorFrontLeft +TiltMotorFrontRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +CameraISO +CameraAperture +CameraFocus +CameraShutterSpeed +Script1 +Script2 +Script3 +Script4 +Script5 +Script6 +Script7 +Script8 +Script9 +Script10 +Script11 +Script12 +Script13 +Script14 +Script15 +Script16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +RateRoll +RatePitch +RateThrust +RateYaw +WingSailElevator +ProfiLED1 +ProfiLED2 +ProfiLED3 +ProfiLEDClock +Winch Clutch +SERVOn_MIN +SERVOn_TRIM +SERVOn_MAX +SailMastRotation + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +FlapAuto +Aileron +MountPan +MountTilt +MountRoll +MountOpen +CameraTrigger +Mount2Pan +Mount2Tilt +Mount2Roll +Mount2Open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +SprayerPump +SprayerSpinner +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +TiltMotorsFront +TiltMotorsRear +TiltMotorRearLeft +TiltMotorRearRight +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +TiltMotorFrontLeft +TiltMotorFrontRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +CameraISO +CameraAperture +CameraFocus +CameraShutterSpeed +Script1 +Script2 +Script3 +Script4 +Script5 +Script6 +Script7 +Script8 +Script9 +Script10 +Script11 +Script12 +Script13 +Script14 +Script15 +Script16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +RateRoll +RatePitch +RateThrust +RateYaw +WingSailElevator +ProfiLED1 +ProfiLED2 +ProfiLED3 +ProfiLEDClock +Winch Clutch +SERVOn_MIN +SERVOn_TRIM +SERVOn_MAX +SailMastRotation + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +FlapAuto +Aileron +MountPan +MountTilt +MountRoll +MountOpen +CameraTrigger +Mount2Pan +Mount2Tilt +Mount2Roll +Mount2Open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +SprayerPump +SprayerSpinner +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +TiltMotorsFront +TiltMotorsRear +TiltMotorRearLeft +TiltMotorRearRight +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +TiltMotorFrontLeft +TiltMotorFrontRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +CameraISO +CameraAperture +CameraFocus +CameraShutterSpeed +Script1 +Script2 +Script3 +Script4 +Script5 +Script6 +Script7 +Script8 +Script9 +Script10 +Script11 +Script12 +Script13 +Script14 +Script15 +Script16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +RateRoll +RatePitch +RateThrust +RateYaw +WingSailElevator +ProfiLED1 +ProfiLED2 +ProfiLED3 +ProfiLEDClock +Winch Clutch +SERVOn_MIN +SERVOn_TRIM +SERVOn_MAX +SailMastRotation + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +FlapAuto +Aileron +MountPan +MountTilt +MountRoll +MountOpen +CameraTrigger +Mount2Pan +Mount2Tilt +Mount2Roll +Mount2Open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +SprayerPump +SprayerSpinner +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +TiltMotorsFront +TiltMotorsRear +TiltMotorRearLeft +TiltMotorRearRight +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +TiltMotorFrontLeft +TiltMotorFrontRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +CameraISO +CameraAperture +CameraFocus +CameraShutterSpeed +Script1 +Script2 +Script3 +Script4 +Script5 +Script6 +Script7 +Script8 +Script9 +Script10 +Script11 +Script12 +Script13 +Script14 +Script15 +Script16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +RateRoll +RatePitch +RateThrust +RateYaw +WingSailElevator +ProfiLED1 +ProfiLED2 +ProfiLED3 +ProfiLEDClock +Winch Clutch +SERVOn_MIN +SERVOn_TRIM +SERVOn_MAX +SailMastRotation + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +FlapAuto +Aileron +MountPan +MountTilt +MountRoll +MountOpen +CameraTrigger +Mount2Pan +Mount2Tilt +Mount2Roll +Mount2Open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +SprayerPump +SprayerSpinner +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +TiltMotorsFront +TiltMotorsRear +TiltMotorRearLeft +TiltMotorRearRight +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +TiltMotorFrontLeft +TiltMotorFrontRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +CameraISO +CameraAperture +CameraFocus +CameraShutterSpeed +Script1 +Script2 +Script3 +Script4 +Script5 +Script6 +Script7 +Script8 +Script9 +Script10 +Script11 +Script12 +Script13 +Script14 +Script15 +Script16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +RateRoll +RatePitch +RateThrust +RateYaw +WingSailElevator +ProfiLED1 +ProfiLED2 +ProfiLED3 +ProfiLEDClock +Winch Clutch +SERVOn_MIN +SERVOn_TRIM +SERVOn_MAX +SailMastRotation + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +FlapAuto +Aileron +MountPan +MountTilt +MountRoll +MountOpen +CameraTrigger +Mount2Pan +Mount2Tilt +Mount2Roll +Mount2Open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +SprayerPump +SprayerSpinner +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +TiltMotorsFront +TiltMotorsRear +TiltMotorRearLeft +TiltMotorRearRight +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +TiltMotorFrontLeft +TiltMotorFrontRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +CameraISO +CameraAperture +CameraFocus +CameraShutterSpeed +Script1 +Script2 +Script3 +Script4 +Script5 +Script6 +Script7 +Script8 +Script9 +Script10 +Script11 +Script12 +Script13 +Script14 +Script15 +Script16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +RateRoll +RatePitch +RateThrust +RateYaw +WingSailElevator +ProfiLED1 +ProfiLED2 +ProfiLED3 +ProfiLEDClock +Winch Clutch +SERVOn_MIN +SERVOn_TRIM +SERVOn_MAX +SailMastRotation + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +FlapAuto +Aileron +MountPan +MountTilt +MountRoll +MountOpen +CameraTrigger +Mount2Pan +Mount2Tilt +Mount2Roll +Mount2Open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +SprayerPump +SprayerSpinner +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +TiltMotorsFront +TiltMotorsRear +TiltMotorRearLeft +TiltMotorRearRight +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +TiltMotorFrontLeft +TiltMotorFrontRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +CameraISO +CameraAperture +CameraFocus +CameraShutterSpeed +Script1 +Script2 +Script3 +Script4 +Script5 +Script6 +Script7 +Script8 +Script9 +Script10 +Script11 +Script12 +Script13 +Script14 +Script15 +Script16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +RateRoll +RatePitch +RateThrust +RateYaw +WingSailElevator +ProfiLED1 +ProfiLED2 +ProfiLED3 +ProfiLEDClock +Winch Clutch +SERVOn_MIN +SERVOn_TRIM +SERVOn_MAX +SailMastRotation + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +FlapAuto +Aileron +MountPan +MountTilt +MountRoll +MountOpen +CameraTrigger +Mount2Pan +Mount2Tilt +Mount2Roll +Mount2Open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +SprayerPump +SprayerSpinner +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +TiltMotorsFront +TiltMotorsRear +TiltMotorRearLeft +TiltMotorRearRight +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +TiltMotorFrontLeft +TiltMotorFrontRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +CameraISO +CameraAperture +CameraFocus +CameraShutterSpeed +Script1 +Script2 +Script3 +Script4 +Script5 +Script6 +Script7 +Script8 +Script9 +Script10 +Script11 +Script12 +Script13 +Script14 +Script15 +Script16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +RateRoll +RatePitch +RateThrust +RateYaw +WingSailElevator +ProfiLED1 +ProfiLED2 +ProfiLED3 +ProfiLEDClock +Winch Clutch +SERVOn_MIN +SERVOn_TRIM +SERVOn_MAX +SailMastRotation + + + + + +PWM +PWM in microseconds +500 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + +PWM +PWM in microseconds +800 2200 +1 + + + +Normal +Reversed + + + + +Disabled +RCPassThru +Flap +FlapAuto +Aileron +MountPan +MountTilt +MountRoll +MountOpen +CameraTrigger +Mount2Pan +Mount2Tilt +Mount2Roll +Mount2Open +DifferentialSpoilerLeft1 +DifferentialSpoilerRight1 +Elevator +Rudder +SprayerPump +SprayerSpinner +FlaperonLeft +FlaperonRight +GroundSteering +Parachute +Gripper +LandingGear +EngineRunEnable +HeliRSC +HeliTailRSC +Motor1 +Motor2 +Motor3 +Motor4 +Motor5 +Motor6 +Motor7 +Motor8 +TiltMotorsFront +TiltMotorsRear +TiltMotorRearLeft +TiltMotorRearRight +RCIN1 +RCIN2 +RCIN3 +RCIN4 +RCIN5 +RCIN6 +RCIN7 +RCIN8 +RCIN9 +RCIN10 +RCIN11 +RCIN12 +RCIN13 +RCIN14 +RCIN15 +RCIN16 +Ignition +Starter +Throttle +TrackerYaw +TrackerPitch +ThrottleLeft +ThrottleRight +TiltMotorFrontLeft +TiltMotorFrontRight +ElevonLeft +ElevonRight +VTailLeft +VTailRight +BoostThrottle +Motor9 +Motor10 +Motor11 +Motor12 +DifferentialSpoilerLeft2 +DifferentialSpoilerRight2 +Winch +Main Sail +CameraISO +CameraAperture +CameraFocus +CameraShutterSpeed +Script1 +Script2 +Script3 +Script4 +Script5 +Script6 +Script7 +Script8 +Script9 +Script10 +Script11 +Script12 +Script13 +Script14 +Script15 +Script16 +NeoPixel1 +NeoPixel2 +NeoPixel3 +NeoPixel4 +RateRoll +RatePitch +RateThrust +RateYaw +WingSailElevator +ProfiLED1 +ProfiLED2 +ProfiLED3 +ProfiLEDClock +Winch Clutch +SERVOn_MIN +SERVOn_TRIM +SERVOn_MAX +SailMastRotation + + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + +Disabled +Enabled + + + + +Disabled +TestMotor1 +TestMotor2 +TestMotor3 +TestMotor4 +TestMotor5 +TestMotor6 +TestMotor7 +TestMotor8 + + + +s +seconds +0 300 + + +Hz +hertz +0 500 + + + +Disabled +Enabled + + + + +None +OneShot +OneShot125 +Brushed +DShot150 +DShot300 +DShot600 +DShot1200 + + + + +Console +Serial1 +Serial2 +Serial3 +Serial4 +Serial5 + + + +1 127 + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + + +0:SERVO1,1:SERVO2,2:SERVO3,3:SERVO4,4:SERVO5,5:SERVO6,6:SERVO7,7:SERVO8,8:SERVO9,9:SERVO10,10:SERVO11,11:SERVO12 +True + + +0:SERVO1,1:SERVO2,2:SERVO3,3:SERVO4,4:SERVO5,5:SERVO6,6:SERVO7,7:SERVO8,8:SERVO9,9:SERVO10,10:SERVO11,11:SERVO12 + + +2 50 + + + + +0 4095 + + +0 4095 + + + + +25 250 +Hz +hertz + + + + +0:Channel1,1:Channel2,2:Channel3,3:Channel4,4:Channel5,5:Channel6,6:Channel7,7:Channel8,8:Channel9,9:Channel10,10:Channel11,11:Channel12,12:Channel13,13:Channel14,14:Channel15,15:Channel16 + + + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + +Hz +hertz +0 50 +1 + + + + + +Disable +Enable + + + +m +meters +1 + + +0:Disable Download + + + + + +None +MAVLink +IntelT265 + +True + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + +m +meters +-5 5 +0.01 + + + +Forward +Right +Back +Left +Up +Down + + + + + +ms +milliseconds +0 250 + + +m/s +meters per second +0.05 5.0 + + +m +meters +0.1 10.0 + + +rad +radians +0.05 1.0 + + + + + +Disable +Enable + + + +1 1000 + + +0 7 + + + +Band A +Band B +Band E +Airwave +RaceBand +Low RaceBand + + + +True +5000 6000 + + +0:Pitmode,1:Pitmode until armed,2:Pitmode when disarmed,3:Unlocked,4:Add leading zero byte to requests + + +25 1000 + + + + +cm/s +centimeters per second +20 2000 +50 + + +cm +centimeters +5 1000 +1 + + +cm/s +centimeters per second +10 1000 +50 + + +cm/s +centimeters per second +10 500 +10 + + +cm/s/s +centimeters per square second +50 500 +10 + + +cm/s/s +centimeters per square second +50 500 +10 + + + +Disable +Enable + + + +m/s/s/s +meters per cubic second +1 20 + + +m +meters +0.1 100 + + + + diff --git a/src/FirmwarePlugin/APM/APMParameterMetaData.cc b/src/FirmwarePlugin/APM/APMParameterMetaData.cc index 4ad0055..9bdfac2 100644 --- a/src/FirmwarePlugin/APM/APMParameterMetaData.cc +++ b/src/FirmwarePlugin/APM/APMParameterMetaData.cc @@ -85,12 +85,12 @@ QString APMParameterMetaData::mavTypeToString(MAV_TYPE vehicleTypeEnum) switch(vehicleTypeEnum) { case MAV_TYPE_FIXED_WING: - case MAV_TYPE_VTOL_TAILSITTER_DUOROTOR: - case MAV_TYPE_VTOL_TAILSITTER_QUADROTOR: + case MAV_TYPE_VTOL_DUOROTOR: + case MAV_TYPE_VTOL_QUADROTOR: case MAV_TYPE_VTOL_TILTROTOR: - case MAV_TYPE_VTOL_FIXEDROTOR: - case MAV_TYPE_VTOL_TAILSITTER: - case MAV_TYPE_VTOL_TILTWING: + case MAV_TYPE_VTOL_RESERVED2: + case MAV_TYPE_VTOL_RESERVED3: + case MAV_TYPE_VTOL_RESERVED4: case MAV_TYPE_VTOL_RESERVED5: vehicleName = "ArduPlane"; break; diff --git a/src/FirmwarePlugin/APM/APMResources.qrc b/src/FirmwarePlugin/APM/APMResources.qrc index 27a8ba5..0ec3896 100644 --- a/src/FirmwarePlugin/APM/APMResources.qrc +++ b/src/FirmwarePlugin/APM/APMResources.qrc @@ -29,7 +29,6 @@ ../../AutoPilotPlugins/APM/APMSensorsComponentSummary.qml ../../AutoPilotPlugins/APM/APMTuningComponentCopter.qml ../../AutoPilotPlugins/APM/APMTuningComponentSub.qml - ../../AutoPilotPlugins/APM/APMRemoteSupportComponent.qml APMSensorParams.qml APMSensorIdDecoder.qml QGroundControl.ArduPilot.qmldir @@ -44,29 +43,26 @@ ../../AutoPilotPlugins/APM/APMFollowComponent.FactMetaData.json - ArduPilot-Parameter-Repository/Plane-3.8/apm.pdef.xml - ArduPilot-Parameter-Repository/Plane-3.9/apm.pdef.xml - ArduPilot-Parameter-Repository/Plane-3.10/apm.pdef.xml - ArduPilot-Parameter-Repository/Plane-4.0/apm.pdef.xml - ArduPilot-Parameter-Repository/Plane-4.1/apm.pdef.xml - ArduPilot-Parameter-Repository/Plane-4.2/apm.pdef.xml - ArduPilot-Parameter-Repository/Copter-3.5/apm.pdef.xml - ArduPilot-Parameter-Repository/Copter-3.6/apm.pdef.xml - ArduPilot-Parameter-Repository/Copter-3.7/apm.pdef.xml - ArduPilot-Parameter-Repository/Copter-4.0/apm.pdef.xml - ArduPilot-Parameter-Repository/Copter-4.1/apm.pdef.xml - ArduPilot-Parameter-Repository/Copter-4.2/apm.pdef.xml - ArduPilot-Parameter-Repository/Rover-3.4/apm.pdef.xml - ArduPilot-Parameter-Repository/Rover-3.5/apm.pdef.xml - ArduPilot-Parameter-Repository/Rover-3.6/apm.pdef.xml - ArduPilot-Parameter-Repository/Rover-4.0/apm.pdef.xml - ArduPilot-Parameter-Repository/Rover-4.1/apm.pdef.xml - ArduPilot-Parameter-Repository/Rover-4.2/apm.pdef.xml - ArduPilot-Parameter-Repository/Sub-3.4/apm.pdef.xml - ArduPilot-Parameter-Repository/Sub-3.5/apm.pdef.xml - ArduPilot-Parameter-Repository/Sub-3.6/apm.pdef.xml - ArduPilot-Parameter-Repository/Sub-4.0/apm.pdef.xml - ArduPilot-Parameter-Repository/Sub-4.1/apm.pdef.xml + APMParameterFactMetaData.Plane.3.8.xml + APMParameterFactMetaData.Plane.3.9.xml + APMParameterFactMetaData.Plane.3.10.xml + APMParameterFactMetaData.Plane.4.0.xml + APMParameterFactMetaData.Plane.4.1.xml + APMParameterFactMetaData.Copter.3.5.xml + APMParameterFactMetaData.Copter.3.6.xml + APMParameterFactMetaData.Copter.3.7.xml + APMParameterFactMetaData.Copter.4.0.xml + APMParameterFactMetaData.Copter.4.1.xml + APMParameterFactMetaData.Rover.3.4.xml + APMParameterFactMetaData.Rover.3.5.xml + APMParameterFactMetaData.Rover.3.6.xml + APMParameterFactMetaData.Rover.4.0.xml + APMParameterFactMetaData.Rover.4.1.xml + APMParameterFactMetaData.Sub.3.4.xml + APMParameterFactMetaData.Sub.3.5.xml + APMParameterFactMetaData.Sub.3.6.xml + APMParameterFactMetaData.Sub.4.0.xml + APMParameterFactMetaData.Sub.4.1.xml Copter3.6.OfflineEditing.params Plane3.9.OfflineEditing.params Rover3.5.OfflineEditing.params diff --git a/src/FirmwarePlugin/APM/APMSensorParams.qml b/src/FirmwarePlugin/APM/APMSensorParams.qml index fb52e08..d3d6c91 100644 --- a/src/FirmwarePlugin/APM/APMSensorParams.qml +++ b/src/FirmwarePlugin/APM/APMSensorParams.qml @@ -100,7 +100,7 @@ Item { property bool ins2IdParamAvailable: factPanelController.parameterExists(-1, "INS_ACC2_ID") property bool ins3IdParamAvailable: factPanelController.parameterExists(-1, "INS_ACC3_ID") - property Fact ins1Id: ins1IdParamAvailable ? factPanelController.getParameterFact(-1, "INS_ACC_ID") : _noFact + property Fact ins1Id: insIdParamsAvailable ? factPanelController.getParameterFact(-1, "INS_ACC_ID") : _noFact property Fact ins2Id: ins2IdParamAvailable ? factPanelController.getParameterFact(-1, "INS_ACC2_ID") : _noFact property Fact ins3Id: ins3IdParamAvailable ? factPanelController.getParameterFact(-1, "INS_ACC3_ID") : _noFact property var rgInsId: [ ins1Id, ins2Id, ins3Id ] diff --git a/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.cc b/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.cc index d54e25a..0ae992b 100644 --- a/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.cc +++ b/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.cc @@ -43,12 +43,11 @@ APMCopterMode::APMCopterMode(uint32_t mode, bool settable) : { GUIDED_NOGPS, "Guided No GPS"}, { SMART_RTL, "Smart RTL"}, { FLOWHOLD, "Flow Hold" }, +#if 0 + // Follow me not ready for Stable { FOLLOW, "Follow" }, +#endif { ZIGZAG, "ZigZag" }, - { SYSTEMID, "SystemID" }, - { AUTOROTATE, "AutoRotate" }, - { AUTO_RTL, "AutoRTL" }, - { TURTLE, "Turtle" }, }); } @@ -75,12 +74,11 @@ ArduCopterFirmwarePlugin::ArduCopterFirmwarePlugin(void) APMCopterMode(APMCopterMode::GUIDED_NOGPS, true), APMCopterMode(APMCopterMode::SMART_RTL, true), APMCopterMode(APMCopterMode::FLOWHOLD, true), +#if 0 + // Follow me not ready for Stable APMCopterMode(APMCopterMode::FOLLOW, true), +#endif APMCopterMode(APMCopterMode::ZIGZAG, true), - APMCopterMode(APMCopterMode::SYSTEMID, true), - APMCopterMode(APMCopterMode::AUTOROTATE, true), - APMCopterMode(APMCopterMode::AUTO_RTL, true), - APMCopterMode(APMCopterMode::TURTLE, true), }); if (!_remapParamNameIntialized) { @@ -136,7 +134,10 @@ bool ArduCopterFirmwarePlugin::multiRotorXConfig(Vehicle* vehicle) return vehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, "FRAME")->rawValue().toInt() != 0; } +#if 0 + // Follow me not ready for Stable void ArduCopterFirmwarePlugin::sendGCSMotionReport(Vehicle* vehicle, FollowMe::GCSMotionReport& motionReport, uint8_t estimatationCapabilities) { _sendGCSMotionReport(vehicle, motionReport, estimatationCapabilities); } +#endif diff --git a/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.h b/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.h index f45693e..0294872 100644 --- a/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.h +++ b/src/FirmwarePlugin/APM/ArduCopterFirmwarePlugin.h @@ -43,12 +43,11 @@ public: GUIDED_NOGPS= 20, SMART_RTL = 21, // SMART_RTL returns to home by retracing its steps FLOWHOLD = 22, // FLOWHOLD holds position with optical flow without rangefinder +#if 0 + // Follow me not ready for Stable FOLLOW = 23, // follow attempts to follow another vehicle or ground station +#endif ZIGZAG = 24, // ZIGZAG mode is able to fly in a zigzag manner with predefined point A and point B - SYSTEMID = 25, - AUTOROTATE = 26, - AUTO_RTL = 27, - TURTLE = 28, }; APMCopterMode(uint32_t mode, bool settable); @@ -74,7 +73,10 @@ public: QString followFlightMode (void) const override { return QStringLiteral("Follow"); } QString autoDisarmParameter (Vehicle* vehicle) override { Q_UNUSED(vehicle); return QStringLiteral("DISARM_DELAY"); } bool supportsSmartRTL (void) const override { return true; } +#if 0 + // Follow me not ready for Stable void sendGCSMotionReport (Vehicle* vehicle, FollowMe::GCSMotionReport& motionReport, uint8_t estimatationCapabilities) override; +#endif private: static bool _remapParamNameIntialized; diff --git a/src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.cc b/src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.cc index dff99c8..4bb3157 100644 --- a/src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.cc +++ b/src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.cc @@ -22,7 +22,10 @@ APMRoverMode::APMRoverMode(uint32_t mode, bool settable) {STEERING, "Steering"}, {HOLD, "Hold"}, {LOITER, "Loiter"}, +#if 0 + // Follow me not ready for Stable {FOLLOW, "Follow"}, +#endif {SIMPLE, "Simple"}, {AUTO, "Auto"}, {RTL, "RTL"}, @@ -40,7 +43,10 @@ ArduRoverFirmwarePlugin::ArduRoverFirmwarePlugin(void) APMRoverMode(APMRoverMode::STEERING ,true), APMRoverMode(APMRoverMode::HOLD ,true), APMRoverMode(APMRoverMode::LOITER ,true), +#if 0 + // Follow me not ready for Stable APMRoverMode(APMRoverMode::FOLLOW ,true), +#endif APMRoverMode(APMRoverMode::SIMPLE ,true), APMRoverMode(APMRoverMode::AUTO ,true), APMRoverMode(APMRoverMode::RTL ,true), @@ -75,8 +81,10 @@ bool ArduRoverFirmwarePlugin::supportsNegativeThrust(Vehicle* /*vehicle*/) return true; } +#if 0 + // Follow me not ready for Stable void ArduRoverFirmwarePlugin::sendGCSMotionReport(Vehicle* vehicle, FollowMe::GCSMotionReport& motionReport, uint8_t estimatationCapabilities) { _sendGCSMotionReport(vehicle, motionReport, estimatationCapabilities); } - +#endif diff --git a/src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.h b/src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.h index 6484f08..c82ef43 100644 --- a/src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.h +++ b/src/FirmwarePlugin/APM/ArduRoverFirmwarePlugin.h @@ -25,7 +25,10 @@ public: STEERING = 3, HOLD = 4, LOITER = 5, +#if 0 + // Follow me not ready for Stable FOLLOW = 6, +#endif SIMPLE = 7, AUTO = 10, RTL = 11, @@ -53,7 +56,10 @@ public: bool supportsNegativeThrust (Vehicle *) final; bool supportsSmartRTL (void) const override { return true; } QString offlineEditingParamFile (Vehicle* vehicle) override { Q_UNUSED(vehicle); return QStringLiteral(":/FirmwarePlugin/APM/Rover.OfflineEditing.params"); } +#if 0 + // Follow me not ready for Stable void sendGCSMotionReport (Vehicle* vehicle, FollowMe::GCSMotionReport& motionReport, uint8_t estimatationCapabilities) override; +#endif private: static bool _remapParamNameIntialized; diff --git a/src/FirmwarePlugin/APM/BuildParamMetaData.sh b/src/FirmwarePlugin/APM/BuildParamMetaData.sh new file mode 100644 index 0000000..49736ed --- /dev/null +++ b/src/FirmwarePlugin/APM/BuildParamMetaData.sh @@ -0,0 +1,7 @@ +# Args: [ArduCopter|ArduPlane] [Copter.3.7|...] +cd ~/repos/ardupilot +rm -f apm.pdef.xml +./Tools/autotest/param_metadata/param_parse.py --vehicle $1 +cp apm.pdef.xml ~/repos/qgroundcontrol/src/FirmwarePlugin/APM/APMParameterFactMetaData.$2.xml +rm apm.pdef.xml +cd ~/repos/qgroundcontrol/src/FirmwarePlugin/APM diff --git a/src/FirmwarePlugin/FirmwarePlugin.cc b/src/FirmwarePlugin/FirmwarePlugin.cc index 32cd3a6..79285ec 100644 --- a/src/FirmwarePlugin/FirmwarePlugin.cc +++ b/src/FirmwarePlugin/FirmwarePlugin.cc @@ -275,20 +275,6 @@ void FirmwarePlugin::guidedModeChangeAltitude(Vehicle*, double, bool pauseVehicl qgcApp()->showAppMessage(guided_mode_not_supported_by_vehicle); } -void -FirmwarePlugin::guidedModeChangeGroundSpeedMetersSecond(Vehicle*, double) -{ - // Not supported by generic vehicle - qgcApp()->showAppMessage(guided_mode_not_supported_by_vehicle); -} - -void -FirmwarePlugin::guidedModeChangeEquivalentAirspeedMetersSecond(Vehicle*, double) -{ - // Not supported by generic vehicle - qgcApp()->showAppMessage(guided_mode_not_supported_by_vehicle); -} - void FirmwarePlugin::startMission(Vehicle*) { // Not supported by generic vehicle @@ -332,7 +318,6 @@ const QVariantList& FirmwarePlugin::toolIndicators(const Vehicle*) QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/TelemetryRSSIIndicator.qml")), QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/RCRSSIIndicator.qml")), QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/BatteryIndicator.qml")), - QVariant::fromValue(QUrl::fromUserInput("qrc:/toolbar/RemoteIDIndicator.qml")), }); } return _toolIndicatorList; @@ -553,22 +538,6 @@ const QVariantList& FirmwarePlugin::cameraList(const Vehicle*) this); // parent _cameraList.append(QVariant::fromValue(metaData)); - metaData = new CameraMetaData( - "Sentera 65R Sensor", - tr("Sentera"), - tr("65R Sensor"), - 29.9, // sensorWidth - 22.4, // sendsorHeight - 9344, // imageWidth - 7000, // imageHeight - 27.4, // focalLength - true, // landscape - false, // fixedOrientation - 0.3, // minTriggerInterval - tr(""), // SHOULD BE BLANK FOR NEWLY ADDED CAMERAS. Deprecated translation from older builds. - this); // parent - _cameraList.append(QVariant::fromValue(metaData)); - metaData = new CameraMetaData( //-- http://www.sony.co.uk/electronics/interchangeable-lens-cameras/ilce-6000-body-kit#product_details_default // Sony a6000 Sony 16mm f/2.8" @@ -949,8 +918,8 @@ bool FirmwarePlugin::_armVehicleAndValidate(Vehicle* vehicle) // Only try arming the vehicle a single time. Doing retries on arming with a delay can lead to safety issues. vehicle->setArmed(true, false /* showError */); - // Wait 1500 msecs for vehicle to arm (waiting for the next heartbeat) - for (int i = 0; i < 15; i++) { + // Wait 1000 msecs for vehicle to arm + for (int i=0; i<10; i++) { if (vehicle->armed()) { vehicleArmed = true; break; diff --git a/src/FirmwarePlugin/FirmwarePlugin.h b/src/FirmwarePlugin/FirmwarePlugin.h index f9444b4..7b9fec3 100644 --- a/src/FirmwarePlugin/FirmwarePlugin.h +++ b/src/FirmwarePlugin/FirmwarePlugin.h @@ -88,6 +88,10 @@ public: /// list available from the firmware. Call will be made again if advanced mode changes. virtual QStringList flightModes(Vehicle* /*vehicle*/) { return QStringList(); } + /// Returns the list of additional flight modes to add to the list for joystick button actions. + /// Call will be made again if advanced mode changes. + virtual QStringList extraJoystickFlightModes(Vehicle* /*vehicle*/) { return QStringList(); } + /// Returns the name for this flight mode. Flight mode names must be human readable as well as audio speakable. /// @param base_mode Base mode from mavlink HEARTBEAT message /// @param custom_mode Custom mode from mavlink HEARTBEAT message @@ -98,9 +102,6 @@ public: /// @param[out] custom_mode Custom mode for SET_MODE mavlink message virtual bool setFlightMode(const QString& flightMode, uint8_t* base_mode, uint32_t* custom_mode); - /// returns true if this flight stack supports MAV_CMD_DO_SET_MODE - virtual bool MAV_CMD_DO_SET_MODE_is_supported() const { return false; } - /// Returns The flight mode which indicates the vehicle is paused virtual QString pauseFlightMode(void) const { return QString(); } @@ -149,24 +150,6 @@ public: /// @return The minimum takeoff altitude (relative) for guided takeoff. virtual double minimumTakeoffAltitude(Vehicle* /*vehicle*/) { return 10; } - /// @return The maximum horizontal groundspeed for a multirotor. - virtual double maximumHorizontalSpeedMultirotor(Vehicle* /*vehicle*/) { return NAN; } - - /// @return The maximum equivalent airspeed setpoint. - virtual double maximumEquivalentAirspeed(Vehicle* /*vehicle*/) { return NAN; } - - /// @return The minimum equivalent airspeed setpoint - virtual double minimumEquivalentAirspeed(Vehicle* /*vehicle*/) { return NAN; } - - /// @return Return true if the GCS has enabled Grip_enable option - virtual bool hasGripper(const Vehicle* /*vehicle*/) const { return false; } - - /// @return Return true if we have received the ground speed limits for the mulirotor. - virtual bool mulirotorSpeedLimitsAvailable(Vehicle* /*vehicle*/) { return false; } - - /// @return Return true if we have received the airspeed limits for fixed wing. - virtual bool fixedWingAirSpeedLimitsAvailable(Vehicle* /*vehicle*/) { return false; } - /// Command the vehicle to start the mission virtual void startMission(Vehicle* vehicle); @@ -178,14 +161,6 @@ public: /// @param pauseVehicle true: pause vehicle prior to altitude change virtual void guidedModeChangeAltitude(Vehicle* vehicle, double altitudeChange, bool pauseVehicle); - /// Command vehicle to change groundspeed - /// @param groundspeed Groundspeed in m/s - virtual void guidedModeChangeGroundSpeedMetersSecond(Vehicle* vehicle, double groundspeed); - - /// Command vehicle to change equivalent airspeed - /// @param airspeed_equiv Equivalent airspeed in m/s - virtual void guidedModeChangeEquivalentAirspeedMetersSecond(Vehicle* vehicle, double airspeed_equiv); - /// Default tx mode to apply to joystick axes /// TX modes are as outlined here: http://www.rc-airplane-world.com/rc-transmitter-modes.html virtual int defaultJoystickTXMode(void); diff --git a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc index cf76d12..b97164f 100644 --- a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc +++ b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.cc @@ -11,6 +11,7 @@ #include "PX4ParameterMetaData.h" #include "QGCApplication.h" #include "PX4AutoPilotPlugin.h" +#include "PX4AdvancedFlightModesController.h" #include "PX4SimpleFlightModesController.h" #include "AirframeComponentController.h" #include "SensorsComponentController.h" @@ -52,6 +53,7 @@ PX4FirmwarePlugin::PX4FirmwarePlugin() , _simpleFlightMode (tr("Simple")) , _orbitFlightMode (tr("Orbit")) { + qmlRegisterType ("QGroundControl.Controllers", 1, 0, "PX4AdvancedFlightModesController"); qmlRegisterType ("QGroundControl.Controllers", 1, 0, "PX4SimpleFlightModesController"); qmlRegisterType ("QGroundControl.Controllers", 1, 0, "AirframeComponentController"); qmlRegisterType ("QGroundControl.Controllers", 1, 0, "SensorsComponentController"); @@ -271,9 +273,7 @@ QList PX4FirmwarePlugin::supportedMissionCommands(QGCMAVLink::VehicleCl MAV_CMD_DO_DIGICAM_CONTROL, MAV_CMD_DO_SET_CAM_TRIGG_DIST, MAV_CMD_DO_SET_SERVO, - MAV_CMD_DO_SET_ACTUATOR, MAV_CMD_DO_CHANGE_SPEED, - MAV_CMD_DO_SET_HOME, MAV_CMD_DO_LAND_START, MAV_CMD_DO_SET_ROI_LOCATION, MAV_CMD_DO_SET_ROI_WPNEXT_OFFSET, MAV_CMD_DO_SET_ROI_NONE, MAV_CMD_DO_MOUNT_CONFIGURE, @@ -283,7 +283,6 @@ QList PX4FirmwarePlugin::supportedMissionCommands(QGCMAVLink::VehicleCl MAV_CMD_NAV_DELAY, MAV_CMD_CONDITION_YAW, MAV_CMD_NAV_LOITER_TO_ALT, - MAV_CMD_DO_GRIPPER }; QList vtolCommands = { @@ -411,50 +410,6 @@ void PX4FirmwarePlugin::guidedModeTakeoff(Vehicle* vehicle, double takeoffAltRel static_cast(takeoffAltAMSL)); // AMSL altitude } -double PX4FirmwarePlugin::maximumHorizontalSpeedMultirotor(Vehicle* vehicle) -{ - QString speedParam("MPC_XY_VEL_MAX"); - - if (vehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, speedParam)) { - return vehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, speedParam)->rawValue().toDouble(); - } - - return FirmwarePlugin::maximumHorizontalSpeedMultirotor(vehicle); -} - -double PX4FirmwarePlugin::maximumEquivalentAirspeed(Vehicle* vehicle) -{ - QString airspeedMax("FW_AIRSPD_MAX"); - - if (vehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, airspeedMax)) { - return vehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, airspeedMax)->rawValue().toDouble(); - } - - return FirmwarePlugin::maximumEquivalentAirspeed(vehicle); -} - -double PX4FirmwarePlugin::minimumEquivalentAirspeed(Vehicle* vehicle) -{ - QString airspeedMin("FW_AIRSPD_MIN"); - - if (vehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, airspeedMin)) { - return vehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, airspeedMin)->rawValue().toDouble(); - } - - return FirmwarePlugin::minimumEquivalentAirspeed(vehicle); -} - -bool PX4FirmwarePlugin::mulirotorSpeedLimitsAvailable(Vehicle* vehicle) -{ - return vehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, "MPC_XY_VEL_MAX"); -} - -bool PX4FirmwarePlugin::fixedWingAirSpeedLimitsAvailable(Vehicle* vehicle) -{ - return vehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, "FW_AIRSPD_MIN") && - vehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, "FW_AIRSPD_MAX"); -} - void PX4FirmwarePlugin::guidedModeGotoLocation(Vehicle* vehicle, const QGeoCoordinate& gotoCoord) { if (qIsNaN(vehicle->altitudeAMSL()->rawValue().toDouble())) { @@ -494,12 +449,14 @@ typedef struct { double newAMSLAlt; } PauseVehicleThenChangeAltData_t; -static void _pauseVehicleThenChangeAltResultHandler(void* resultHandlerData, int /*compId*/, const mavlink_command_ack_t& ack, Vehicle::MavCmdResultFailureCode_t failureCode) +static void _pauseVehicleThenChangeAltResultHandler(void* resultHandlerData, int /*compId*/, MAV_RESULT commandResult, uint8_t progress, Vehicle::MavCmdResultFailureCode_t failureCode) { - if (ack.result != MAV_RESULT_ACCEPTED) { + Q_UNUSED(progress); + + if (commandResult != MAV_RESULT_ACCEPTED) { switch (failureCode) { case Vehicle::MavCmdResultCommandResultOnly: - qDebug() << QStringLiteral("MAV_CMD_DO_REPOSITION error(%1)").arg(ack.result); + qDebug() << QStringLiteral("MAV_CMD_DO_REPOSITION error(%1)").arg(commandResult); break; case Vehicle::MavCmdResultFailureNoResponseToCommand: qDebug() << "MAV_CMD_DO_REPOSITION no response from vehicle"; @@ -511,7 +468,7 @@ static void _pauseVehicleThenChangeAltResultHandler(void* resultHandlerData, int } PauseVehicleThenChangeAltData_t* pData = static_cast(resultHandlerData); - pData->plugin->_changeAltAfterPause(resultHandlerData, ack.result == MAV_RESULT_ACCEPTED /* pauseSucceeded */); + pData->plugin->_changeAltAfterPause(resultHandlerData, commandResult == MAV_RESULT_ACCEPTED /* pauseSucceeded */); } void PX4FirmwarePlugin::_changeAltAfterPause(void* resultHandlerData, bool pauseSucceeded) @@ -555,12 +512,9 @@ void PX4FirmwarePlugin::guidedModeChangeAltitude(Vehicle* vehicle, double altitu resultData->newAMSLAlt = vehicle->homePosition().altitude() + newAltRel; if (pauseVehicle) { - Vehicle::MavCmdAckHandlerInfo_t handlerInfo = {}; - handlerInfo.resultHandler = _pauseVehicleThenChangeAltResultHandler; - handlerInfo.resultHandlerData = resultData; - vehicle->sendMavCommandWithHandler( - &handlerInfo, + _pauseVehicleThenChangeAltResultHandler, + resultData, vehicle->defaultComponentId(), MAV_CMD_DO_REPOSITION, -1.0f, // Don't change groundspeed @@ -572,34 +526,6 @@ void PX4FirmwarePlugin::guidedModeChangeAltitude(Vehicle* vehicle, double altitu } } -void PX4FirmwarePlugin::guidedModeChangeGroundSpeedMetersSecond(Vehicle* vehicle, double groundspeed) -{ - - vehicle->sendMavCommand( - vehicle->defaultComponentId(), - MAV_CMD_DO_CHANGE_SPEED, - true, // show error is fails - 1, // 0: airspeed, 1: groundspeed - static_cast(groundspeed), // groundspeed setpoint - -1, // throttle - 0, // 0: absolute speed, 1: relative to current - NAN, NAN,NAN); // param 5-7 unused -} - -void PX4FirmwarePlugin::guidedModeChangeEquivalentAirspeedMetersSecond(Vehicle* vehicle, double airspeed_equiv) -{ - - vehicle->sendMavCommand( - vehicle->defaultComponentId(), - MAV_CMD_DO_CHANGE_SPEED, - true, // show error is fails - 0, // 0: airspeed, 1: groundspeed - static_cast(airspeed_equiv), // groundspeed setpoint - -1, // throttle - 0, // 0: absolute speed, 1: relative to current - NAN, NAN,NAN); // param 5-7 unused -} - void PX4FirmwarePlugin::startMission(Vehicle* vehicle) { if (_setFlightModeAndValidate(vehicle, missionFlightMode())) { @@ -708,7 +634,7 @@ bool PX4FirmwarePlugin::supportsNegativeThrust(Vehicle* vehicle) return ((vehicle->vehicleType() == MAV_TYPE_GROUND_ROVER) || (vehicle->vehicleType() == MAV_TYPE_SUBMARINE)); } -QString PX4FirmwarePlugin::getHobbsMeter(Vehicle* vehicle) +QString PX4FirmwarePlugin::getHobbsMeter(Vehicle* vehicle) { static const char* HOOBS_HI = "LND_FLIGHT_T_HI"; static const char* HOOBS_LO = "LND_FLIGHT_T_LO"; @@ -720,7 +646,7 @@ QString PX4FirmwarePlugin::getHobbsMeter(Vehicle* vehicle) Fact* factLo = vehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, HOOBS_LO); hobbsTimeSeconds = ((uint64_t)factHi->rawValue().toUInt() << 32 | (uint64_t)factLo->rawValue().toUInt()) / 1000000; qCDebug(VehicleLog) << "Hobbs Meter raw PX4:" << "(" << factHi->rawValue().toUInt() << factLo->rawValue().toUInt() << ")"; - } + } int hours = hobbsTimeSeconds / 3600; int minutes = (hobbsTimeSeconds % 3600) / 60; @@ -728,13 +654,4 @@ QString PX4FirmwarePlugin::getHobbsMeter(Vehicle* vehicle) QString timeStr = QString::asprintf("%04d:%02d:%02d", hours, minutes, seconds); qCDebug(VehicleLog) << "Hobbs Meter string:" << timeStr; return timeStr; -} - -bool PX4FirmwarePlugin::hasGripper(const Vehicle* vehicle) const -{ - if(vehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, QStringLiteral("PD_GRIPPER_EN"))) { - bool _hasGripper = (vehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, QStringLiteral("PD_GRIPPER_EN"))->rawValue().toInt()) != 0 ? true : false; - return _hasGripper; - } - return false; -} +} diff --git a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h index a0a8d62..5b11ea2 100644 --- a/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h +++ b/src/FirmwarePlugin/PX4/PX4FirmwarePlugin.h @@ -46,15 +46,8 @@ public: void guidedModeRTL (Vehicle* vehicle, bool smartRTL) override; void guidedModeLand (Vehicle* vehicle) override; void guidedModeTakeoff (Vehicle* vehicle, double takeoffAltRel) override; - double maximumHorizontalSpeedMultirotor(Vehicle* vehicle) override; - double maximumEquivalentAirspeed(Vehicle* vehicle) override; - double minimumEquivalentAirspeed(Vehicle* vehicle) override; - bool mulirotorSpeedLimitsAvailable(Vehicle* vehicle) override; - bool fixedWingAirSpeedLimitsAvailable(Vehicle* vehicle) override; void guidedModeGotoLocation (Vehicle* vehicle, const QGeoCoordinate& gotoCoord) override; void guidedModeChangeAltitude (Vehicle* vehicle, double altitudeRel, bool pauseVehicle) override; - void guidedModeChangeGroundSpeedMetersSecond(Vehicle* vehicle, double groundspeed) override; - void guidedModeChangeEquivalentAirspeedMetersSecond(Vehicle* vehicle, double airspeed_equiv) override; void startMission (Vehicle* vehicle) override; bool isGuidedMode (const Vehicle* vehicle) const override; void initializeVehicle (Vehicle* vehicle) override; @@ -72,7 +65,6 @@ public: uint32_t highLatencyCustomModeTo32Bits (uint16_t hlCustomMode) override; bool supportsNegativeThrust (Vehicle* vehicle) override; QString getHobbsMeter (Vehicle* vehicle) override; - bool hasGripper (const Vehicle* vehicle) const override; protected: typedef struct { diff --git a/src/FirmwarePlugin/PX4/PX4ParameterFactMetaData.xml b/src/FirmwarePlugin/PX4/PX4ParameterFactMetaData.xml index fe4cc47..8c9b18c 100644 --- a/src/FirmwarePlugin/PX4/PX4ParameterFactMetaData.xml +++ b/src/FirmwarePlugin/PX4/PX4ParameterFactMetaData.xml @@ -196,175 +196,16 @@ us - - - First 4 characters of CALLSIGN - Sets first 4 characters of a total of 8. Valid characters are A-Z, 0-9, " ". Example "PX4 " -> 1347957792 For CALLSIGN shorter than 8 characters use the null terminator at the end '\0'. - true - - - Second 4 characters of CALLSIGN - Sets second 4 characters of a total of 8. Valid characters are A-Z, 0-9, " " only. Example "TEST" -> 1413829460 For CALLSIGN shorter than 8 characters use the null terminator at the end '\0'. - true - - - ADSB-Out Emergency State - Sets the vehicle emergency state - 0 - 6 - false - - NoEmergency - General - Medical - LowFuel - NoCommunications - Interference - Downed - - - - ADSB-Out Vehicle Emitter Type - Configure the emitter type of the vehicle. - 0 - 15 - true - - Unknown - Light - Small - Large - HighVortex - Heavy - Performance - Rotorcraft - RESERVED - Glider - LightAir - Parachute - UltraLight - RESERVED - UAV - Space - RESERVED - EmergencySurf - ServiceSurf - PointObstacle - - - - ADSB-Out GPS Offset lat - Sets GPS lataral offset encoding - 0 - 7 - false - - NoData - LatLeft2M - LatLeft4M - LatLeft6M - LatRight0M - LatRight2M - LatRight4M - LatRight6M - - - - ADSB-Out GPS Offset lon - Sets GPS longitudinal offset encoding - 0 - 1 - false - - NoData - AppliedBySensor - - - - ADSB-Out ICAO configuration - Defines the ICAO ID of the vehicle - -1 - 16777215 - true - - - ADSB-In Special ICAO configuration - This vehicle is always tracked. Use 0 to disable. - 0 - 16777215 - false - - - ADSB-Out Ident Configuration - Enable Identification of Position feature - false - - - ADSB-Out Vehicle Size Configuration - Report the length and width of the vehicle in meters. In most cases, use '1' for the smallest vehicle size. - 0 - 15 - true - - SizeUnknown - Len15_Wid23 - Len25_Wid28 - Len25_Wid34 - Len35_Wid33 - Len35_Wid38 - Len45_Wid39 - Len45_Wid45 - Len55_Wid45 - Len55_Wid52 - Len65_Wid59 - Len65_Wid67 - Len75_Wid72 - Len75_Wid80 - Len85_Wid80 - Len85_Wid90 - - - - ADSB-In Vehicle List Size - Change number of targets to track - 0 - 50 - true - - - ADSB-Out Vehicle Max Speed - Informs ADSB vehicles of this vehicle's max speed capability - 0 - 6 - true - - UnknownMaxSpeed - 75Kts - 150Kts - 300Kts - 600Kts - 1200Kts - Over1200Kts - - - - ADSB-Out squawk code configuration - This parameter defines the squawk code. Value should be between 0000 and 7777. - 0 - 7777 - false - - - Gate size for sideslip angle fusion + Airspeed Selector: Gate size for sideslip angle fusion Sets the number of standard deviations used by the innovation consistency test. 1 5 SD - - Wind estimator sideslip measurement noise + + Airspeed Selector: Wind estimator sideslip measurement noise Sideslip measurement noise of the internal wind estimator(s) of the airspeed selector. 0 1 @@ -373,12 +214,12 @@ Enable checks on airspeed sensors - Controls which checks are run to check airspeed data for validity. Only applied if ASPD_PRIMARY > 0. + Controls which checks are run to check airspeed data for validity. Only applied if ASPD_PRIMARY > 0. Note that the data missing check is enabled if any of the options is set. 0 15 Only data missing check (triggers if more than 1s no data) - Data stuck (triggers if data is exactly constant for 2s in FW mode) + Data stuck (triggers if data is exactly constant for 2s) Innovation check (see ASPD_FS_INNOV) Load factor check (triggers if measurement is below stall speed) @@ -456,7 +297,7 @@ 2 true - + Controls when to apply the new estimated airspeed scale(s) Do not automatically apply the estimated scale @@ -464,48 +305,187 @@ Apply the estimated scale in air - - Wind estimator true airspeed scale process noise spectral density - Airspeed scale process noise of the internal wind estimator(s) of the airspeed selector. When unaided, the scale uncertainty (1-sigma, unitless) increases by this amount every second. + + Airspeed Selector: Wind estimator true airspeed scale process noise + Airspeed scale process noise of the internal wind estimator(s) of the airspeed selector. 0 0.1 - 1/s/sqrt(Hz) + Hz 5 - - Gate size for true airspeed fusion + + Airspeed Selector: Gate size for true airspeed fusion Sets the number of standard deviations used by the innovation consistency test. 1 5 SD - Wind estimator true airspeed measurement noise + Airspeed Selector: Wind estimator true airspeed measurement noise True airspeed measurement noise of the internal wind estimator(s) of the airspeed selector. 0 4 m/s 1 - - Horizontal wind uncertainty threshold for synthetic airspeed - The synthetic airspeed estimate (from groundspeed and heading) will be declared valid as soon and as long the horizontal wind uncertainty is below this value. - 0.001 - 5 - m/s - 3 - - - Wind estimator wind process noise spectral density - Wind process noise of the internal wind estimator(s) of the airspeed selector. When unaided, the wind estimate uncertainty (1-sigma, in m/s) increases by this amount every second. + + Airspeed Selector: Wind estimator wind process noise + Wind process noise of the internal wind estimator(s) of the airspeed selector. 0 1 - m/s^2/sqrt(Hz) + m/s^2 2 + + + Body X axis angular velocity D gain + Body X axis angular velocity differential gain. Small values help reduce fast oscillations. If value is too big oscillations will appear again. + 0.0 + 2.0 + 4 + 0.01 + + + Body X axis angular velocity feedforward gain + Improves tracking performance. + 0.0 + Nm/(rad/s) + 4 + + + Body X axis angular velocity I gain + Body X axis angular velocity integral gain. Can be set to compensate static thrust difference or gravity center offset. + 0.0 + Nm/rad + 3 + 0.01 + + + Body X axis angular velocity integrator limit + Body X axis angular velocity integrator limit. Can be set to increase the amount of integrator available to counteract disturbances or reduced to improve settling time after large roll moment trim changes. + 0.0 + Nm + 2 + 0.01 + + + Body X axis angular velocity controller gain + Global gain of the controller. This gain scales the P, I and D terms of the controller: output = AVC_X_K * (AVC_X_P * error + AVC_X_I * error_integral + AVC_X_D * error_derivative) Set AVC_X_P=1 to implement a PID in the ideal form. Set AVC_X_K=1 to implement a PID in the parallel form. + 0.0 + 5.0 + 4 + 0.0005 + + + Body X axis angular velocity P gain + Body X axis angular velocity proportional gain, i.e. control output for angular speed error 1 rad/s. + 0.0 + 20.0 + 1/s + 3 + 0.01 + + + Body Y axis angular velocity D gain + Body Y axis angular velocity differential gain. Small values help reduce fast oscillations. If value is too big oscillations will appear again. + 0.0 + 2.0 + 4 + 0.01 + + + Body Y axis angular velocity feedforward + Improves tracking performance. + 0.0 + Nm/(rad/s) + 4 + + + Body Y axis angular velocity I gain + Body Y axis angular velocity integral gain. Can be set to compensate static thrust difference or gravity center offset. + 0.0 + Nm/rad + 3 + 0.01 + + + Body Y axis angular velocity integrator limit + Body Y axis angular velocity integrator limit. Can be set to increase the amount of integrator available to counteract disturbances or reduced to improve settling time after large pitch moment trim changes. + 0.0 + Nm + 2 + 0.01 + + + Body Y axis angular velocity controller gain + Global gain of the controller. This gain scales the P, I and D terms of the controller: output = AVC_Y_K * (AVC_Y_P * error + AVC_Y_I * error_integral + AVC_Y_D * error_derivative) Set AVC_Y_P=1 to implement a PID in the ideal form. Set AVC_Y_K=1 to implement a PID in the parallel form. + 0.0 + 20.0 + 4 + 0.0005 + + + Body Y axis angular velocity P gain + Body Y axis angular velocity proportional gain, i.e. control output for angular speed error 1 rad/s. + 0.0 + 20.0 + 1/s + 3 + 0.01 + + + Body Z axis angular velocity D gain + Body Z axis angular velocity differential gain. Small values help reduce fast oscillations. If value is too big oscillations will appear again. + 0.0 + 2.0 + 2 + 0.01 + + + Body Z axis angular velocity feedforward + Improves tracking performance. + 0.0 + Nm/(rad/s) + 4 + 0.01 + + + Body Z axis angular velocity I gain + Body Z axis angular velocity integral gain. Can be set to compensate static thrust difference or gravity center offset. + 0.0 + Nm/rad + 2 + 0.01 + + + Body Z axis angular velocity integrator limit + Body Z axis angular velocity integrator limit. Can be set to increase the amount of integrator available to counteract disturbances or reduced to improve settling time after large yaw moment trim changes. + 0.0 + Nm + 2 + 0.01 + + + Body Z axis angular velocity controller gain + Global gain of the controller. This gain scales the P, I and D terms of the controller: output = AVC_Z_K * (AVC_Z_P * error + AVC_Z_I * error_integral + AVC_Z_D * error_derivative) Set AVC_Z_P=1 to implement a PID in the ideal form. Set AVC_Z_K=1 to implement a PID in the parallel form. + 0.0 + 5.0 + 4 + 0.0005 + + + Body Z axis angular velocity P gain + Body Z axis angular velocity proportional gain, i.e. control output for angular speed error 1 rad/s. + 0.0 + 20.0 + 1/s + 2 + 0.01 + + - + Acceleration compensation based on GPS velocity @@ -581,24 +561,9 @@ yaw - - Enable/disable auto tuning using an RC AUX input - Defines which RC_MAP_AUXn parameter maps the RC channel used to enable/disable auto tuning. - 0 - 6 - - Disable - Aux1 - Aux2 - Aux3 - Aux4 - Aux5 - Aux6 - - Start the autotuning sequence - WARNING: this will inject steps to the rate controller and can be dangerous. Only activate if you know what you are doing, and in a safe environment. Any motion of the remote stick will abort the signal injection and reset this parameter Best is to perform the identification in position or hold mode. Increase the amplitude of the injected signal using FW_AT_SYSID_AMP for more signal/noise ratio + WARNING: this will inject steps to the rate controller and can be dangerous. Only activate if you know what you are doing, and in a safe environment. Any motion of the remote stick will abord the signal injection and reset this parameter Best is to perform the identification in position or hold mode. Increase the amplitude of the injected signal using FW_AT_SYSID_AMP for more signal/noise ratio Amplitude of the injected signal @@ -628,7 +593,7 @@ Start the autotuning sequence - WARNING: this will inject steps to the rate controller and can be dangerous. Only activate if you know what you are doing, and in a safe environment. Any motion of the remote stick will abort the signal injection and reset this parameter Best is to perform the identification in position or hold mode. Increase the amplitude of the injected signal using MC_AT_SYSID_AMP for more signal/noise ratio + WARNING: this will inject steps to the rate controller and can be dangerous. Only activate if you know what you are doing, and in a safe environment. Any motion of the remote stick will abord the signal injection and reset this parameter Best is to perform the identification in position or hold mode. Increase the amplitude of the injected signal using MC_AT_SYSID_AMP for more signal/noise ratio Amplitude of the injected signal @@ -641,14 +606,6 @@ This parameter is deprecated. Please use BAT1_I_CHANNEL - - Expected battery current in flight - This value is used to initialize the in-flight average current estimation, which in turn is used for estimating remaining flight time and RTL triggering. - 0 - 500 - A - 0.1 - Critical threshold Sets the threshold when the battery will be reported as critically low. This has to be lower than the low threshold. This threshold commonly will trigger RTL. @@ -682,7 +639,7 @@ This parameter is deprecated. Please use BAT1_V_CHARGED instead - + This parameter is deprecated. Please use BAT1_V_EMPTY instead @@ -790,6 +747,22 @@ Distance based, on command (Survey mode) + + Camera trigger pin + Selects which FMU pin is used (range: AUX1-AUX8 on Pixhawk controllers with an I/O board, MAIN1-MAIN8 on controllers without an I/O board). The PWM interface takes two pins per camera, while relay triggers on every pin individually. Example: Value 56 would trigger on pins 5 and 6. For GPIO mode Pin 6 will be triggered followed by 5. With a value of 65 pin 5 will be triggered followed by 6. Pins may be non contiguous. I.E. 16 or 61. In GPIO mode the delay pin to pin is < .2 uS. + 1 + 12345678 + 0 + true + + + Camera trigger pin extended + This Bit mask selects which FMU pin is used (range: AUX9-AUX32) If the value is not 0 it takes precedence over TRIG_PINS. If bits above 8 are set that value is used as the selector for trigger pins. greater then 8. 0x00000300 Would be Pins 9,10. If the value is + 0 + 2147483647 + 0 + true + Camera trigger polarity This parameter sets the polarity of the trigger (0 = active low, 1 = active high ) @@ -831,6 +804,13 @@ 782097 true + + Circuit breaker for engine failure detection + Setting this parameter to 284953 will disable the engine failure detection. If the aircraft is in engine failure mode the engine failure flag will be set to healthy WARNING: ENABLING THIS CIRCUIT BREAKER IS AT OWN RISK + 0 + 284953 + true + Circuit breaker for flight termination Setting this parameter to 121212 will disable the flight termination action if triggered by the FailureDetector logic or if FMU is lost. This circuit breaker does not affect the RC loss, data link loss, geofence, and takeoff failure detection safety logic. @@ -844,6 +824,13 @@ 0 22027 + + Circuit breaker for rate controller output + Setting this parameter to 140253 will disable the rate controller uORB publication. WARNING: ENABLING THIS CIRCUIT BREAKER IS AT OWN RISK + 0 + 140253 + true + Circuit breaker for power supply check Setting this parameter to 894281 will disable the power valid checks in the commander. WARNING: ENABLING THIS CIRCUIT BREAKER IS AT OWN RISK @@ -856,6 +843,12 @@ 0 197848 + + Circuit breaker for position error check + Setting this parameter to 201607 will disable the position and velocity accuracy checks in the commander. WARNING: ENABLING THIS CIRCUIT BREAKER IS AT OWN RISK + 0 + 201607 + Circuit breaker for arming in fixed-wing mode check Setting this parameter to 159753 will enable arming in fixed-wing mode for VTOLs. WARNING: ENABLING THIS CIRCUIT BREAKER IS AT OWN RISK @@ -864,25 +857,12 @@ - - Set the actuator failure failsafe mode - Note: actuator failure needs to be enabled and configured via FD_ACT_* parameters. - 0 - 3 + + Enable preflight check for maximal allowed airspeed when arming + Deny arming if the current airspeed measurement is greater than half the cruise airspeed (FW_AIRSPD_TRIM). Excessive airspeed measurements on ground are either caused by wind or bad airspeed calibration. - Warning only - Hold mode - Land mode - Return mode - Terminate - - - - Flag to allow arming - Set 0 to prevent accidental use of the vehicle e.g. for safety or maintenance reasons. - - Disallow arming - Allow arming + Disabled + Enabled @@ -908,15 +888,6 @@ 1 0.1 - - Minimum battery level for arming - Additional battery level check that only allows arming if the state of charge of the emptiest connected battery is above this value. A value of 0 disables the check. - 0 - 0.9 - norm - 2 - 0.01 - Enable checks on ESCs that report telemetry If this parameter is set, the system will check ESC's online status and failures. This param is specific for ESCs reporting status. It shall be used only if ESCs support telemetry. @@ -949,10 +920,6 @@ 2 0.05 - - Enable FMU SD card hardfault detection check - This check detects if there are hardfault files present on the SD card. If so, and the parameter is enabled, arming is prevented. - Maximum accelerometer inconsistency between IMU units that will allow arming 0.1 @@ -969,7 +936,7 @@ 3 0.01 - + Maximum magnetic field inconsistency between units that will allow arming Set -1 to disable the check. 3 @@ -989,15 +956,6 @@ Require valid mission to arm The default allows to arm the vehicle without a valid mission. - - Enable Drone ID system detection and health check - This check detects if the Open Drone ID system is missing. Depending on the value of the parameter, the check can be disabled, warn only or deny arming. - - Disabled - Warning only - Enforce Open Drone ID system presence - - Enable FMU SD card detection check This check detects if the FMU SD card is missing. Depending on the value of the parameter, the check can be disabled, warn only or deny arming. @@ -1013,14 +971,15 @@ Allow arming without GPS + The default allows the vehicle to arm without GPS signal. Require GPS lock to arm Allow arming without GPS - + Maximum allowed CPU load to still arm - The check fails if the CPU load is above this threshold for 2s. A negative value disables the check. + A negative value disables the check. -1 100 % @@ -1030,42 +989,169 @@ Time-out for auto disarm after landing A non-zero, positive value specifies the time-out period in seconds after which the vehicle will be automatically disarmed in case a landing situation has been detected during this period. A zero or negative value means that automatic disarming triggered by landing detection is disabled. s - 1 - 0.1 - - - Allow disarming via switch/stick/button on multicopters in manual thrust modes - 0: Disallow disarming when not landed 1: Allow disarming in multicopter flight in modes where the thrust is directly controlled by thr throttle stick e.g. Stabilized, Acro + 2 Time-out for auto disarm if not taking off A non-zero, positive value specifies the time in seconds, within which the vehicle is expected to take off after arming. In case the vehicle didn't takeoff within the timeout it disarms again. A negative value disables autmoatic disarming triggered by a pre-takeoff timeout. s - 1 - 0.1 + 2 - GCS connection loss time threshold - After this amount of seconds without datalink, the GCS connection lost mode triggers + Datalink loss time threshold + After this amount of seconds without datalink the data link lost mode triggers 5 300 s 1 1 - - Delay between failsafe condition triggered and failsafe reaction - Before entering failsafe (RTL, Land, Hold), wait COM_FAIL_ACT_T seconds in Hold mode for the user to realize. During that time the user cannot take over control via the stick override feature (see COM_RC_OVERRIDE). Afterwards the configured failsafe action is triggered and the user may use stick override. A zero value disables the delay and the user cannot take over via stick movements (switching modes is still allowed). + + Engine Failure Current/Throttle Threshold + Engine failure triggers only below this current value 0.0 - 25.0 + 50.0 + A/% + 2 + 1 + + + Engine Failure Throttle Threshold + Engine failure triggers only above this throttle value + 0.0 + 1.0 + norm + 2 + 0.01 + + + Engine Failure Time Threshold + Engine failure triggers only if the throttle threshold and the current to throttle threshold are violated for this time + 0.0 + 60.0 s - 3 + 1 + 1 Next flight UUID This number is incremented automatically after every flight on disarming in order to remember the next flight UUID. The first flight is 0. 0 + + First flightmode slot (1000-1160) + If the main switch channel is in this range the selected flight mode will be applied. + + Unassigned + Manual + Altitude + Position + Mission + Hold + Return + Acro + Offboard + Stabilized + Takeoff + Land + Follow Me + + + + Second flightmode slot (1160-1320) + If the main switch channel is in this range the selected flight mode will be applied. + + Unassigned + Manual + Altitude + Position + Mission + Hold + Return + Acro + Offboard + Stabilized + Takeoff + Land + Follow Me + + + + Third flightmode slot (1320-1480) + If the main switch channel is in this range the selected flight mode will be applied. + + Unassigned + Manual + Altitude + Position + Mission + Hold + Return + Acro + Offboard + Stabilized + Takeoff + Land + Follow Me + + + + Fourth flightmode slot (1480-1640) + If the main switch channel is in this range the selected flight mode will be applied. + + Unassigned + Manual + Altitude + Position + Mission + Hold + Return + Acro + Offboard + Stabilized + Takeoff + Land + Follow Me + + + + Fifth flightmode slot (1640-1800) + If the main switch channel is in this range the selected flight mode will be applied. + + Unassigned + Manual + Altitude + Position + Mission + Hold + Return + Acro + Offboard + Stabilized + Takeoff + Land + Follow Me + + + + Sixth flightmode slot (1800-2000) + If the main switch channel is in this range the selected flight mode will be applied. + + Unassigned + Manual + Altitude + Position + Mission + Hold + Return + Acro + Offboard + Stabilized + Takeoff + Land + Follow Me + + User Flight Profile Describes the intended use of the vehicle. Can be used by ground control software or log post processing. This param does not influence the behavior within the firmware. This means for example the control logic is independent of the setting of this param (but depends on other params). @@ -1076,16 +1162,6 @@ Developer - - Maximum allowed flight time - The vehicle aborts the current operation and returns to launch when the time since takeoff is above this value. It is not possible to resume the mission or switch to any auto mode other than RTL or Land. Taking over in any manual mode is still possible. Starting from 90% of the maximum flight time, a warning message will be sent every 1 minute with the remaining time until automatic RTL. Set to -1 to disable. - -1 - s - - - Enable force safety - Force safety when the vehicle disarms - High Latency Datalink loss time threshold After this amount of seconds without datalink the data link lost mode triggers @@ -1100,18 +1176,32 @@ 60 s - - Home position enabled - Set home position automatically if possible. - true + + Home set horizontal threshold + The home position will be set if the estimated positioning accuracy is below the threshold. + 2 + 15 + m + 2 + 0.5 Allows setting the home position after takeoff If set to true, the autopilot is allowed to set its home position after takeoff The true home position is back-computed if a local position is estimate if available. If no local position is available, home is set to the current position. + + Home set vertical threshold + The home position will be set if the estimated positioning accuracy is below the threshold. + 5 + 25 + m + 2 + 0.5 + Imbalanced propeller failsafe mode Action the system takes when an imbalanced propeller is detected by the failure detector. See also FD_IMB_PROP_THR to set the failure threshold. + 0 1 Disabled @@ -1129,7 +1219,7 @@ Timeout for detecting a failure after takeoff - A non-zero, positive value specifies the timeframe in seconds within failure detector is allowed to disarm the vehicle if attitude exceeds the limits defined in FD_FAIL_P and FD_FAIL_R. The check is not executed for flight modes that do support acrobatic maneuvers, e.g: Acro (MC/FW) and Manual (FW). A zero or negative value means that the check is disabled. + A non-zero, positive value specifies the timeframe in seconds within failure detector is allowed to put the vehicle into a lockdown state if attitude exceeds the limits defined in FD_FAIL_P and FD_FAIL_R. The check is not executed for flight modes that do support acrobatic maneuvers, e.g: Acro (MC/FW) and Manual (FW). A zero or negative value means that the check is disabled. -1.0 5.0 s @@ -1138,6 +1228,8 @@ Battery failsafe mode Action the system takes at critical battery. See also BAT_CRIT_THR and BAT_EMERGEN_THR for definition of battery states. + 0 + 1 Warning Land mode @@ -1145,8 +1237,8 @@ - Enable Actuator Testing - If set, enables the actuator test interface via MAVLink (ACTUATOR_TEST), that allows spinning the motors and moving the servos for testing purposes. + Enable Motor Testing + If set, enables the motor test interface via MAVLink (DO_MOTOR_TEST), that allows spinning the motors for testing purposes. Time-out to wait when onboard computer connection is lost before warning about loss connection @@ -1155,10 +1247,23 @@ s 0.01 - + Set offboard loss failsafe mode The offboard loss failsafe will only be entered after a timeout, set by COM_OF_LOSS_T in seconds. + Disabled + Land mode + Hold mode + Return mode + Terminate + Lockdown + + + + Set offboard loss failsafe mode when RC is available + The offboard loss failsafe will only be entered after a timeout, set by COM_OF_LOSS_T in seconds. + + Disabled Position mode Altitude mode Manual @@ -1166,7 +1271,7 @@ Land mode Hold mode Terminate - Disarm + Lockdown @@ -1174,7 +1279,7 @@ Time-out to wait when offboard connection is lost before triggering offboard lost action - See COM_OBL_RC_ACT to configure action. + See COM_OBL_ACT and COM_OBL_RC_ACT to configure action. 0 60 s @@ -1185,10 +1290,10 @@ Position control navigation loss response - This sets the flight mode that will be used if navigation accuracy is no longer adequate for position control. If Altitude/Manual is selected: assume use of remote control after fallback. Switch to Altitude mode if a height estimate is available, else switch to MANUAL. If Land/Descend is selected: assume no use of remote control after fallback. Switch to Land mode if a height estimate is available, else switch to Descend. + This sets the flight mode that will be used if navigation accuracy is no longer adequate for position control. Navigation accuracy checks can be disabled using the CBRK_VELPOSERR parameter, but doing so will remove protection for all flight modes. - Altitude/Manual - Land/Descend + Altitude/Manual. Assume use of remote control after fallback. Switch to Altitude mode if a height estimate is available, else switch to MANUAL. + Land/Terminate. Assume no use of remote control after fallback. Switch to Land mode if a height estimate is available, else switch to TERMINATION. @@ -1198,21 +1303,28 @@ 100 s - + Horizontal position error threshold - This is the horizontal position error (EPH) threshold that will trigger a failsafe. The default is appropriate for a multicopter. Can be increased for a fixed-wing. If the previous position error was below this threshold, there is an additional factor of 2.5 applied (threshold for invalidation 2.5 times the one for validation). Set to -1 to disable. - -1 - 400 + This is the horizontal position error (EPH) threshold that will trigger a failsafe. The default is appropriate for a multicopter. Can be increased for a fixed-wing. m - 1 - - EPH threshold for RTL - Specify the threshold for triggering a warning for low local position accuracy. Additionally triggers a RTL if currently in Mission or Loiter mode. Local position has to be still declared valid, which is most of all depending on COM_POS_FS_EPH. Use this feature on systems with dead-reckoning capabilites (e.g. fixed-wing vehicles with airspeed sensor) to improve the user notification and failure mitigation when flying in GNSS-denied areas. Set to -1 to disable. - -1 - 1000 + + Vertical position error threshold + This is the vertical position error (EPV) threshold that will trigger a failsafe. The default is appropriate for a multicopter. Can be increased for a fixed-wing. m + + Loss of position probation gain factor + This sets the rate that the loss of position probation time grows when position checks are failing. The default value has been optimised for rotary wing applications. For fixed wing applications a value of 0 should be used. + true + + + Loss of position probation delay at takeoff + The probation delay is the number of seconds that the EKF innovation checks need to pass for the position to be declared good after it has been declared bad. The probation delay will be reset to this parameter value when takeoff is detected. After takeoff, if position checks are passing, the probation delay will reduce by one second for every lapsed second of valid position down to a minimum of 1 second. If position checks are failing, the probation delay will increase by COM_POS_FS_GAIN seconds for every lapsed second up to a maximum of 100 seconds. The default value has been optimised for rotary wing applications. For fixed wing applications, a value of 1 should be used. + 1 + 100 + s + Required number of redundant power modules This configures a check to verify the expected number of 5V rail power supplies are present. By default only one is expected. Note: CBRK_SUPPLY_CHK disables all power checks including this one. @@ -1228,14 +1340,13 @@ Always - - Set command after a quadchute - - Warning only - Return mode - Land mode - Hold mode - + + Delay between RC loss and configured reaction + RC signal not updated -> still use data for COM_RC_LOSS_T seconds Consider RC signal lost -> wait COM_RCL_ACT_T seconds on the spot waiting to regain signal React with failsafe action NAV_RCL_ACT A zero value disables the delay. + 0.0 + 25.0 + s + 3 RC loss exceptions @@ -1257,7 +1368,7 @@ RC control input mode - A value of 0 enables RC transmitter control (only). A valid RC transmitter calibration is required. A value of 1 allows joystick control only. RC input handling and the associated checks are disabled. A value of 2 allows either RC Transmitter or Joystick input. The first valid input is used, will fallback to other sources if the input stream becomes invalid. A value of 3 allows either input from RC or joystick. The first available source is selected and used until reboot. A value of 4 ignores any stick input. + The default value of 0 requires a valid RC transmitter setup. Setting this to 1 allows joystick control and disables RC input handling and the associated checks. A value of 2 will generate RC control data from manual input received via MAVLink instead of directly forwarding the manual input data. 0 4 @@ -1269,8 +1380,8 @@ - Manual control loss timeout - The time in seconds without a new setpoint from RC or Joystick, after which the connection is considered lost. This must be kept short as the vehicle will use the last supplied setpoint until the timeout triggers. + RC loss time threshold + After this amount of seconds without RC connection it's considered lost and not used anymore 0 35 s @@ -1279,7 +1390,7 @@ Enable RC stick override of auto and/or offboard modes - When RC stick override is enabled, moving the RC sticks more than COM_RC_STICK_OV immediately gives control back to the pilot by switching to Position mode and if position is unavailable Altitude mode. Note: Only has an effect on multicopters, and VTOLs in multicopter mode. + When RC stick override is enabled, moving the RC sticks more than COM_RC_STICK_OV immediately gives control back to the pilot by switching to Position mode and if position is unavailable Altitude mode. Note: Only has an effect on multicopters, and VTOLs in multicopter mode. This parameter is not considered in case of a GPS failure (Descend flight mode), where stick override is always enabled. 0 3 @@ -1296,14 +1407,9 @@ 0 0.05 - - Enforced delay between arming and further navigation - The minimal time from arming the motors until moving the vehicle is possible is COM_SPOOLUP_TIME seconds. Goal: - Motors and propellers spool up to idle speed before getting commanded to spin faster - Timeout for ESCs and smart batteries to successfulyy do failure checks e.g. for stuck rotors before the vehicle is off the ground - 0 - 30 - s - 1 - 0.1 + + Rearming grace period + Re-arming grace allows to rearm the drone with manual command without running prearmcheck during 5 s after disarming. Action after TAKEOFF has been accepted @@ -1313,57 +1419,23 @@ Mission (if valid) - - Enable throw-start - Allows to start the vehicle by throwing it into the air. - - - Minimum speed for the throw start - When the throw launch is enabled, the drone will only arm after this speed is exceeded before detecting the freefall. This is a safety feature to ensure the drone does not turn on after accidental drop or a rapid movement before the throw. Set to 0 to disable. - 0 - m/s - 1 - 0.1 - - + Horizontal velocity error threshold - This is the horizontal velocity error (EVH) threshold that will trigger a failsafe. The default is appropriate for a multicopter. Can be increased for a fixed-wing. If the previous velocity error was below this threshold, there is an additional factor of 2.5 applied (threshold for invalidation 2.5 times the one for validation). - 0 + This is the horizontal velocity error (EVH) threshold that will trigger a failsafe. The default is appropriate for a multicopter. Can be increased for a fixed-wing. m/s - 1 - - - High wind speed failsafe threshold - Wind speed threshold above which an automatic failsafe action is triggered. Failsafe action can be specified with COM_WIND_MAX_ACT. - -1 - m/s - 1 - 0.1 - - - High wind failsafe mode - Action the system takes when a wind speed above the specified threshold is detected. See COM_WIND_MAX to set the failsafe threshold. If enabled, it is not possible to resume the mission or switch to any auto mode other than RTL or Land if this threshold is exceeded. Taking over in any manual mode is still possible. - 1 - - None - Warning - Hold - Return - Terminate - Land - Wind speed warning threshold - A warning is triggered if the currently estimated wind speed is above this value. Warning is sent periodically (every 1 minute). Set to -1 to disable. + A warning is triggered if the currently estimated wind speed is above this value. Warning is sent periodically (every 1min). A negative value disables the feature. -1 + 30 m/s 1 0.1 - Set GCS connection loss failsafe mode - The GCS connection loss failsafe will only be entered after a timeout, set by COM_DL_LOSS_T in seconds. Once the timeout occurs the selected action will be executed. + Set data link loss failsafe mode + The data link loss failsafe will only be entered after a timeout, set by COM_DL_LOSS_T in seconds. Once the timeout occurs the selected action will be executed. 0 6 @@ -1372,7 +1444,7 @@ Return mode Land mode Terminate - Disarm + Lockdown @@ -1385,94 +1457,32 @@ Return mode Land mode Terminate - Disarm + Lockdown - - - UAVCAN/CAN v1 bus bitrate - 20000 - 1000000 - bit/s - true + + + Airfield home alt + Altitude of airfield home waypoint + -50 + m + 1 + 0.5 - - Cyphal - 0 - Cyphal disabled. 1 - Enables Cyphal - true + + Airfield home Lat + Latitude of airfield home waypoint + -900000000 + 900000000 + deg*1e7 - - Cyphal Node ID - Read the specs at http://uavcan.org to learn more about Node ID. - -1 - 125 - true - - - actuator_outputs uORB over Cyphal publication port ID - -1 - 6143 - - - UDRAL battery parameters subscription port ID - -1 - 6143 - - - UDRAL battery status subscription port ID - -1 - 6143 - - - UDRAL battery energy source subscription port ID - -1 - 6143 - - - ESC 0 subscription port ID - -1 - 6143 - - - Cyphal ESC publication port ID - -1 - 6143 - - - GPS 0 subscription port ID - -1 - 6143 - - - GPS 1 subscription port ID - -1 - 6143 - - - Cyphal GPS publication port ID - -1 - 6143 - - - Cyphal legacy battery port ID - -1 - 6143 - - - Cyphal Servo publication port ID - -1 - 6143 - - - sensor_gps uORB over Cyphal subscription port ID - -1 - 6143 - - - sensor_gps uORB over Cyphal publication port ID - -1 - 6143 + + Airfield home Lon + Longitude of airfield home waypoint + -1800000000 + 1800000000 + deg*1e7 @@ -1486,7 +1496,7 @@ Maximum IMU accel magnitude that allows IMU bias learning - If the magnitude of the IMU accelerometer vector exceeds this value, the EKF accel bias state estimation will be inhibited. This reduces the adverse effect of high manoeuvre accelerations and IMU nonlinerity and scale factor errors on the accel bias estimates. + If the magnitude of the IMU accelerometer vector exceeds this value, the EKF delta velocity state estimation will be inhibited. This reduces the adverse effect of high manoeuvre accelerations and IMU nonlinerity and scale factor errors on the delta velocity bias estimates. 20.0 200.0 m/s^2 @@ -1494,7 +1504,7 @@ Maximum IMU gyro angular rate magnitude that allows IMU bias learning - If the magnitude of the IMU angular rate vector exceeds this value, the EKF accel bias state estimation will be inhibited. This reduces the adverse effect of rapid rotation rates and associated errors on the accel bias estimates. + If the magnitude of the IMU angular rate vector exceeds this value, the EKF delta velocity state estimation will be inhibited. This reduces the adverse effect of rapid rotation rates and associated errors on the delta velocity bias estimates. 2.0 20.0 rad/s @@ -1502,14 +1512,14 @@ Accelerometer bias learning limit - The ekf accel bias states will be limited to within a range equivalent to +- of this value. + The ekf delta velocity bias states will be limited to within a range equivalent to +- of this value. 0.0 0.8 m/s^2 2 - Time constant used by acceleration and angular rate magnitude checks used to inhibit accel bias learning + Time constant used by acceleration and angular rate magnitude checks used to inhibit delta velocity bias learning The vector magnitude of angular rate and acceleration used to check if learning should be inhibited has a peak hold filter applied to it with an exponential decay. This parameter controls the time constant of the decay. 0.1 1.0 @@ -1530,6 +1540,24 @@ m/s^2 2 + + Integer bitmask controlling data fusion and aiding methods + Set bits in the following positions to enable: 0 : Set to true to use GPS data if available 1 : Set to true to use optical flow data if available 2 : Set to true to inhibit IMU delta velocity bias estimation 3 : Set to true to enable vision position fusion 4 : Set to true to enable vision yaw fusion. Cannot be used if bit position 7 is true. 5 : Set to true to enable multi-rotor drag specific force fusion 6 : set to true if the EV observations are in a non NED reference frame and need to be rotated before being used 7 : Set to true to enable GPS yaw fusion. Cannot be used if bit position 4 is true. + 0 + 511 + true + + use GPS + use optical flow + inhibit IMU bias estimation + vision position fusion + vision yaw fusion + multi-rotor drag fusion + rotate external vision + GPS yaw fusion + vision velocity fusion + + 1-sigma tilt angle uncertainty after gravity vector alignment 0.0 @@ -1540,7 +1568,7 @@ Airspeed fusion threshold - Airspeed data is fused for wind estimation if above this threshold. Set to 0 to disable airspeed fusion. For reliable wind estimation both sideslip (see EKF2_FUSE_BETA) and airspeed fusion should be enabled. Only applies to fixed-wing vehicles (or VTOLs in fixed-wing mode). + A value of zero will deactivate airspeed fusion. Any other positive value will determine the minimum airspeed which will still be fused. Set to about 90% of the vehicles stall speed. Both airspeed fusion and sideslip fusion must be active for the EKF to continue navigating after loss of GPS. Use EKF2_FUSE_BETA to activate sideslip fusion. 0.0 m/s 1 @@ -1561,17 +1589,13 @@ true - Auxiliary Velocity Estimate (e.g from a landing target) delay relative to IMU measurements + Auxillary Velocity Estimate (e.g from a landing target) delay relative to IMU measurements 0 300 ms 1 true - - Barometric sensor height aiding - If this parameter is enabled then the estimator will make use of the barometric height measurements to estimate its height in addition to other height sources (if activated). - Barometer measurement delay relative to IMU measurements 0 @@ -1596,7 +1620,7 @@ X-axis ballistic coefficient used for multi-rotor wind estimation - This parameter controls the prediction of drag produced by bluff body drag along the forward/reverse axis when flying a multi-copter which enables estimation of wind drift when enabled by the EKF2_DRAG_CTRL parameter. The drag produced by this effect scales with speed squared. The predicted drag from the rotors is specified separately by the EKF2_MCOEF parameter. Set this parameter to zero to turn off the bluff body drag model for this axis. + This parameter controls the prediction of drag produced by bluff body drag along the forward/reverse axis when flying a multi-copter which enables estimation of wind drift when enabled by the EKF2_AID_MASK parameter. The EKF2_BCOEF_X paraemter should be set initially to the ratio of mass / projected frontal area and adjusted together with EKF2_MCOEF to minimise variance of the X-axis drag specific force innovation sequence. The drag produced by this effect scales with speed squared. Set this parameter to zero to turn off the bluff body drag model for this axis. The predicted drag from the rotors is specified separately by the EKF2_MCOEF parameter. 0.0 200.0 kg/m^2 @@ -1604,7 +1628,7 @@ Y-axis ballistic coefficient used for multi-rotor wind estimation - This parameter controls the prediction of drag produced by bluff body drag along the right/left axis when flying a multi-copter, which enables estimation of wind drift when enabled by the EKF2_DRAG_CTRL parameter. The drag produced by this effect scales with speed squared. The predicted drag from the rotors is specified separately by the EKF2_MCOEF parameter. Set this parameter to zero to turn off the bluff body drag model for this axis. + This parameter controls the prediction of drag produced by bluff body drag along the right/left axis when flying a multi-copter, which enables estimation of wind drift when enabled by the EKF2_AID_MASK parameter. The EKF2_BCOEF_Y paraemter should be set initially to the ratio of mass / projected side area and adjusted together with EKF2_MCOEF to minimise variance of the Y-axis drag specific force innovation sequence. The drag produced by this effect scales with speed squared. et this parameter to zero to turn off the bluff body drag model for this axis. The predicted drag from the rotors is specified separately by the EKF2_MCOEF parameter. 0.0 200.0 kg/m^2 @@ -1636,10 +1660,6 @@ use declination as an observation - - Multirotor wind estimation selection - Activate wind speed estimation using specific-force measurements and a drag model defined by EKF2_BCOEF_[XY] and EKF2_MCOEF. Only use on vehicles that have their thrust aligned with the Z axis and no thrust in the XY plane. - Specific drag force observation noise variance used by the multi-rotor specific drag force model Increasing this makes the multi-rotor wind estimates adjust more slowly. @@ -1655,7 +1675,7 @@ m/s 1 - + Measurement noise for vision angle observations used to lower bound or replace the uncertainty included in the message 0.05 rad @@ -1687,19 +1707,7 @@ m/s 2 - - External vision (EV) sensor aiding - Set bits in the following positions to enable: 0 : Horizontal position fusion 1 : Vertical position fusion 2 : 3D velocity fusion 3 : Yaw - 0 - 15 - - Horizontal position - Vertical position - 3D velocity - Yaw - - - + Vision Position Estimator delay relative to IMU measurements 0 300 @@ -1707,13 +1715,9 @@ 1 true - - External vision (EV) noise mode - If set to 0 (default) the measurement noise is taken from the vision message and the EV noise parameters are used as a lower bound. If set to 1 the observation noise is set from the parameters directly, - - EV reported variance (parameter lower bound) - EV noise parameters - + + Whether to set the external vision observation noise from the parameter or from vision message + If set to true the observation noise is set from the parameters directly, if set to false the measurement noise is taken from the vision message and the parameter are used as a lower bound. X position of VI sensor focal point in body frame (forward axis with origin relative to vehicle centre of gravity) @@ -1730,16 +1734,9 @@ m 3 - - External vision (EV) minimum quality (optional) - External vision will only be started and fused if the quality metric is above this threshold. The quality metric is a completely optional field provided by some VIO systems. - 0 - 100 - 1 - - Enable synthetic sideslip fusion - For reliable wind estimation both sideslip and airspeed fusion (see EKF2_ARSP_THR) should be enabled. Only applies to fixed-wing vehicles (or VTOLs in fixed-wing mode). Note: side slip fusion is currently not supported for tailsitters. + Boolean determining if synthetic sideslip measurements should fused + A value of 1 indicates that fusion is active Both sideslip fusion and airspeed fusion must be active for the EKF to continue navigating after loss of GPS. Use EKF2_ARSP_THR to activate airspeed fusion. 1-sigma IMU gyro switch-on bias @@ -1767,7 +1764,7 @@ Integer bitmask controlling GPS checks - Set bits to 1 to enable checks. Checks enabled by the following bit positions 0 : Minimum required sat count set by EKF2_REQ_NSATS 1 : Maximum allowed PDOP set by EKF2_REQ_PDOP 2 : Maximum allowed horizontal position error set by EKF2_REQ_EPH 3 : Maximum allowed vertical position error set by EKF2_REQ_EPV 4 : Maximum allowed speed error set by EKF2_REQ_SACC 5 : Maximum allowed horizontal position rate set by EKF2_REQ_HDRIFT. This check will only run when the vehicle is on ground and stationary. 6 : Maximum allowed vertical position rate set by EKF2_REQ_VDRIFT. This check will only run when the vehicle is on ground and stationary. 7 : Maximum allowed horizontal speed set by EKF2_REQ_HDRIFT. This check will only run when the vehicle is on ground and stationary. 8 : Maximum allowed vertical velocity discrepancy set by EKF2_REQ_VDRIFT + Set bits to 1 to enable checks. Checks enabled by the following bit positions 0 : Minimum required sat count set by EKF2_REQ_NSATS 1 : Maximum allowed PDOP set by EKF2_REQ_PDOP 2 : Maximum allowed horizontal position error set by EKF2_REQ_EPH 3 : Maximum allowed vertical position error set by EKF2_REQ_EPV 4 : Maximum allowed speed error set by EKF2_REQ_SACC 5 : Maximum allowed horizontal position rate set by EKF2_REQ_HDRIFT. This check will only run when the vehicle is on ground and stationary. Detecton of the stationary condition is controlled by the EKF2_MOVE_TEST parameter. 6 : Maximum allowed vertical position rate set by EKF2_REQ_VDRIFT. This check will only run when the vehicle is on ground and stationary. Detecton of the stationary condition is controlled by the EKF2_MOVE_TEST parameter. 7 : Maximum allowed horizontal speed set by EKF2_REQ_HDRIFT. This check will only run when the vehicle is on ground and stationary. Detecton of the stationary condition is controlled by the EKF2_MOVE_TEST parameter. 8 : Maximum allowed vertical velocity discrepancy set by EKF2_REQ_VDRIFT 0 511 @@ -1782,18 +1779,6 @@ Max vertical velocity discrepancy (EKF2_REQ_VDRIFT) - - GNSS sensor aiding - Set bits in the following positions to enable: 0 : Longitude and latitude fusion 1 : Altitude fusion 2 : 3D velocity fusion 3 : Dual antenna heading fusion - 0 - 15 - - Lon/lat - Altitude - 3D velocity - Dual antenna heading - - GPS measurement delay relative to IMU measurements 0 @@ -1818,56 +1803,41 @@ 3 - Gate size for GNSS position fusion + Gate size for GPS horizontal position fusion Sets the number of standard deviations used by the innovation consistency test. 1.0 SD 1 - Measurement noise for GNSS position + Measurement noise for gps position 0.01 10.0 m 2 - Gate size for GNSS velocity fusion + Gate size for GPS velocity fusion Sets the number of standard deviations used by the innovation consistency test. 1.0 SD 1 - Measurement noise for GNSS velocity + Measurement noise for gps horizontal velocity 0.01 5.0 m/s 2 - - Accelerometer measurement noise for gravity based observations - 0.1 - 10.0 - m/s^2 - 2 - Default value of true airspeed used in EKF-GSF AHRS calculation - If no airspeed measurements are available, the EKF-GSF AHRS calculation will assume this value of true airspeed when compensating for centripetal acceleration during turns. Set to zero to disable centripetal acceleration compensation during fixed wing flight modes. + If no airspeed measurements are avalable, the EKF-GSF AHRS calculation will assume this value of true airspeed when compensating for centripetal acceleration during turns. Set to zero to disable centripetal acceleration compensation during fixed wing flight modes. 0.0 100.0 m/s 1 - - Gyro bias learning limit - The ekf gyro bias states will be limited to within a range equivalent to +- of this value. - 0.0 - 0.4 - rad/s - 3 - Process noise for IMU rate gyro bias prediction 0.0 @@ -1883,7 +1853,7 @@ 4 - Gate size for heading fusion + Gate size for magnetic heading fusion Sets the number of standard deviations used by the innovation consistency test. 1.0 SD @@ -1896,9 +1866,9 @@ rad 2 - - Determines the reference source of height data used by the EKF - When multiple height sources are enabled at the same time, the height estimate will always converge towards the reference height source selected by this parameter. The range sensor and vision options should only be used when for operation over a flat surface as the local NED origin will move up and down with ground level. + + Determines the primary source of height data used by the EKF + The range sensor option should only be used when for operation over a flat surface as the local NED origin will move up and down with ground level. true Barometric pressure @@ -1907,16 +1877,6 @@ Vision - - IMU control - 0 - 7 - - Gyro Bias - Accel Bias - Gravity vector fusion - - X position of IMU in body frame (forward axis with origin relative to vehicle centre of gravity) m @@ -1934,7 +1894,7 @@ Horizontal acceleration threshold used by automatic selection of magnetometer fusion method - This parameter is used when the magnetometer fusion method is set automatically (EKF2_MAG_TYPE = 0). If the filtered horizontal acceleration is greater than this parameter value, then the EKF will use 3-axis magnetometer fusion. + This parameter is used when the magnetometer fusion method is set automatically (EKF2_MAG_TYPE = 0). If the filtered horizontal acceleration is greater than this parameter value, then the EKF will use 3-axis magnetomer fusion. 0.0 5.0 m/s^2 @@ -1947,32 +1907,9 @@ gauss/s 6 - + Magnetic field strength test selection - Bitmask to set which check is used to decide whether the magnetometer data is valid. If GNSS data is received, the magnetic field is compared to a World Magnetic Model (WMM), otherwise an average value is used. This check is useful to reject occasional hard iron disturbance. Set bits to 1 to enable checks. Checks enabled by the following bit positions 0 : Magnetic field strength. Set tolerance using EKF2_MAG_CHK_STR 1 : Magnetic field inclination. Set tolerance using EKF2_MAG_CHK_INC 2 : Wait for GNSS to find the theoretical strength and inclination using the WMM - 0 - 7 - - Strength (EKF2_MAG_CHK_STR) - Inclination (EKF2_MAG_CHK_INC) - Wait for WMM - - - - Magnetic field inclination check tolerance - Maximum allowed deviation from the expected magnetic field inclination to pass the check. - 0.0 - 90.0 - deg - 1 - - - Magnetic field strength check tolerance - Maximum allowed deviation from the expected magnetic field strength to pass the check. - 0.0 - 1.0 - gauss - 2 + When set, the EKF checks the strength of the magnetic field to decide whether the magnetometer data is valid. If GPS data is received, the magnetic field is compared to a World Magnetic Model (WMM), otherwise an average value is used. This check is useful to reject occasional hard iron disturbance. Magnetic declination @@ -2010,37 +1947,55 @@ Type of magnetometer fusion - Integer controlling the type of magnetometer fusion used - magnetic heading or 3-component vector. The fusion of magnetometer data as a three component vector enables vehicle body fixed hard iron errors to be learned, but requires a stable earth field. If set to 'Automatic' magnetic heading fusion is used when on-ground and 3-axis magnetic field fusion in-flight with fallback to magnetic heading fusion if there is insufficient motion to make yaw or magnetic field states observable. If set to 'Magnetic heading' magnetic heading fusion is used at all times. If set to 'None' the magnetometer will not be used under any circumstance. If no external source of yaw is available, it is possible to use post-takeoff horizontal movement combined with GPS velocity measurements to align the yaw angle with the timer required (depending on the amount of movement and GPS data quality). + Integer controlling the type of magnetometer fusion used - magnetic heading or 3-component vector. The fuson of magnetomer data as a three component vector enables vehicle body fixed hard iron errors to be learned, but requires a stable earth field. If set to 'Automatic' magnetic heading fusion is used when on-ground and 3-axis magnetic field fusion in-flight with fallback to magnetic heading fusion if there is insufficient motion to make yaw or magnetic field states observable. If set to 'Magnetic heading' magnetic heading fusion is used at all times If set to '3-axis' 3-axis field fusion is used at all times. If set to 'VTOL custom' the behaviour is the same as 'Automatic', but if fusing airspeed, magnetometer fusion is only allowed to modify the magnetic field states. This can be used by VTOL platforms with large magnetic field disturbances to prevent incorrect bias states being learned during forward flight operation which can adversely affect estimation accuracy after transition to hovering flight. If set to 'MC custom' the behaviour is the same as 'Automatic, but if there are no earth frame position or velocity observations being used, the magnetometer will not be used. This enables vehicles to operate with no GPS in environments where the magnetic field cannot be used to provide a heading reference. Prior to flight, the yaw angle is assumed to be constant if movement tests controlled by the EKF2_MOVE_TEST parameter indicate that the vehicle is static. This allows the vehicle to be placed on the ground to learn the yaw gyro bias prior to flight. If set to 'None' the magnetometer will not be used under any circumstance. If no external source of yaw is available, it is possible to use post-takeoff horizontal movement combined with GPS velocity measurements to align the yaw angle with the timer required (depending on the amount of movement and GPS data quality). Other external sources of yaw may be used if selected via the EKF2_AID_MASK parameter. true Automatic Magnetic heading + 3-axis + VTOL custom + MC custom None - + Yaw rate threshold used by automatic selection of magnetometer fusion method - This parameter is used when the magnetometer fusion method is set automatically (EKF2_MAG_TYPE = 0). If the filtered yaw rate is greater than this parameter value, then the EKF will use 3-axis magnetometer fusion. + This parameter is used when the magnetometer fusion method is set automatically (EKF2_MAG_TYPE = 0). If the filtered yaw rate is greater than this parameter value, then the EKF will use 3-axis magnetomer fusion. 0.0 1.0 rad/s 2 - Propeller momentum drag coefficient used for multi-rotor wind estimation - This parameter controls the prediction of drag produced by the propellers when flying a multi-copter, which enables estimation of wind drift when enabled by the EKF2_DRAG_CTRL parameter. The drag produced by this effect scales with speed not speed squared and is produced because some of the air velocity normal to the propeller axis of rotation is lost when passing through the rotor disc. This changes the momentum of the flow which creates a drag reaction force. When comparing un-ducted propellers of the same diameter, the effect is roughly proportional to the area of the propeller blades when viewed side on and changes with propeller selection. Momentum drag is significantly higher for ducted rotors. To account for the drag produced by the body which scales with speed squared, see documentation for the EKF2_BCOEF_X and EKF2_BCOEF_Y parameters. Set this parameter to zero to turn off the momentum drag model for both axis. + propeller momentum drag coefficient used for multi-rotor wind estimation + This parameter controls the prediction of drag produced by the propellers when flying a multi-copter, which enables estimation of wind drift when enabled by the EKF2_AID_MASK parameter. The drag produced by this effect scales with speed not speed squared and is produced because some of the air velocity normal to the propeller axis of rotation is lost when passing through the rotor disc. This changes the momentum of the flow which creates a drag reaction force. When comparing un-ducted propellers of the same diameter, the effect is roughly proportional to the area of the propeller blades when viewed side on and changes with propeller selection. Momentum drag is significantly higher for ducted rotors. For example, if flying at 10 m/s at sea level conditions produces a rotor induced drag deceleration of 1.5 m/s/s when the multi-copter levelled to zero roll/pitch, then EKF2_MCOEF would be set to 0.15 = (1.5/10.0). Set EKF2_MCOEF to a positive value to enable wind estimation using this drag effect. To account for the drag produced by the body which scales with speed squared, see documentation for the EKF2_BCOEF_X and EKF2_BCOEF_Y parameters. The EKF2_MCOEF parameter should be adjusted together with EKF2_BCOEF_X and EKF2_BCOEF_Y to minimise variance of the X and y axis drag specific force innovation sequences. 0 1.0 1/s 2 + + Minimum time of arrival delta between non-IMU observations before data is downsampled + Baro and Magnetometer data will be averaged before downsampling, other data will be point sampled resulting in loss of information. + 10 + 50 + ms + true + Expected range finder reading when on ground - If the vehicle is on ground, is not moving as determined by the motion test and the range finder is returning invalid or no data, then an assumed range value of EKF2_MIN_RNG will be used by the terrain estimator so that a terrain height estimate is available at the start of flight in situations where the range finder may be inside its minimum measurements distance when on ground. + If the vehicle is on ground, is not moving as determined by the motion test controlled by EKF2_MOVE_TEST and the range finder is returning invalid or no data, then an assumed range value of EKF2_MIN_RNG will be used by the terrain estimator so that a terrain height estimate is avilable at the start of flight in situations where the range finder may be inside its minimum measurements distance when on ground. 0.01 m 2 + + Vehicle movement test threshold + Scales the threshold tests applied to IMU data used to determine if the vehicle is static or moving. See parameter descriptions for EKF2_GPS_CHECK and EKF2_MAG_TYPE for further information on the functionality affected by this parameter. + 0.1 + 10.0 + 1 + Multi-EKF IMUs Maximum number of IMUs to use for Multi-EKF. Set 0 to disable. Requires SENS_IMU_MODE 0. @@ -2068,10 +2023,6 @@ 10000000 us - - Optical flow aiding - Enable optical flow fusion. - Optical flow measurement delay relative to IMU measurements Assumes measurement is timestamped at trailing edge of integration period @@ -2117,12 +2068,7 @@ 3 - Optical Flow data will only be used in air if the sensor reports a quality metric >= EKF2_OF_QMIN - 0 - 255 - - - Optical Flow data will only be used on the ground if the sensor reports a quality metric >= EKF2_OF_QMIN_GND + Optical Flow data will only be used if the sensor reports a quality metric >= EKF2_OF_QMIN 0 255 @@ -2161,13 +2107,6 @@ 0.5 2 - - EKF prediction period - EKF prediction period in microseconds. This should ideally be an integer multiple of the IMU time delta. Actual filter update will be an integer multiple of IMU update. - 1000 - 20000 - us - Required EPH to use GPS 2 @@ -2222,9 +2161,17 @@ m/s 2 + + Range sensor aid + If this parameter is enabled then the estimator will make use of the range finder measurements to estimate it's height even if range sensor is not the primary height source. It will only do so if conditions for range measurement fusion are met. This enables the range finder to be used during low speed and low altitude operation, eg takeoff and landing, where baro interference from rotor wash is excessive and can corrupt EKF state estimates. It is intended to be used where a vertical takeoff and landing is performed, and horizontal flight does not occur until above EKF2_RNG_A_HMAX. If vehicle motion causes repeated switching between the primary height sensor and range finder, an offset in the local position origin can accumulate. Also range finder measurements are less reliable and can experience unexpected errors. For these reasons, if accurate control of height relative to ground is required, it is recommended to use the MPC_ALT_MODE parameter instead, unless baro errors are severe enough to cause problems with landing and takeoff. + + Range aid disabled + Range aid enabled + + - Maximum absolute altitude (height above ground level) allowed for conditional range aid mode - If the vehicle absolute altitude exceeds this value then the estimator will not fuse range measurements to estimate its height. This only applies when conditional range aid mode is activated (EKF2_RNG_CTRL = 1). + Maximum absolute altitude (height above ground level) allowed for range aid mode + If the vehicle absolute altitude exceeds this value then the estimator will not fuse range measurements to estimate it's height. This only applies when range aid mode is activated (EKF2_RNG_AID = enabled). 1.0 10.0 m @@ -2237,21 +2184,12 @@ SD - Maximum horizontal velocity allowed for conditional range aid mode - If the vehicle horizontal speed exceeds this value then the estimator will not fuse range measurements to estimate its height. This only applies when conditional range aid mode is activated (EKF2_RNG_CTRL = 1). + Maximum horizontal velocity allowed for range aid mode + If the vehicle horizontal speed exceeds this value then the estimator will not fuse range measurements to estimate it's height. This only applies when range aid mode is activated (EKF2_RNG_AID = enabled). 0.1 2 m/s - - Range sensor height aiding - WARNING: Range finder measurements are less reliable and can experience unexpected errors. For these reasons, if accurate control of height relative to ground is required, it is recommended to use the MPC_ALT_MODE parameter instead, unless baro errors are severe enough to cause problems with landing and takeoff. To en-/disable range finder for terrain height estimation, use EKF2_TERR_MASK instead. If this parameter is enabled then the estimator will make use of the range finder measurements to estimate its height in addition to other height sources (if activated). Range sensor aiding can be enabled (i.e.: always use) or set in "conditional" mode. Conditional mode: This enables the range finder to be used during low speed (< EKF2_RNG_A_VMAX) and low altitude (< EKF2_RNG_A_HMAX) operation, eg takeoff and landing, where baro interference from rotor wash is excessive and can corrupt EKF state estimates. It is intended to be used where a vertical takeoff and landing is performed, and horizontal flight does not occur until above EKF2_RNG_A_HMAX. - - Disable range fusion - Enabled (conditional mode) - Enabled - - Range finder measurement delay relative to IMU measurements 0 @@ -2267,13 +2205,6 @@ SD 1 - - Gate size used for range finder kinematic consistency check - To be used, the time derivative of the distance sensor measurements projected on the vertical axis needs to be statistically consistent with the estimated vertical velocity of the drone. Decrease this value to make the filter more robust against range finder faulty data (stuck, reflections, ...). Note: tune the range finder noise parameters (EKF2_RNG_NOISE and EKF2_RNG_SFE) before tuning this gate. - 0.1 - 5.0 - SD - Measurement noise for range finder fusion 0.01 @@ -2309,7 +2240,7 @@ s - Range finder range dependent noise scaler + Range finder range dependant noise scaler Specifies the increase in range finder noise with range. 0.0 0.2 @@ -2341,9 +2272,9 @@ Enable synthetic magnetometer Z component measurement - Use for vehicles where the measured body Z magnetic field is subject to strong magnetic interference. For magnetic heading fusion the magnetometer Z measurement will be replaced by a synthetic value calculated using the knowledge of the 3D magnetic field vector at the location of the drone. Therefore, this parameter will only have an effect if the global position of the drone is known. For 3D mag fusion the magnetometer Z measurement will simply be ignored instead of fusing the synthetic value. + Use for vehicles where the measured body Z magnetic field is subject to strong magnetic interference. For magnetic heading fusion the magnetometer Z measurement will be replaced by a synthetic value calculated using the knowledge of the 3D magnetic field vector at the location of the drone. Therefore, this parameter will only have an effect if the global position of the drone is known. For 3D mag fusion the magnetometer Z measurement will simply be ingored instead of fusing the synthetic value. - + Gate size for TAS fusion Sets the number of standard deviations used by the innovation consistency test. 1.0 @@ -2385,12 +2316,11 @@ m/s 1 - - Process noise spectral density for wind velocity prediction - When unaided, the wind estimate uncertainty (1-sigma, in m/s) increases by this amount every second. + + Process noise for wind velocity prediction 0.0 1.0 - m/s^2/sqrt(Hz) + m/s^2 3 @@ -2424,564 +2354,33 @@ - - Maximum manual pitch angle - Applies to both directions in all manual modes with attitude stabilization but without altitude control - 0.0 - 90.0 - deg - 1 - 0.5 - - - Maximum manual roll angle - Applies to both directions in all manual modes with attitude stabilization - 0.0 - 90.0 - deg - 1 - 0.5 - - - Maximum manually added yaw rate - This is the maximally added yaw rate setpoint from the yaw stick in any attitude controlled flight mode. It is added to the yaw rate setpoint generated by the controller for turn coordination. - 0 - deg/s - 1 - 0.5 - - - Pitch setpoint offset (pitch at level flight) - An airframe specific offset of the pitch setpoint in degrees, the value is added to the pitch setpoint and should correspond to the pitch at typical cruise speed of the airframe. - -90.0 - 90.0 - deg - 1 - 0.5 - - - Maximum negative / down pitch rate setpoint - 0.0 - 180 - deg/s - 1 - 0.5 - - - Maximum positive / up pitch rate setpoint - 0.0 - 180 - deg/s - 1 - 0.5 - - - Attitude pitch time constant - This defines the latency between a pitch step input and the achieved setpoint (inverse to a P gain). Smaller systems may require smaller values. - 0.2 - 1.0 - s - 2 - 0.05 - - - Maximum roll rate setpoint - 0.0 - 180 - deg/s - 1 - 0.5 - - - Attitude Roll Time Constant - This defines the latency between a roll step input and the achieved setpoint (inverse to a P gain). Smaller systems may require smaller values. - 0.2 - 1.0 - s - 2 - 0.05 - - - Spoiler descend setting - 0.0 - 1.0 - norm - 2 - 0.01 - - - Spoiler landing setting - 0.0 - 1.0 - norm - 2 - 0.01 - - - Wheel steering rate feed forward - 0.0 - 10 - %/rad/s - 2 - 0.05 - - - Wheel steering rate integrator gain - This gain defines how much control response will result out of a steady state error. It trims any constant error. - 0.0 - 10 - %/rad - 3 - 0.005 - - - Wheel steering rate integrator limit - 0.0 - 1.0 - 2 - 0.05 - - - Wheel steering rate proportional gain - This defines how much the wheel steering input will be commanded depending on the current body angular rate error. - 0.0 - 10 - %/rad/s - 3 - 0.005 - - - Enable wheel steering controller - Only enabled during automatic runway takeoff and landing. In all manual modes the wheel is directly controlled with yaw stick. - - - Maximum wheel steering rate - This limits the maximum wheel steering rate the controller will output (in degrees per second). - 0.0 - 90.0 - deg/s - 1 - 0.5 - - - Maximum yaw rate setpoint - 0.0 - 180 - deg/s - 1 - 0.5 - - - - - Bit mask to set the automatic landing abort conditions - Terrain estimation: bit 0: Abort if terrain is not found bit 1: Abort if terrain times out (after a first successful measurement) The last estimate is always used as ground, whether the last valid measurement or the land waypoint, depending on the selected abort criteria, until an abort condition is entered. If FW_LND_USETER == 0, these bits are ignored. TODO: Extend automatic abort conditions e.g. glide slope tracking error (horizontal and vertical) - 0 - 3 - - Abort if terrain is not found (only applies to mission landings) - Abort if terrain times out (after a first successful measurement) - - - - Landing airspeed - The calibrated airspeed setpoint during landing. If set <= 0.0, landing airspeed = FW_AIRSPD_MIN by default. - -1.0 - m/s - 1 - 0.1 - - - Maximum landing slope angle - Typically the desired landing slope angle when landing configuration (flaps, airspeed) is enabled. Set this value within the vehicle's performance limits. - 1.0 - 15.0 - deg - 1 - 0.5 - - - Early landing configuration deployment - When disabled, the landing configuration (flaps, landing airspeed, etc.) is only activated on the final approach to landing. When enabled, it is already activated when entering the final loiter-down (loiter-to-alt) waypoint before the landing approach. - - - Landing flare altitude (relative to landing altitude) - NOTE: max(FW_LND_FLALT, FW_LND_FL_TIME * |z-velocity|) is taken as the flare altitude - 0.0 - m - 1 - 0.5 - - - Flare, maximum pitch - Maximum pitch during flare, a positive sign means nose up Applied once flaring is triggered - 0 - 45.0 - deg - 1 - 0.5 - - - Flare, minimum pitch - Minimum pitch during flare, a positive sign means nose up Applied once flaring is triggered - -5 - 15.0 - deg - 1 - 0.5 - - - Landing flare sink rate - TECS will attempt to control the aircraft to this sink rate via pitch angle (throttle killed during flare) - 0.0 - 2 - m/s - 2 - 0.1 - - - Landing flare time - Multiplied by the descent rate to calculate a dynamic altitude at which to trigger the flare. NOTE: max(FW_LND_FLALT, FW_LND_FL_TIME * descent rate) is taken as the flare altitude - 0.1 - 5.0 - s - 1 - 0.1 - - - Landing touchdown nudging option - Approach angle nudging: shifts the touchdown point laterally while keeping the approach entrance point constant Approach path nudging: shifts the touchdown point laterally along with the entire approach path This is useful for manually adjusting the landing point in real time when map or GNSS errors cause an offset from the desired landing vector. Nuding is done with yaw stick, constrained to FW_LND_TD_OFF (in meters) and the direction is relative to the vehicle heading (stick deflection to the right = land point moves to the right as seen by the vehicle). - 0 - 2 - - Disable nudging - Nudge approach angle - Nudge approach path - - - - Maximum lateral position offset for the touchdown point - 0.0 - 10.0 - m - 1 - 1 - - - Landing touchdown time (since flare start) - This is the time after the start of flaring that we expect the vehicle to touch the runway. At this time, a 0.5s clamp down ramp will engage, constraining the pitch setpoint to RWTO_PSP. If enabled, ensure that RWTO_PSP is configured appropriately for full gear contact on ground roll. Set to -1.0 to disable touchdown clamping. E.g. it may not be desirable to clamp on belly landings. The touchdown time will be constrained to be greater than or equal to the flare time (FW_LND_FL_TIME). - -1.0 - 5.0 - s - 1 - 0.1 - - - Altitude time constant factor for landing - Set this parameter to less than 1.0 to make TECS react faster to altitude errors during landing than during normal flight. During landing, the TECS altitude time constant (FW_T_ALT_TC) is multiplied by this value. - 0.2 - 1.0 - - 0.1 - - - Use terrain estimation during landing. This is critical for detecting when to flare, and should be enabled if possible - NOTE: terrain estimate is currently solely derived from a distance sensor. If enabled and no measurement is found within a given timeout, the landing waypoint altitude will be used OR the landing will be aborted, depending on the criteria set in FW_LND_ABORT. If disabled, FW_LND_ABORT terrain based criteria are ignored. - 0 - 2 - - Disable the terrain estimate - Use the terrain estimate to trigger the flare (only) - Calculate landing glide slope relative to the terrain estimate - - - - - - Height (AGL) of the wings when the aircraft is on the ground - This is used to constrain a minimum altitude below which we keep wings level to avoid wing tip strike. It's safer to give a slight margin here (> 0m) - 0.0 - m - 1 - 1 - - - The aircraft's wing span (length from tip to tip) - This is used for limiting the roll setpoint near the ground. (if multiple wings, take the longest span) - 0.1 - m - 1 - 0.1 - - - - - Trigger time - Launch is detected when acceleration in body forward direction is above FW_LAUN_AC_THLD for FW_LAUN_AC_T seconds. - 0.0 - 5.0 - s - 2 - 0.05 - - - Trigger acceleration threshold - Launch is detected when acceleration in body forward direction is above FW_LAUN_AC_THLD for FW_LAUN_AC_T seconds. - 0 - m/s^2 - 1 - 0.5 - - - Fixed-wing launch detection - Enables automatic launch detection based on measured acceleration. Use for hand- or catapult-launched vehicles. Not compatible with runway takeoff. - - - Motor delay - Start the motor(s) this amount of seconds after launch is detected. - 0.0 - 10.0 - s - 1 - 0.5 - - - - - NPFG damping ratio - Damping ratio of the NPFG control law. - 0.10 - 1.00 - 2 - 0.01 - - - Enable minimum forward ground speed maintaining excess wind handling logic - - - Maximum, minimum forward ground speed for track keeping in excess wind - The maximum value of the minimum forward ground speed that may be commanded by the track keeping excess wind handling logic. Commanded in full at the normalized track error fraction of the track error boundary and reduced to zero on track. - 0.0 - 10.0 - m/s - 1 - 0.5 - - - Enable automatic lower bound on the NPFG period - Avoids limit cycling from a too aggressively tuned period/damping combination. If set to false, also disables the upper bound NPFG_PERIOD_UB. - - - NPFG period - Period of the NPFG control law. - 1.0 - 100.0 - s - 1 - 0.1 - - - Period safety factor - Multiplied by period for conservative minimum period bounding (when period lower bounding is enabled). 1.0 bounds at marginal stability. - 1.0 - 10.0 - 1 - 0.1 - - - Roll time constant - Time constant of roll controller command / response, modeled as first order delay. Used to determine lower period bound. Setting zero disables automatic period bounding. - 0.00 - 2.00 - s - 2 - 0.05 - - - NPFG switch distance multiplier - Multiplied by the track error boundary to determine when the aircraft switches to the next waypoint and/or path segment. Should be less than 1. - 0.1 - 1.0 - 2 - 0.01 - - - Enable track keeping excess wind handling logic - - - Enable automatic upper bound on the NPFG period - Adapts period to maintain track keeping in variable winds and path curvature. - - - Enable wind excess regulation - Disabling this parameter further disables all other airspeed incrementation options. - - - - - Path navigation roll slew rate limit - The maximum change in roll angle setpoint per second. - 0 - deg/s - 0 - 1 - - - RC stick configuration fixed-wing - Set RC/joystick configuration for fixed-wing manual position and altitude controlled flight. - 0 - 3 - - Alternative stick configuration (height rate on throttle stick, airspeed on pitch stick) - Enable airspeed setpoint via sticks in altitude and position flight mode - - - - Maximum roll angle - The maximum roll angle setpoint for setpoint for a height-rate or altitude controlled mode. - 35.0 - 65.0 - deg - 1 - 0.5 - - - Minimum pitch during takeoff - -5.0 - 30.0 - deg - 1 - 0.5 - - - - - Maximum Airspeed (CAS) - The maximal airspeed (calibrated airspeed) the user is able to command. - 0.5 - m/s - 1 - 0.5 - - - Minimum Airspeed (CAS) - The minimal airspeed (calibrated airspeed) the user is able to command. Further, if the airspeed falls below this value, the TECS controller will try to increase airspeed more aggressively. Has to be set according to the vehicle's stall speed (which should be set in FW_AIRSPD_STALL), with some margin between the stall speed and minimum airspeed. This value corresponds to the desired minimum speed with the default load factor (level flight, default weight), and is automatically adpated to the current load factor (calculated from roll setpoint and WEIGHT_GROSS/WEIGHT_BASE). - 0.5 - m/s - 1 - 0.5 - - - Stall Airspeed (CAS) - The stall airspeed (calibrated airspeed) of the vehicle. It is used for airspeed sensor failure detection and for the control surface scaling airspeed limits. - 0.5 - m/s - 1 - 0.5 - - - Trim (Cruise) Airspeed - The trim CAS (calibrated airspeed) of the vehicle. If an airspeed controller is active, this is the default airspeed setpoint that the controller will try to achieve. This value corresponds to the trim airspeed with the default load factor (level flight, default weight). - 0.5 - m/s - 1 - 0.5 - - - Service ceiling - Altitude in standard atmosphere at which the vehicle in normal configuration (WEIGHT_BASE) is still able to achieve a maximum climb rate of 0.5m/s at maximum throttle (FW_THR_MAX). Used to compensate for air density in FW_T_CLMB_MAX. Set negative to disable. - -1.0 - m - 0 - 1.0 - - - Throttle at max airspeed - Required throttle (at sea level, standard atmosphere) for level flight at maximum airspeed FW_AIRSPD_MAX Set to 0 to disable mapping of airspeed to trim throttle. - 0 - 1 - 2 - 0.01 - - - Throttle at min airspeed - Required throttle (at sea level, standard atmosphere) for level flight at minimum airspeed FW_AIRSPD_MIN Set to 0 to disable mapping of airspeed to trim throttle below FW_AIRSPD_TRIM. - 0 - 1 - 2 - 0.01 - - - Trim throttle - Required throttle (at sea level, standard atmosphere) for level flight at FW_AIRSPD_TRIM - 0.0 - 1.0 - norm - 2 - 0.01 - - - Maximum climb rate - This is the maximum calibrated climb rate that the aircraft can achieve with the throttle set to FW_THR_MAX and the airspeed set to the trim value. For electric aircraft make sure this number can be achieved towards the end of flight when the battery voltage has reduced. - 1.0 - 15.0 - m/s - 1 - 0.5 - - - Minimum descent rate - This is the minimum calibrated sink rate of the aircraft with the throttle set to THR_MIN and flown at the same airspeed as used to measure FW_T_CLMB_MAX. - 1.0 - 5.0 - m/s - 1 - 0.5 - - - Vehicle base weight - This is the weight of the vehicle at which it's performance limits were derived. A zero or negative value disables trim throttle and minimum airspeed compensation based on weight. - kg - 1 - 0.5 - - - Vehicle gross weight - This is the actual weight of the vehicle at any time. This value will differ from WEIGHT_BASE in case weight was added or removed from the base weight. Examples are the addition of payloads or larger batteries. A zero or negative value disables trim throttle and minimum airspeed compensation based on weight. - kg - 1 - 0.1 - - - - Acro body roll max rate setpoint - 10 + Acro body x max rate + This is the rate the controller is trying to achieve if the user applies full roll stick input in acro mode. + 45 720 deg - - Enable yaw rate controller in Acro - If this parameter is set to 1, the yaw rate controller is enabled in Fixed-wing Acro mode. Otherwise the pilot commands directly the yaw actuator. It is disabled by default because an active yaw rate controller will fight against the natural turn coordination of the plane. - - Acro body pitch max rate setpoint - 10 + Acro body y max rate + This is the body y rate the controller is trying to achieve if the user applies full pitch stick input in acro mode. + 45 720 deg - Acro body yaw max rate setpoint + Acro body z max rate + This is the body z rate the controller is trying to achieve if the user applies full yaw stick input in acro mode. 10 - 720 + 180 deg Airspeed mode - On vehicles without airspeed sensor this parameter can be used to enable flying without an airspeed reading + For small wings or VTOL without airspeed sensor this parameter can be used to enable flying without an airspeed reading - Use airspeed in controller - Do not use airspeed in controller + Normal (use airspeed if available) + Airspeed disabled @@ -2989,60 +2388,92 @@ This enables a logic that automatically adjusts the output of the rate controller to take into account the real torque produced by an aerodynamic control surface given the current deviation from the trim airspeed (FW_AIRSPD_TRIM). Enable when using aerodynamic control surfaces (e.g.: plane) Disable when using rotor wings (e.g.: autogyro) - Enable throttle scale by battery level - This compensates for voltage drop of the battery over time by attempting to normalize performance across the operating range of the battery. + Whether to scale throttle by battery power level + This compensates for voltage drop of the battery over time by attempting to normalize performance across the operating range of the battery. The fixed wing should constantly behave as if it was fully charged with reduced max thrust at lower battery percentages. i.e. if cruise speed is at 0.5 throttle at 100% battery, it will still be 0.5 at 60% battery. + + + Pitch trim increment for flaps configuration + This increment is added to the pitch trim whenever flaps are fully deployed. + -0.25 + 0.25 + 2 + 0.01 Pitch trim increment at maximum airspeed This increment is added to TRIM_PITCH when airspeed is FW_AIRSPD_MAX. - -0.5 - 0.5 + -0.25 + 0.25 2 0.01 Pitch trim increment at minimum airspeed This increment is added to TRIM_PITCH when airspeed is FW_AIRSPD_MIN. - -0.5 - 0.5 + -0.25 + 0.25 + 2 + 0.01 + + + Roll trim increment for flaps configuration + This increment is added to TRIM_ROLL whenever flaps are fully deployed. + -0.25 + 0.25 2 0.01 Roll trim increment at maximum airspeed This increment is added to TRIM_ROLL when airspeed is FW_AIRSPD_MAX. - -0.5 - 0.5 + -0.25 + 0.25 2 0.01 Roll trim increment at minimum airspeed This increment is added to TRIM_ROLL when airspeed is FW_AIRSPD_MIN. - -0.5 - 0.5 + -0.25 + 0.25 2 0.01 Yaw trim increment at maximum airspeed This increment is added to TRIM_YAW when airspeed is FW_AIRSPD_MAX. - -0.5 - 0.5 + -0.25 + 0.25 2 0.01 Yaw trim increment at minimum airspeed This increment is added to TRIM_YAW when airspeed is FW_AIRSPD_MIN. - -0.5 - 0.5 + -0.25 + 0.25 + 2 + 0.01 + + + Scale factor for flaperons + 0.0 + 1.0 + norm 2 0.01 Flaps setting during landing - Sets a fraction of full flaps during landing. Also applies to flaperons if enabled in the mixer/allocation. + Sets a fraction of full flaps (FW_FLAPS_SCL) during landing + 0.0 + 1.0 + norm + 2 + 0.01 + + + Scale factor for flaps 0.0 1.0 norm @@ -3051,13 +2482,22 @@ Flaps setting during take-off - Sets a fraction of full flaps during take-off. Also applies to flaperons if enabled in the mixer/allocation. + Sets a fraction of full flaps (FW_FLAPS_SCL) during take-off 0.0 1.0 norm 2 0.01 + + Max manual pitch + Max pitch for manual control in attitude stabilized mode + 0.0 + 90.0 + deg + 1 + 0.5 + Manual pitch scale Scale factor applied to the desired pitch actuator command in full manual mode. This parameter allows to adjust the throws of the control surfaces. @@ -3066,6 +2506,15 @@ 2 0.01 + + Max manual roll + Max roll for manual control in attitude stabilized mode + 0.0 + 90.0 + deg + 1 + 0.5 + Manual roll scale Scale factor applied to the desired roll actuator command in full manual mode. This parameter allows to adjust the throws of the control surfaces. @@ -3083,15 +2532,6 @@ 2 0.01 - - Pitch rate derivative gain - Pitch rate differential gain. - 0.0 - 10 - %/rad/s - 3 - 0.005 - Pitch rate feed forward Direct feed forward from rate setpoint to control surface output @@ -3103,14 +2543,16 @@ Pitch rate integrator gain - 0.0 - 10 + This gain defines how much control response will result out of a steady state error. It trims any constant error. + 0.005 + 0.5 %/rad 3 0.005 Pitch rate integrator limit + The portion of the integrator part in the control surface deflection is limited to this value 0.0 1.0 2 @@ -3118,30 +2560,59 @@ Pitch rate proportional gain - 0.0 - 10 + This defines how much the elevator input will be commanded depending on the current body angular rate error. + 0.005 + 1.0 %/rad/s 3 0.005 + + Pitch setpoint offset (pitch at level flight) + An airframe specific offset of the pitch setpoint in degrees, the value is added to the pitch setpoint and should correspond to the pitch at typical cruise speed of the airframe. + -90.0 + 90.0 + deg + 1 + 0.5 + + + Maximum negative / down pitch rate + This limits the maximum pitch down up angular rate the controller will output (in degrees per second). + 0.0 + 90.0 + deg/s + 1 + 0.5 + + + Maximum positive / up pitch rate + This limits the maximum pitch up angular rate the controller will output (in degrees per second). + 0.0 + 90.0 + deg/s + 1 + 0.5 + + + Attitude pitch time constant + This defines the latency between a pitch step input and the achieved setpoint (inverse to a P gain). Half a second is a good start value and fits for most average systems. Smaller systems may require smaller values, but as this will wear out servos faster, the value should only be decreased as needed. + 0.2 + 1.0 + s + 2 + 0.05 + Roll control to yaw control feedforward gain - This gain can be used to counteract the "adverse yaw" effect for fixed wings. When the plane enters a roll it will tend to yaw the nose out of the turn. This gain enables the use of a yaw actuator to counteract this effect. + This gain can be used to counteract the "adverse yaw" effect for fixed wings. When the plane enters a roll it will tend to yaw the nose out of the turn. This gain enables the use of a yaw actuator (rudder, airbrakes, ...) to counteract this effect. 0.0 1 0.01 - - Roll rate derivative gain - 0.0 - 10 - %/rad/s - 3 - 0.005 - Roll rate feed forward - Direct feed forward from rate setpoint to control surface output. + Direct feed forward from rate setpoint to control surface output. Use this to obtain a tigher response of the controller without introducing noise amplification. 0.0 10.0 %/rad/s @@ -3149,45 +2620,96 @@ 0.05 - Roll rate integrator gain - 0.0 - 10 + Roll rate integrator Gain + This gain defines how much control response will result out of a steady state error. It trims any constant error. + 0.005 + 0.2 %/rad - 2 - 0.01 + 3 + 0.005 - Roll integrator limit + Roll integrator anti-windup + The portion of the integrator part in the control surface deflection is limited to this value. 0.0 1.0 2 0.05 - Roll rate proportional gain - 0.0 - 10 + Roll rate proportional Gain + This defines how much the aileron input will be commanded depending on the current body angular rate error. + 0.005 + 1.0 %/rad/s 3 0.005 - - Spoiler input in manual flight - Chose source for manual setting of spoilers in manual flight modes. - - Disabled - Flaps channel - Aux1 - - - - Yaw rate derivative gain + + Maximum roll rate + This limits the maximum roll rate the controller will output (in degrees per second). 0.0 - 10 + 90.0 + deg/s + 1 + 0.5 + + + Attitude Roll Time Constant + This defines the latency between a roll step input and the achieved setpoint (inverse to a P gain). Half a second is a good start value and fits for most average systems. Smaller systems may require smaller values, but as this will wear out servos faster, the value should only be decreased as needed. + 0.4 + 1.0 + s + 2 + 0.05 + + + Wheel steering rate feed forward + Direct feed forward from rate setpoint to control surface output + 0.0 + 10.0 + %/rad/s + 2 + 0.05 + + + Wheel steering rate integrator gain + This gain defines how much control response will result out of a steady state error. It trims any constant error. + 0.005 + 0.5 + %/rad + 3 + 0.005 + + + Wheel steering rate integrator limit + The portion of the integrator part in the control surface deflection is limited to this value + 0.0 + 1.0 + 2 + 0.05 + + + Wheel steering rate proportional gain + This defines how much the wheel steering input will be commanded depending on the current body angular rate error. + 0.005 + 1.0 %/rad/s 3 0.005 + + Enable wheel steering controller + + + Maximum wheel steering rate + This limits the maximum wheel steering rate the controller will output (in degrees per second). + 0.0 + 90.0 + deg/s + 1 + 0.5 + Yaw rate feed forward Direct feed forward from rate setpoint to control surface output @@ -3199,14 +2721,16 @@ Yaw rate integrator gain + This gain defines how much control response will result out of a steady state error. It trims any constant error. 0.0 - 10 + 50.0 %/rad 1 0.5 Yaw rate integrator limit + The portion of the integrator part in the control surface deflection is limited to this value 0.0 1.0 2 @@ -3214,53 +2738,217 @@ Yaw rate proportional gain - 0.0 - 10 + This defines how much the rudder input will be commanded depending on the current body angular rate error. + 0.005 + 1.0 %/rad/s 3 0.005 - - - - Minimum groundspeed - The controller will increase the commanded airspeed to maintain this minimum groundspeed to the next waypoint. + + Maximum yaw rate + This limits the maximum yaw rate the controller will output (in degrees per second). 0.0 - 40 - m/s + 90.0 + deg/s 1 0.5 - - Maximum pitch angle - The maximum pitch angle setpoint setpoint for a height-rate or altitude controlled mode. + + + + Climbout Altitude difference + If the altitude error exceeds this parameter, the system will climb out with maximum throttle and minimum airspeed until it is closer than this distance to the desired altitude. Mostly used for takeoff waypoints / modes. Set to 0 to disable climbout mode (not recommended). + 0.0 + 150.0 + m + 1 + 0.5 + + + L1 damping + Damping factor for L1 control. + 0.6 + 0.9 + 2 + 0.05 + + + L1 period + Used to determine the L1 gain and controller time constant. This parameter is proportional to the L1 distance (which points ahead of the aircraft on the path it is following). A value of 18-25 seconds works for most aircraft. Shorten slowly during tuning until response is sharp without oscillation. + 7.0 + 50.0 + s + 1 + 0.5 + + + L1 controller roll slew rate limit + The maxium change in roll angle setpoint per second. + 0 + deg/s + 1 + + + Min. airspeed scaling factor for landing + Multiplying this factor with the minimum airspeed of the plane gives the target airspeed the landing approach. FW_AIRSPD_MIN * FW_LND_AIRSPD_SC + 1.0 + 1.5 + norm + 2 + 0.01 + + + Landing slope angle + 1.0 + 15.0 + deg + 1 + 0.5 + + + Early landing configuration deployment + When disabled, the landing configuration (flaps, landing airspeed, etc.) is only activated on the final approach to landing. When enabled, it is already activated when entering the final loiter-down (loiter-to-alt) waypoint before the landing approach. This shifts the (often large) altitude and airspeed errors caused by the configuration change away from the ground such that these are not so critical. It also gives the controller enough time to adapt to the new configuration such that the landing approach starts with a cleaner initial state. + + + Landing flare altitude (relative to landing altitude) + 0.0 + 25.0 + m + 1 + 0.5 + + + Flare, maximum pitch + Maximum pitch during flare, a positive sign means nose up Applied once FW_LND_FLALT is reached + 0 + 45.0 + deg + 1 + 0.5 + + + Flare, minimum pitch + Minimum pitch during flare, a positive sign means nose up Applied once FW_LND_FLALT is reached + 0 + 15.0 + deg + 1 + 0.5 + + + Landing heading hold horizontal distance + Set to 0 to disable heading hold. + 0 + 30.0 + m + 1 + 0.5 + + + FW_LND_HVIRT + 1.0 + 15.0 + m + 1 + 0.5 + + + Altitude time constant factor for landing + Set this parameter to less than 1.0 to make TECS react faster to altitude errors during landing than during normal flight (i.e. giving efficiency and low motor wear at high altitudes but control accuracy during landing). During landing, the TECS altitude time constant (FW_T_ALT_TC) is multiplied by this value. + 0.2 + 1.0 + + 0.1 + + + Landing throttle limit altitude (relative landing altitude) + Default of -1.0 lets the system default to applying throttle limiting at 2/3 of the flare altitude. + -1.0 + 30.0 + m + 1 + 0.5 + + + Use terrain estimate during landing + This is turned off by default and a waypoint or return altitude is normally used (or sea level for an arbitrary land position). + + + RC stick mapping fixed-wing + Set RC/joystick configuration for fixed-wing position and altitude controlled flight. + 0 + 1 + + Normal stick configuration (airspeed on throttle stick, altitude on pitch stick) + Alternative stick configuration (altitude on throttle stick, airspeed on pitch stick) + + + + Positive pitch limit + The maximum positive pitch the controller will output. 0.0 60.0 deg 1 0.5 - - Minimum pitch angle - The minimum pitch angle setpoint for a height-rate or altitude controlled mode. + + Negative pitch limit + The minimum negative pitch the controller will output. -60.0 0.0 deg 1 0.5 - + + Controller roll limit + The maximum roll the controller will output. + 35.0 + 65.0 + deg + 1 + 0.5 + + + Scale throttle by pressure change + Automatically adjust throttle to account for decreased air density at higher altitudes. Start with a scale factor of 1.0 and adjust for different propulsion systems. When flying without airspeed sensor this will help to keep a constant performance over large altitude ranges. The default value of 0 will disable scaling. + 0.0 + 10.0 + 1 + 0.1 + + + Cruise throttle + This is the throttle setting required to achieve the desired cruise speed. Most airframes have a value of 0.5-0.7. + 0.0 + 1.0 + norm + 2 + 0.01 + + Idle throttle - This is the minimum throttle while on the ground For aircraft with internal combustion engines, this parameter should be set above the desired idle rpm. For electric motors, idle should typically be set to zero. Note that in automatic modes, "landed" conditions will engage idle throttle. + This is the minimum throttle while on the ground For aircraft with internal combustion engine this parameter should be set above desired idle rpm. 0.0 0.4 norm 2 0.01 + + Throttle limit during landing below throttle limit altitude + During the flare of the autonomous landing process, this value will be set as throttle limit when the aircraft altitude is below FW_LND_TLALT. + 0.0 + 1.0 + norm + 2 + 0.01 + Throttle limit max - Maximum throttle limit in altitude controlled modes. Should be set accordingly to achieve FW_T_CLMB_MAX. + This is the maximum throttle % that can be used by the controller. For overpowered aircraft, this should be reduced to a value that provides sufficient thrust to climb at the maximum pitch angle PTCH_MAX. 0.0 1.0 norm @@ -3269,7 +2957,7 @@ Throttle limit min - Minimum throttle limit in altitude controlled modes. Usually set to 0 but can be increased to prevent the motor from stopping when descending, which can increase achievable descent rates. For aircraft with internal combustion engine this parameter should be set for desired idle rpm. + This is the minimum throttle % that can be used by the controller. For electric aircraft this will normally be set to zero, but can be set to a small non-zero value if a folding prop is fitted to prevent the prop from folding and unfolding repeatedly in-flight or to provide some aerodynamic drag from a turning prop to improve the descent rate. For aircraft with internal combustion engine this parameter should be set for desired idle rpm. 0.0 1.0 norm @@ -3281,16 +2969,101 @@ Maximum slew rate for the commanded throttle 0.0 1.0 - 2 - 0.01 - - Takeoff Airspeed - The calibrated airspeed setpoint TECS will stabilize to during the takeoff climbout. If set <= 0.0, FW_AIRSPD_MIN will be set by default. - -1.0 + + Minimum pitch during takeoff + -5.0 + 30.0 + deg + 1 + 0.5 + + + + + Launch detection + + + Catapult accelerometer threshold + LAUN_CAT_A for LAUN_CAT_T serves as threshold to trigger launch detection. + 0 + m/s^2 + 1 + 0.5 + + + Motor delay + Delay between starting attitude control and powering up the throttle (giving throttle control to the controller) Before this timespan is up the throttle will be set to FW_THR_IDLE, set to 0 to deactivate + 0.0 + 10.0 + s + 1 + 0.5 + + + Maximum pitch before the throttle is powered up (during motor delay phase) + This is an extra limit for the maximum pitch which is imposed in the phase before the throttle turns on. This allows to limit the maximum pitch angle during a bungee launch (make the launch less steep). + 0.0 + 45.0 + deg + 1 + 0.5 + + + Catapult time threshold + LAUN_CAT_A for LAUN_CAT_T serves as threshold to trigger launch detection. + 0.0 + 5.0 + s + 2 + 0.05 + + + + + Maximum Airspeed (CAS) + If the CAS (calibrated airspeed) is above this value, the TECS controller will try to decrease airspeed more aggressively. + 0.5 + 40 m/s 1 - 0.1 + 0.5 + + + Minimum Airspeed (CAS) + The minimal airspeed (calibrated airspeed) the user is able to command. Further, if the airspeed falls below this value, the TECS controller will try to increase airspeed more aggressively. + 0.5 + 40 + m/s + 1 + 0.5 + + + Stall Airspeed (CAS) + The stall airspeed (calibrated airspeed) of the vehicle. It is used for airspeed sensor failure detection and for the control surface scaling airspeed limits. + 0.5 + 40 + m/s + 1 + 0.5 + + + Cruise Airspeed (CAS) + The trim CAS (calibrated airspeed) of the vehicle. If an airspeed controller is active, this is the default airspeed setpoint that the controller will try to achieve if no other airspeed setpoint sources are present (e.g. through non-centered RC sticks). + 0.5 + 40 + m/s + 1 + 0.5 + + + Minimum groundspeed + The controller will increase the commanded airspeed to maintain this minimum groundspeed to the next waypoint. + 0.0 + 40 + m/s + 1 + 0.5 Altitude error time constant @@ -3298,6 +3071,15 @@ 2 0.5 + + Maximum climb rate + This is the best climb rate that the aircraft can achieve with the throttle set to THR_MAX and the airspeed set to the default value. For electric aircraft make sure this number can be achieved towards the end of flight when the battery voltage has reduced. The setting of this parameter can be checked by commanding a positive altitude change of 100m in loiter, RTL or guided mode. If the throttle required to climb is close to THR_MAX and the aircraft is maintaining airspeed, then this parameter is set correctly. If the airspeed starts to reduce, then the parameter is set to high, and if the throttle demand required to climb and maintain speed is noticeably less than FW_THR_MAX, then either FW_T_CLMB_MAX should be increased or FW_THR_MAX reduced. + 1.0 + 15.0 + m/s + 1 + 0.5 + Default target climbrate The default rate at which the vehicle will climb in autonomous modes to achieve altitude setpoints. In manual modes this defines the maximum rate at which the altitude setpoint can be increased. @@ -3322,7 +3104,7 @@ 2 0.05 - + Integrator gain throttle This is the integrator gain on the throttle part of the control loop. Increasing this gain increases the speed at which speed and height offsets are trimmed out, but reduces damping and increases overshoot. Set this value to zero to completely disable all integrator action. 0.0 @@ -3362,6 +3144,15 @@ 1 0.5 + + Minimum descent rate + This is the sink rate of the aircraft with the throttle set to THR_MIN and flown at the same airspeed as used to measure FW_T_CLMB_MAX. + 1.0 + 5.0 + m/s + 1 + 0.5 + Default target sinkrate The default rate at which the vehicle will sink in autonomous modes to achieve altitude setpoints. In manual modes this defines the maximum rate at which the altitude setpoint can be decreased. @@ -3373,38 +3164,20 @@ Speed <--> Altitude priority - This parameter adjusts the amount of weighting that the pitch control applies to speed vs height errors. Setting it to 0.0 will cause the pitch control to control height and ignore speed errors. This will normally improve height accuracy but give larger airspeed errors. Setting it to 2.0 will cause the pitch control loop to control speed and ignore height errors. This will normally reduce airspeed errors, but give larger height errors. The default value of 1.0 allows the pitch control to simultaneously control height and speed. Set to 2 for gliders. + This parameter adjusts the amount of weighting that the pitch control applies to speed vs height errors. Setting it to 0.0 will cause the pitch control to control height and ignore speed errors. This will normally improve height accuracy but give larger airspeed errors. Setting it to 2.0 will cause the pitch control loop to control speed and ignore height errors. This will normally reduce airspeed errors, but give larger height errors. The default value of 1.0 allows the pitch control to simultaneously control height and speed. Note to Glider Pilots - set this parameter to 2.0 (The glider will adjust its pitch angle to maintain airspeed, ignoring changes in height). 0.0 2.0 1 1.0 - - Airspeed rate measurement standard deviation for airspeed filter - This is the measurement standard deviation for the airspeed rate used in the airspeed filter in TECS. - 0.01 + + Complementary filter "omega" parameter for speed + This is the cross-over frequency (in radians/second) of the complementary filter used to fuse longitudinal acceleration and airspeed to obtain an improved airspeed estimate. Increasing this frequency weights the solution more towards use of the airspeed sensor, whilst reducing it weights the solution more towards use of the accelerometer data. + 1.0 10.0 - m/s^2 - 2 - 0.1 - - - Process noise standard deviation for the airspeed rate in the airspeed filter - This is the process noise standard deviation in the airspeed filter filter defining the noise in the airspeed rate for the constant airspeed rate model. This is used to define how much the airspeed and the airspeed rate are filtered. The smaller the value the more the measurements are smoothed with the drawback for delays. - 0.01 - 10.0 - m/s^2 - 2 - 0.1 - - - Airspeed measurement standard deviation for airspeed filter - This is the measurement standard deviation for the airspeed used in the airspeed filter in TECS. - 0.01 - 10.0 - m/s - 2 - 0.1 + rad/s + 1 + 0.5 Specific total energy rate first order filter time constant @@ -3414,6 +3187,14 @@ 2 0.01 + + True airspeed rate first order filter time constant + This filter is applied to the true airspeed rate. + 0.0 + 2 + 2 + 0.01 + True airspeed error time constant 2.0 @@ -3437,46 +3218,8 @@ 1 0.5 - - Wind-based airspeed scaling factor - Multiplying this factor with the current absolute wind estimate gives the airspeed offset added to the minimum airspeed setpoint limit. This helps to make the system more robust against disturbances (turbulence) in high wind. Only applies to AUTO flight mode. - 0 - 2 - 0.01 - - - Enable Actuator Failure check - If enabled, failure detector will verify that for motors, a minimum amount of ESC current per throttle level is being consumed. Otherwise this indicates an motor failure. - true - - - Motor Failure Current/Throttle Threshold - Motor failure triggers only below this current value - 0.0 - 50.0 - A/% - 2 - 1 - - - Motor Failure Throttle Threshold - Motor failure triggers only above this throttle value. - 0.0 - 1.0 - norm - 2 - 0.01 - - - Motor Failure Time Threshold - Motor failure triggers only if the throttle threshold and the current to throttle threshold are violated for this time. - 10 - 10000 - ms - 100 - Enable checks on ESCs that report their arming state If enabled, failure detector will verify that all the ESCs have successfully armed when the vehicle has transitioned to the armed state. Timeout for receiving an acknowledgement from the ESCs is 0.3s, if no feedback is received the failure detector will auto disarm the vehicle. @@ -3495,7 +3238,7 @@ FailureDetector Max Pitch Maximum pitch angle before FailureDetector triggers the attitude_failure flag. The flag triggers flight termination (if @CBRK_FLIGHTTERM = 0), which sets outputs to their failsafe values. On takeoff the flag triggers lockdown (irrespective of @CBRK_FLIGHTTERM), which disarms motors but does not set outputs to failsafe values. Setting this parameter to 0 disables the check - 0 + 60 180 deg @@ -3510,7 +3253,7 @@ FailureDetector Max Roll Maximum roll angle before FailureDetector triggers the attitude_failure flag. The flag triggers flight termination (if @CBRK_FLIGHTTERM = 0), which sets outputs to their failsafe values. On takeoff the flag triggers lockdown (irrespective of @CBRK_FLIGHTTERM), which disarms motors but does not set outputs to failsafe values. Setting this parameter to 0 disables the check - 0 + 60 180 deg @@ -3530,58 +3273,32 @@ 1 - - - Maximum radius of orbit - 1.0 - 10000.0 - m - 1 - 0.5 - - - - Altitude control mode - Maintain altitude or track target's altitude. When maintaining the altitude, the drone can crash into terrain when the target moves uphill. When tracking the target's altitude, the follow altitude FLW_TGT_HT should be high enough to prevent terrain collisions due to GPS inaccuracies of the target. - - 2D Tracking: Maintain constant altitude relative to home and track XY position only - 2D + Terrain: Maintain constant altitude relative to terrain below and track XY position - 3D Tracking: Track target's altitude (be aware that GPS altitude bias usually makes this useless) - - - + Distance to follow target from The distance in meters to follow the target at 1.0 m - - Follow Angle setting in degrees - Angle to follow the target from. 0.0 Equals straight in front of the target's course (direction of motion) and the angle increases in clockwise direction, meaning Right-side would be 90.0 degrees while Left-side is -90.0 degrees Note: When the user force sets the angle out of the min/max range, it will be wrapped (e.g. 480 -> 120) in the range to gracefully handle the out of range. - -180.0 - 180.0 + + Side to follow target from + The side to follow the target from (front right = 0, behind = 1, front = 2, front left = 3) + 0 + 3 - - Follow target height - Following height above the target - 8.0 - m - - - Maximum tangential velocity setting for generating the follow orbit trajectory - This is the maximum tangential velocity the drone will circle around the target whenever an orbit angle setpoint changes. Higher value means more aggressive follow behavior. - 0.0 - 20.0 - 1 - - - Responsiveness to target movement in Target Estimator - lower values increase the responsiveness to changing position, but also ignore less noise + + Dynamic filtering algorithm responsiveness to target movement + lower numbers increase the responsiveness to changing long lat but also ignore less noise 0.0 1.0 2 + + Minimum follow target altitude + The minimum height in meters relative to home for following a target + 8.0 + m + @@ -3602,7 +3319,7 @@ Protocol for Main GPS Select the GPS protocol over serial. Auto-detection will probe all protocols, and thus is a bit slower. 0 - 7 + 5 true Auto detect @@ -3612,7 +3329,6 @@ Emlid Reach Femtomes NMEA (generic) - Septentrio (SBF) @@ -3633,7 +3349,7 @@ Protocol for Secondary GPS Select the GPS protocol over serial. Auto-detection will probe all protocols, and thus is a bit slower. 0 - 6 + 5 true Auto detect @@ -3656,41 +3372,6 @@ RTCM output (PPK) - - Pitch offset for dual antenna GPS - Vertical offsets can be compensated for by adjusting the Pitch offset (Septentrio). Note that this can be interpreted as the "roll" angle in case the antennas are aligned along the perpendicular axis. This occurs in situations where the two antenna ARPs may not be exactly at the same height in the vehicle reference frame. Since pitch is defined as the right-handed rotation about the vehicle Y axis, a situation where the main antenna is mounted lower than the aux antenna (assuming the default antenna setup) will result in a positive pitch. - -90 - 90 - deg - 3 - true - - - Enable sat info (if available) - Enable publication of satellite info (ORB_ID(satellite_info)) if possible. Not available on MTK. - true - - - u-blox F9P UART2 Baudrate - Select a baudrate for the F9P's UART2 port. In GPS_UBX_MODE 1, 2, and 3, the F9P's UART2 port is configured to send/receive RTCM corrections. Set this to 57600 if you want to attach a telemetry radio on UART2. - 0 - B/s - true - - - u-blox protocol configuration for interfaces - 0 - 32 - true - - Enable I2C input protocol UBX - Enable I2C input protocol NMEA - Enable I2C input protocol RTCM3X - Enable I2C output protocol UBX - Enable I2C output protocol NMEA - Enable I2C output protocol RTCM3X - - u-blox GPS dynamic platform model u-blox receivers support different dynamic platform models to adjust the navigation engine to the expected application environment. @@ -3707,7 +3388,7 @@ u-blox GPS Mode - Select the u-blox configuration setup. Most setups will use the default, including RTK and dual GPS without heading. If rover has RTCM corrections from a static base (or other static correction source) coming in on UART2, then select Mode 5. The Heading mode requires 2 F9P devices to be attached. The main GPS will act as rover and output heading information, whereas the secondary will act as moving base. Modes 1 and 2 require each F9P UART1 to be connected to the Autopilot. In addition, UART2 on the F9P units are connected to each other. Modes 3 and 4 only require UART1 on each F9P connected to the Autopilot or Can Node. UART RX DMA is required. RTK is still possible with this setup. + Select the u-blox configuration setup. Most setups will use the default, including RTK and dual GPS without heading. The Heading mode requires 2 F9P devices to be attached. The main GPS will act as rover and output heading information, whereas the secondary will act as moving base. Modes 1 and 2 require each F9P UART1 to be connected to the Autopilot. In addition, UART2 on the F9P units are connected to each other. Modes 3 and 4 only require UART1 on each F9P connected to the Autopilot or Can Node. UART RX DMA is required. RTK is still possible with this setup. 0 1 true @@ -3717,16 +3398,15 @@ Moving Base (UART1 Connected To Autopilot, UART2 Connected To Rover) Heading (Rover With Moving Base UART1 Connected to Autopilot Or Can Node At 921600) Moving Base (Moving Base UART1 Connected to Autopilot Or Can Node At 921600) - Rover with Static Base on UART2 (similar to Default, except coming in on UART2) Heading/Yaw offset for dual antenna GPS - Heading offset angle for dual antenna GPS setups that support heading estimation. Set this to 0 if the antennas are parallel to the forward-facing direction of the vehicle and the rover (or Unicore primary) antenna is in front. The offset angle increases clockwise. Set this to 90 if the rover (or Unicore primary) antenna is placed on the right side of the vehicle and the moving base antenna is on the left side. (Note: the Unicore primary antenna is the one connected on the right as seen from the top). + Heading offset angle for dual antenna GPS setups that support heading estimation. Set this to 0 if the antennas are parallel to the forward-facing direction of the vehicle and the first antenna is in front. The offset angle increases clockwise. Set this to 90 if the first antenna is placed on the right side and the second on the left side of the vehicle. 0 360 deg - 3 + 0 true @@ -3738,7 +3418,7 @@ Geofence violation action - Note: Setting this value to 4 enables flight termination, which will kill the vehicle on violation of the fence. + Note: Setting this value to 4 enables flight termination, which will kill the vehicle on violation of the fence. Due to the inherent danger of this, this function is disabled using a software circuit breaker, which needs to be reset to 0 to really shut down the system. 0 5 @@ -3750,26 +3430,39 @@ Land mode - - Max horizontal distance from Home - Maximum horizontal distance in meters the vehicle can be from Home before triggering a geofence action. Disabled if 0. + + Geofence altitude mode + Select which altitude (AMSL) source should be used for geofence calculations. + 0 + 1 + + Autopilot estimator global position altitude (GPS) + Raw barometer altitude (assuming standard atmospheric pressure) + + + + Geofence counter limit + Set how many subsequent position measurements outside of the fence are needed before geofence violation is triggered + -1 + 10 + 1 + + + Max horizontal distance in meters + Maximum horizontal distance in meters the vehicle can be from home before triggering a geofence action. Disabled if 0. 0 10000 m 1 - - Max vertical distance from Home - Maximum vertical distance in meters the vehicle can be from Home before triggering a geofence action. Disabled if 0. + + Max vertical distance in meters + Maximum vertical distance in meters the vehicle can be from home before triggering a geofence action. Disabled if 0. 0 10000 m 1 - - [EXPERIMENTAL] Use Pre-emptive geofence triggering - WARNING: This experimental feature may cause flyaways. Use at your own risk. Predict the motion of the vehicle and trigger the breach if it is determined that the current trajectory would result in a breach happening before the vehicle can make evasive maneuvers. The vehicle is then re-routed to a safe hold position (stop for multirotor, loiter for fixed wing). - Geofence source Select which position source should be used. Selecting GPS instead of global position makes sure that there is no dependence on the position estimator 0 = global position, 1 = GPS @@ -3806,14 +3499,6 @@ normalized_thrust/s 4 - - Max deviation from MPC_THR_HOVER - Defines the range of the hover thrust estimate around MPC_THR_HOVER. A value of 0.2 with MPC_THR_HOVER at 0.5 results in a range of [0.3, 0.7]. Set to a large value if the vehicle operates in varying physical conditions that affect the required hover thrust strongly (e.g. differently sized payloads). - 0.01 - 0.4 - normalized_thrust - 2 - Horizontal velocity threshold for sensitivity reduction Above this speed, the measurement noise is linearly increased to reduce the sensitivity of the estimator from biased measurement. Set to a low value on vehicles with large lifting surfaces. @@ -3861,14 +3546,6 @@ m/s 1 - - Fixed-wing land detection trigger time - Time the land conditions (speeds and acceleration) have to be satisfied to detect a landing. - 0.1 - s - 1 - true - Fixed-wing land detector: Max horizontal velocity threshold Maximum horizontal velocity allowed in the landed state. A factor of 0.7 is applied in case of airspeed-less flying (either because no sensor is present or sensor data got invalid in flight). @@ -3877,9 +3554,9 @@ m/s 1 - + Fixed-wing land detector: Max vertiacal velocity threshold - Maximum vertical velocity allowed in the landed state. + Maximum vertical velocity allowed in the landed state. A factor of 0.7 is applied in case of airspeed-less flying (either because no sensor is present or sensor data got invalid in flight). 0.1 20 m/s @@ -3893,13 +3570,21 @@ m/s^2 1 - + Ground effect altitude for multicopters The height above ground below which ground effect creates barometric altitude errors. A negative value indicates no ground effect. -1 m 2 + + Maximum altitude for multicopters + The system will obey this limit as a hard altitude limit. This setting will be consolidated with the GF_MAX_VER_DIST parameter. A negative value indicates no altitude limitation. + -1 + 10000 + m + 2 + Multicopter max rotation Maximum allowed angular velocity around each axis allowed in the landed state. @@ -3920,12 +3605,11 @@ m/s 1 - - Multicopter vertical velocity threshold - Vertical velocity threshold to detect landing. Has to be set lower than the expected minimal speed for landing, which is either MPC_LAND_SPEED or MPC_LAND_CRWL. This is enforced by an automatic check. - 0 + + Multicopter max climb rate + Maximum vertical velocity allowed in the landed state m/s - 2 + 1 Total flight time in microseconds @@ -3938,7 +3622,7 @@ 0 - + Acceleration uncertainty Variance of acceleration measurement used for landing target position prediction. Higher values results in tighter following of the measurements and more lenient outlier rejection @@ -3981,41 +3665,6 @@ 0.01 3 - - X Position of IRLOCK in body frame (forward) - m - 3 - true - - - Y Position of IRLOCK in body frame (right) - m - 3 - true - - - Z Position of IRLOCK in body frame (downward) - m - 3 - true - - - Rotation of IRLOCK sensor relative to airframe - Default orientation of Yaw 90° - -1 - 40 - true - - No rotation - Yaw 45° - Yaw 90° - Yaw 135° - Yaw 180° - Yaw 225° - Yaw 270° - Yaw 315° - - Initial landing target velocity uncertainty Initial variance of the relative landing target velocity in x and y directions @@ -4086,6 +3735,7 @@ Optical flow minimum quality threshold 0 255 + 0 Optical flow rotation (roll/pitch) noise gain @@ -4331,6 +3981,10 @@ Heartbeat message forwarding The mavlink heartbeat message will not be forwarded if this parameter is set to 'disabled'. The main reason for disabling heartbeats to be forwarded is because they confuse dronekit. + + Activate ODOMETRY loopback + If set, it gets the data from 'vehicle_visual_odometry' instead of 'vehicle_odometry' serving as a loopback of the received ODOMETRY messages on the Mavlink receiver. + MAVLink protocol version @@ -4358,29 +4012,39 @@ 250 true - + MAVLink airframe type - 0 - 22 + 1 + 27 Generic micro air vehicle Fixed wing aircraft Quadrotor Coaxial helicopter Normal helicopter with tail rotor + Ground installation + Operator control unit / ground control station Airship, controlled Free balloon, uncontrolled + Rocket Ground rover Surface vessel, boat, ship Submarine Hexarotor Octorotor Tricopter - VTOL Two-rotor Tailsitter - VTOL Quad-rotor Tailsitter - VTOL Tiltrotor - VTOL Standard (separate fixed rotors for hover and cruise flight) - VTOL Tailsitter + Flapping wing + Kite + Onboard companion controller + Two-rotor VTOL using control surfaces in vertical operation in addition. Tailsitter. + Quad-rotor VTOL using a V-shaped quad config in vertical operation. Tailsitter. + Tiltrotor VTOL + VTOL reserved 2 + VTOL reserved 3 + VTOL reserved 4 + VTOL reserved 5 + Onboard gimbal + Onboard ADSB peripheral @@ -4388,120 +4052,6 @@ If set to 1 incoming HIL GPS messages are parsed. - - - UART ESC baud rate - Default rate is 250Kbps, which is used in off-the-shelf MoadalAI ESC products. - bit/s - - - UART ESC configuration - Selects what type of UART ESC, if any, is being used. - 0 - 1 - true - - - Disabled - - VOXL ESC - - - - UART ESC Mode - Selects what type of mode is enabled, if any - 0 - 2 - true - - - None - - Turtle Mode enabled via AUX1 - - Turtle Mode enabled via AUX2 - - UART Passthrough Mode - - - - UART ESC RPM Max - Maximum RPM for ESC - rpm - - - UART ESC RPM Min - Minimum RPM for ESC - rpm - - - UART ESC ID 1 Spin Direction Flag - - - Default - - Reverse - - - - UART ESC ID 2 Spin Direction Flag - - - Default - - Reverse - - - - UART ESC ID 3 Spin Direction Flag - - - Default - - Reverse - - - - UART ESC ID 4 Spin Direction Flag - - - Default - - Reverse - - - - UART ESC Turtle Mode Cosphi - 0.000 - 1.000 - 10 - 0.001 - - - UART ESC Turtle Mode Crash Flip Motor Deadband - 0 - 100 - 10 - 1 - - - UART ESC Turtle Mode Crash Flip Motor expo - 0 - 100 - 10 - 1 - - - UART ESC Turtle Mode Crash Flip Motor STICK_MINF - 0.0 - 100.0 - 10 - 1.0 - - - UART ESC Turtle Mode Crash Flip Motor Percent - 1 - 100 - 10 - 1 - - - UART ESC verbose logging - 0 - 1 - true - - - Disabled - - Enabled - - - Enable online mag bias calibration @@ -4521,14 +4071,7 @@ Enable arm/disarm stick gesture This determines if moving the left stick to the lower right arms and to the lower left disarms the vehicle. - - - Trigger time for kill stick gesture - The timeout for holding the left stick to the lower left and the right stick to the lower right at the same time until the gesture kills the actuators one-way. A negative value disables the feature. - -1 - 15 - s - 2 + true @@ -4541,7 +4084,7 @@ GPS failure fixed roll angle - Roll in degrees during the loiter after the vehicle has lost GPS in an auto mode (e.g. mission or loiter). + Roll in degrees during the loiter after the vehicle has lost GPS in an auto mode (e.g. mission or loiter). Does only apply for fixed-wing vehicles or VTOLs with NAV_FORCE_VT set to 0. 0.0 30.0 deg @@ -4549,19 +4092,31 @@ 0.5 - Maximal horizontal distance from current position to first waypoint - Failsafe check to prevent running mission stored from previous flight at a new takeoff location. Set a value of zero or less to disable. The mission will not be started if the current waypoint is more distant than MIS_DIST_1WP from the current position. - -1 + Maximal horizontal distance from home to first waypoint + Failsafe check to prevent running mission stored from previous flight at a new takeoff location. Set a value of zero or less to disable. The mission will not be started if the current waypoint is more distant than MIS_DIST_1WP from the home position. + 0 10000 m 1 100 - - Landing abort min altitude - Minimum altitude above landing point that the vehicle will climb to after an aborted landing. Then vehicle will loiter in this altitude until further command is received. Only applies to fixed-wing vehicles. + + Maximal horizontal distance between waypoint + Failsafe check to prevent running missions which are way too big. Set a value of zero or less to disable. The mission will not be started if any distance between two subsequent waypoints is greater than MIS_DIST_WPS. 0 + 10000 m + 1 + 100 + + + Minimum Loiter altitude + This is the minimum altitude the system will always obey. The intent is to stay out of ground effect. set to -1, if there shouldn't be a minimum loiter altitude + -1 + 80 + m + 1 + 0.5 Enable yaw control of the mount. (Only affects multicopters and ROI mission items) @@ -4573,31 +4128,18 @@ Enable - - Timeout for a successful payload deployment acknowledgement - 0 - s - 1 - 1 - - Default take-off altitude - This is the relative altitude the system will take off to if not otherwise specified. + Take-off altitude + This is the minimum altitude the system will take off to. 0 + 80 m 1 0.5 - - Mission takeoff/landing required - Specifies if a mission has to contain a takeoff and/or mission landing. Validity of configured takeoffs/landings is checked independently of the setting here. - - No requirements - Require a takeoff - Require a landing - Require a takeoff and a landing - Require both a takeoff and a landing, or neither - + + Take-off waypoint required + If set, the mission feasibility checker will check for a takeoff waypoint on the mission. Max yaw error in degrees needed for waypoint heading acceptance @@ -4617,7 +4159,8 @@ 1 - Heading behavior in autonomous modes + Yaw mode + Specifies the heading in Auto. 0 4 @@ -4630,7 +4173,7 @@ Acceptance Radius - Default acceptance radius, overridden by acceptance radius of waypoint if set. For fixed wing the npfg switch distance is used for horizontal acceptance. + Default acceptance radius, overridden by acceptance radius of waypoint if set. For fixed wing the L1 turning distance is used for horizontal acceptance. 0.05 200.0 m @@ -4657,9 +4200,9 @@ 1 0.5 - + Loiter radius (FW only) - Default value of loiter radius in FW mode (e.g. for Loiter mode). + Default value of loiter radius for missions, Hold mode, Return mode, etc. (fixedwing only). 25 1000 m @@ -4675,14 +4218,6 @@ 1 0.5 - - Minimum Loiter altitude - This is the minimum altitude above Home the system will always obey in Loiter (Hold) mode if switched into this mode without specifying an altitude (e.g. through Loiter switch on RC). Doesn't affect Loiters that are part of Missions or that are entered through a reposition setpoint ("Go to"). Set to a negative value to disable. - -1 - m - 1 - 0.5 - Set traffic avoidance mode Enabling this will allow the system to respond to transponder data from e.g. ADSB transponders @@ -4694,25 +4229,19 @@ Position Hold mode - - Set NAV TRAFFIC AVOID horizontal distance - Defines a crosstrack horizontal distance + + Set NAV TRAFFIC AVOID RADIUS MANNED + Defines the Radius where NAV TRAFFIC AVOID is Called For Manned Aviation 500 m - - Set NAV TRAFFIC AVOID vertical distance + + Set NAV TRAFFIC AVOID RADIUS + Defines the Radius where NAV TRAFFIC AVOID is Called For Unmanned Aviation 10 500 m - - Estimated time until collision - Minimum acceptable time until collsion. Assumes constant speed over 3d distance. - 1 - 900000000 - s - @@ -4724,6 +4253,14 @@ Roll/Pitch/Yaw + + Motor Ordering + Determines the motor ordering. This can be used for example in combination with a 4-in-1 ESC that assumes a motor ordering which is different from PX4. ONLY supported for Quads. When changing this, make sure to test the motor response without props first. + + PX4 + Betaflight / Cleanflight + + @@ -4737,20 +4274,6 @@ Stabilize yaw for absolute/lock mode. - - Pitch maximum when landed - -90.0 - 90.0 - deg - 1 - - - Pitch minimum when landed - -90.0 - 90.0 - deg - 1 - Auxiliary channel to control pitch (in AUX input or manual mode) 0 @@ -4803,71 +4326,78 @@ Mount input mode - This is the protocol used between the ground station and the autopilot. Recommended is Auto, RC only or MAVLink gimbal protocol v2. The rest will be deprecated. + RC uses the AUX input channels (see MNT_MAN_* parameters), MAVLINK_ROI uses the MAV_CMD_DO_SET_ROI Mavlink message, and MAVLINK_DO_MOUNT the MAV_CMD_DO_MOUNT_CONFIGURE and MAV_CMD_DO_MOUNT_CONTROL messages to control a mount. -1 4 true DISABLED - Auto (RC and MAVLink gimbal protocol v2) + AUTO RC - MAVLINK_ROI (protocol v1, to be deprecated) - MAVLINK_DO_MOUNT (protocol v1, to be deprecated) + MAVLINK_ROI (protocol v1) + MAVLINK_DO_MOUNT (protocol v1) MAVlink gimbal protocol v2 Mount output mode - This is the protocol used between the autopilot and a connected gimbal. Recommended is the MAVLink gimbal protocol v2 if the gimbal supports it. + AUX uses the mixer output Control Group #2. MAVLINK uses the MAV_CMD_DO_MOUNT_CONFIGURE and MAV_CMD_DO_MOUNT_CONTROL MavLink messages to control a mount (set MNT_MAV_SYSID & MNT_MAV_COMPID) 0 2 - true AUX MAVLink gimbal protocol v1 MAVLink gimbal protocol v2 + + Mixer value for selecting a locking mode + if required for the gimbal (only in AUX output mode) + -1.0 + 1.0 + 3 + + + Mixer value for selecting normal mode + if required by the gimbal (only in AUX output mode) + -1.0 + 1.0 + 3 + Offset for pitch channel output in degrees -360.0 360.0 - deg 1 Offset for roll channel output in degrees -360.0 360.0 - deg 1 Offset for yaw channel output in degrees -360.0 360.0 - deg 1 Range of pitch channel output in degrees (only in AUX output mode) 1.0 720.0 - deg 1 Range of roll channel output in degrees (only in AUX output mode) 1.0 720.0 - deg 1 Range of yaw channel output in degrees (only in AUX output mode) 1.0 720.0 - deg 1 @@ -4875,14 +4405,12 @@ Full stick input [-1..1] translats to [-pitch rate..pitch rate]. 1.0 90.0 - deg/s Angular yaw rate for manual input in degrees/second Full stick input [-1..1] translats to [-yaw rate..yaw rate]. 1.0 90.0 - deg/s Input mode for RC gimbal input @@ -4894,63 +4422,6 @@ - - - Acro mode roll, pitch expo factor - Exponential factor for tuning the input curve shape. 0 Purely linear input curve 1 Purely cubic input curve - 0 - 1 - 2 - - - Acro mode yaw expo factor - Exponential factor for tuning the input curve shape. 0 Purely linear input curve 1 Purely cubic input curve - 0 - 1 - 2 - - - Acro mode maximum pitch rate - Full stick deflection leads to this rate. - 0.0 - 1800.0 - deg/s - 1 - 5 - - - Acro mode maximum roll rate - Full stick deflection leads to this rate. - 0.0 - 1800.0 - deg/s - 1 - 5 - - - Acro mode roll, pitch super expo factor - "Superexponential" factor for refining the input curve shape tuned using MC_ACRO_EXPO. 0 Pure Expo function 0.7 reasonable shape enhancement for intuitive stick feel 0.95 very strong bent input curve only near maxima have effect - 0 - 0.95 - 2 - - - Acro mode yaw super expo factor - "Superexponential" factor for refining the input curve shape tuned using MC_ACRO_EXPO_Y. 0 Pure Expo function 0.7 reasonable shape enhancement for intuitive stick feel 0.95 very strong bent input curve only near maxima have effect - 0 - 0.95 - 2 - - - Acro mode maximum yaw rate - Full stick deflection leads to this rate. - 0.0 - 1800.0 - deg/s - 1 - 5 - - Max pitch rate @@ -5004,19 +4475,19 @@ Yaw weight - A fraction [0,1] deprioritizing yaw compared to roll and pitch in non-linear attitude control. Deprioritizing yaw is necessary because multicopters have much less control authority in yaw compared to the other axes and it makes sense because yaw is not critical for stable hovering or 3D navigation. For yaw control tuning use MC_YAW_P. This ratio has no impact on the yaw gain. + A fraction [0,1] deprioritizing yaw compared to roll and pitch in non-linear attitude control. Deprioritizing yaw is necessary because multicopters have much less control authority in yaw compared to the other axes and it makes sense because yaw is not critical for stable hovering or 3D navigation. For yaw control tuning use MC_YAW_P. This ratio has no inpact on the yaw gain. 0.0 1.0 2 0.1 - - Max yaw rate in autonomous modes - Limits the rate of change of the yaw setpoint to avoid large control output and mixer saturation. - 0 - 360 + + Max yaw rate in auto mode + Limit the rate of change of the yaw setpoint in autonomous mode to avoid large control output and mixer saturation. + 0.0 + 360.0 deg/s - 0 + 1 5 @@ -5054,42 +4525,42 @@ s 2 - - Maximum downwards acceleration in climb rate controlled modes - 2 - 15 - m/s^2 - 1 - 1 - - - Acceleration for autonomous and for manual modes - When piloting manually, this parameter is only used in MPC_POS_MODE 4. - 2 - 15 - m/s^2 - 1 - 1 - - - Maximum horizontal acceleration - MPC_POS_MODE 1 just deceleration 3 acceleration and deceleration 4 not used, use MPC_ACC_HOR instead - 2 - 15 + + Maximum vertical acceleration in velocity controlled modes down + 2.0 + 15.0 m/s^2 2 1 - - Maximum upwards acceleration in climb rate controlled modes - 2 - 15 + + Acceleration for auto and for manual + Note: In manual, this parameter is only used in MPC_POS_MODE 4. + 2.0 + 15.0 m/s^2 - 1 + 2 1 - - Altitude reference mode + + Maximum horizontal acceleration for auto mode and for manual mode + MPC_POS_MODE 1 just deceleration 3 acceleration and deceleration 4 just acceleration + 2.0 + 15.0 + m/s^2 + 2 + 1 + + + Maximum vertical acceleration in velocity controlled modes upward + 2.0 + 15.0 + m/s^2 + 2 + 1 + + + Altitude control mode Set to 0 to control height relative to the earth frame origin. This origin may move up and down in flight due to sensor drift. Set to 1 to control height relative to estimated distance to ground. The vehicle will move up and down with terrain height variation. Requires a distance to ground sensor. The height controller will revert to using height above origin if the distance to ground estimate becomes invalid as indicated by the local_position.distance_bottom_valid message being false. Set to 2 to control height relative to ground (requires a distance sensor) when stationary and relative to earth frame origin when moving horizontally. The speed threshold is controlled by the MPC_HOLD_MAX_XY parameter. 0 2 @@ -5100,96 +4571,59 @@ - Deadzone for sticks in manual piloted modes - Does not apply to manual throttle and direct attitude piloting by stick. - 0 - 1 + Deadzone of sticks where position hold is enabled + 0.0 + 1.0 2 - 0.01 Maximum horizontal velocity for which position hold is enabled (use 0 to disable check) - Only used with MPC_POS_MODE 0 or MPC_ALT_MODE 2 - 0 - 3 + 0.0 + 3.0 m/s 2 Maximum vertical velocity for which position hold is enabled (use 0 to disable check) - Only used with MPC_ALT_MODE 1 - 0 - 3 + 0.0 + 3.0 m/s 2 - - Jerk limit in autonomous modes - Limit the maximum jerk of the vehicle (how fast the acceleration can change). A lower value leads to smoother vehicle motions but also limited agility. - 1 - 80 + + Jerk limit in auto mode + Limit the maximum jerk of the vehicle (how fast the acceleration can change). A lower value leads to smoother vehicle motions, but it also limits its agility. + 1.0 + 80.0 m/s^3 1 1 - - Maximum horizontal and vertical jerk in Position/Altitude mode - Limit the maximum jerk of the vehicle (how fast the acceleration can change). A lower value leads to smoother motions but limits agility (how fast it can change directions or break). Setting this to the maximum value essentially disables the limit. Only used with smooth MPC_POS_MODE 3 and 4. + + Maximum jerk limit + Limit the maximum jerk of the vehicle (how fast the acceleration can change). A lower value leads to smoother vehicle motions, but it also limits its agility (how fast it can change directions or break). Setting this to the maximum value essentially disables the limit. Note: This is only used when MPC_POS_MODE is set to a smoothing mode 3 or 4. 0.5 - 500 + 500.0 m/s^3 - 0 + 2 1 - + Altitude for 1. step of slow landing (descend) - Below this altitude descending velocity gets limited to a value between "MPC_Z_VEL_MAX_DN" (or "MPC_Z_V_AUTO_DN") and "MPC_LAND_SPEED" Value needs to be higher than "MPC_LAND_ALT2" + Below this altitude descending velocity gets limited to a value between "MPC_Z_VEL_MAX_DN" and "MPC_LAND_SPEED" Value needs to be higher than "MPC_LAND_ALT2" 0 122 m 1 - + Altitude for 2. step of slow landing (landing) - Below this altitude descending velocity gets limited to "MPC_LAND_SPEED" Value needs to be lower than "MPC_LAND_ALT1" + Below this altitude descending velocity gets limited to "MPC_LAND_SPEED". Value needs to be lower than "MPC_LAND_ALT1" 0 122 m 1 - - Altitude for 3. step of slow landing - Below this altitude descending velocity gets limited to "MPC_LAND_CRWL", if LIDAR available. No effect if LIDAR not available - 0 - 122 - m - 1 - - - Land crawl descend rate - Used below MPC_LAND_ALT3 if distance sensor data is availabe. - 0.1 - m/s - 1 - - - User assisted landing radius - When nudging is enabled (see MPC_LAND_RC_HELP), this controls the maximum allowed horizontal displacement from the original landing point. - 0 - m - 0 - 1 - - - Enable nudging based on user input during autonomous land routine - Using stick input the vehicle can be moved horizontally and yawed. The descend speed is amended: stick full up - 0 stick centered - MPC_LAND_SPEED stick full down - 2 * MPC_LAND_SPEED Manual override during auto modes has to be disabled to use this feature (see COM_RC_OVERRIDE). - 0 - 1 - - Nudging disabled - Nudging enabled - - Landing descend rate 0.6 @@ -5197,116 +4631,117 @@ 1 - Minimum collective thrust in Stabilized mode - The value is mapped to the lowest throttle stick position in Stabilized mode. Too low collective thrust leads to loss of roll/pitch/yaw torque control authority. Airmode is used to keep torque authority with zero thrust (see MC_AIRMODE). - 0 - 1 + Minimum manual thrust + Minimum vertical thrust. It's recommended to set it > 0 to avoid free fall with zero thrust. With MC_AIRMODE set to 1, this can safely be set to 0. + 0.0 + 1.0 norm 2 0.01 - - Maximal tilt angle in Stabilized or Altitude mode - 0 - 90 + + Maximal tilt angle in manual or altitude mode + 0.0 + 90.0 deg - 0 - 1 + 1 - - Max manual yaw rate for Stabilized, Altitude, Position mode - 0 + + Max manual yaw rate + 0.0 400 deg/s - 0 - 10 + 1 Manual yaw rate input filter time constant - Not used in Stabilized mode Setting this parameter to 0 disables the filter - 0 - 5 + Setting this parameter to 0 disables the filter + 0.0 + 5.0 s 2 - 0.01 - Position/Altitude mode variant - The supported sub-modes are: 0 Sticks directly map to velocity setpoints without smoothing. Also applies to vertical direction and Altitude mode. Useful for velocity control tuning. 3 Sticks map to velocity but with maximum acceleration and jerk limits based on jerk optimized trajectory generator (different algorithm than 1). 4 Sticks map to acceleration and there's a virtual brake drag + Manual-Position control sub-mode + The supported sub-modes are: 0 Simple position control where sticks map directly to velocity setpoints without smoothing. Useful for velocity control tuning. 3 Smooth position control with maximum acceleration and jerk limits based on jerk optimized trajectory generator (different algorithm than 1). 4 Smooth position control where sticks map to acceleration and there's a virtual brake drag - Direct velocity - Smoothed velocity - Acceleration based + Simple position control + Smooth position control (Jerk optimized) + Acceleration based input + + Enforced delay between arming and takeoff + For altitude controlled modes the time from arming the motors until a takeoff is possible gets forced to be at least MPC_SPOOLUP_TIME seconds to ensure the motors and propellers can sppol up and reach idle speed before getting commanded to spin faster. This delay is particularly useful for vehicles with slow motor spin-up e.g. because of large propellers. + 0 + 10 + s + - Thrust curve mapping in Stabilized Mode - This parameter defines how the throttle stick input is mapped to collective thrust in Stabilized mode. In case the default is used ('Rescale to hover thrust'), the stick input is linearly rescaled, such that a centered stick corresponds to the hover throttle (see MPC_THR_HOVER). Select 'No Rescale' to directly map the stick 1:1 to the output. This can be useful in case the hover thrust is very low and the default would lead to too much distortion (e.g. if hover thrust is set to 20%, then 80% of the upper thrust range is squeezed into the upper half of the stick range). Note: In case MPC_THR_HOVER is set to 50%, the modes 0 and 1 are the same. + Thrust curve in Manual Mode + This parameter defines how the throttle stick input is mapped to commanded thrust in Manual/Stabilized flight mode. In case the default is used ('Rescale to hover thrust'), the stick input is linearly rescaled, such that a centered stick corresponds to the hover throttle (see MPC_THR_HOVER). Select 'No Rescale' to directly map the stick 1:1 to the output. This can be useful in case the hover thrust is very low and the default would lead to too much distortion (e.g. if hover thrust is set to 20%, 80% of the upper thrust range is squeezed into the upper half of the stick range). Note: In case MPC_THR_HOVER is set to 50%, the modes 0 and 1 are the same. Rescale to hover thrust No Rescale - Vertical thrust required to hover - Mapped to center throttle stick in Stabilized mode (see MPC_THR_CURVE). Used for initialization of the hover thrust estimator (see MPC_USE_HTE). The estimated hover thrust is used as base for zero vertical acceleration in altitude control. The hover thrust is important for land detection to work correctly. + Hover thrust + Vertical thrust required to hover. This value is mapped to center stick for manual throttle control. With this value set to the thrust required to hover, transition from manual to Altitude or Position mode while hovering will occur with the throttle stick near center, which is then interpreted as (near) zero demand for vertical speed. This parameter is also important for the landing detection to work correctly. 0.1 0.8 norm 2 0.01 - - Maximum collective thrust in climb rate controlled modes - Limit allowed thrust e.g. for indoor test of overpowered vehicle. - 0 - 1 + + Maximum thrust in auto thrust control + Limit max allowed thrust + 0.0 + 1.0 norm 2 - 0.05 + 0.01 - Minimum collective thrust in climb rate controlled modes - Too low thrust leads to loss of roll/pitch/yaw torque control authority. With airmode enabled this parameters can be set to 0 while still keeping torque authority (see MC_AIRMODE). + Minimum collective thrust in auto thrust control + It's recommended to set it > 0 to avoid free fall with zero thrust. Note: Without airmode zero thrust leads to zero roll/pitch control authority. (see MC_AIRMODE) 0.05 - 0.5 + 1.0 norm 2 0.01 Horizontal thrust margin - Margin that is kept for horizontal control when higher priority vertical thrust is saturated. To avoid completely starving horizontal control with high vertical error. - 0 + Margin that is kept for horizontal control when prioritizing vertical thrust. To avoid completely starving horizontal control with high vertical error. + 0.0 0.5 norm 2 0.01 - + Maximum tilt angle in air - Absolute maximum for all velocity or acceleration controlled modes. Any higher value is truncated. - 20 - 89 + Limits maximum tilt in AUTO and POSCTRL modes during flight. + 20.0 + 89.0 deg - 0 - 1 + 1 - - Maximum tilt during inital takeoff ramp - Tighter tilt limit during takeoff to avoid tip over. - 5 - 89 + + Maximum tilt during landing + Limits maximum tilt angle on landing. + 10.0 + 89.0 deg - 0 - 1 + 1 - - Smooth takeoff ramp time constant - Increasing this value will make climb rate controlled takeoff slower. If it's too slow the drone might scratch the ground and tip over. A time constant of 0 disables the ramp + + Position control smooth takeoff ramp time constant + Increasing this value will make automatic and manual takeoff slower. If it's too slow the drone might scratch the ground and tip over. A time constant of 0 disables the ramp 0 5 - s Takeoff climb rate @@ -5316,86 +4751,62 @@ 2 - Hover thrust estimator - Disable to use the fixed parameter MPC_THR_HOVER Enable to use the hover thrust estimator + Hover thrust source selector + Set false to use the fixed parameter MPC_THR_HOVER Set true to use the value computed by the hover thrust estimator - Numerical velocity derivative low pass cutoff frequency - 0 + Low pass filter cut freq. for numerical velocity derivative + 0.0 10 Hz - 1 - 0.5 + 2 - - Maximum horizontal velocity setpoint in Position mode - Must be smaller than MPC_XY_VEL_MAX. The maximum sideways and backward speed can be set differently using MPC_VEL_MAN_SIDE and MPC_VEL_MAN_BACK, respectively. - 3 - 20 + + Maximum horizontal velocity setpoint for manual controlled mode + If velocity setpoint larger than MPC_XY_VEL_MAX is set, then the setpoint will be capped to MPC_XY_VEL_MAX + 3.0 + 20.0 m/s - 1 + 2 1 - - Maximum backward velocity in Position mode - If set to a negative value or larger than MPC_VEL_MANUAL then MPC_VEL_MANUAL is used. - -1 - 20 + + Default horizontal velocity in mission + Horizontal velocity used when flying autonomously in e.g. Missions, RTL, Goto. + 3.0 + 20.0 m/s - 1 + 2 1 - - Maximum sideways velocity in Position mode - If set to a negative value or larger than MPC_VEL_MANUAL then MPC_VEL_MANUAL is used. - -1 - 20 - m/s - 1 - 1 - - - Default horizontal velocity in autonomous modes - e.g. in Missions, RTL, Goto if the waypoint does not specify differently - 3 - 20 - m/s - 0 - 1 - - + Maximum horizontal error allowed by the trajectory generator The integration speed of the trajectory setpoint is linearly reduced with the horizontal position tracking error. When the error is above this parameter, the integration of the trajectory is stopped to wait for the drone. This value can be adjusted depending on the tracking capabilities of the vehicle. 0.1 - 10 + 10.0 1 - 1 Manual position control stick exponential curve sensitivity - The higher the value the less sensitivity the stick has around zero while still reaching the maximum value with full stick deflection. 0 Purely linear input curve 1 Purely cubic input curve + The higher the value the less sensitivity the stick has around zero while still reaching the maximum value with full stick deflection. 0 Purely linear input curve (default) 1 Purely cubic input curve 0 1 2 - 0.01 Proportional gain for horizontal position error - Defined as corrective velocity in m/s per m position error - 0 - 2 + 0.0 + 2.0 2 - 0.1 Proportional gain for horizontal trajectory position error 0.1 - 1 + 1.0 1 - 0.1 - - Overall Horizontal Velocity Limit + + Overall Horizonal Velocity Limit If set to a value greater than zero, other parameters are automatically set (such as MPC_XY_VEL_MAX or MPC_VEL_MANUAL). If set to a negative value, the existing individual parameters are used. -20 20 @@ -5403,63 +4814,56 @@ 1 - Differential gain for horizontal velocity error - Defined as corrective acceleration in m/s^2 per m/s^2 velocity derivative + Differential gain for horizontal velocity error. Small values help reduce fast oscillations. If value is too big oscillations will appear again + defined as correction acceleration in m/s^2 per m/s^2 velocity derivative 0.1 - 2 - 2 - 0.02 + 2.0 + 3 Integral gain for horizontal velocity error - Defined as correction acceleration in m/s^2 per m velocity integral Allows to eliminate steady state errors in disturbances like wind. - 0 - 60 - 2 - 0.02 + defined as correction acceleration in m/s^2 per m velocity integral Non-zero value allows to eliminate steady state errors in the presence of disturbances like wind. + 0.0 + 60.0 + 3 - + Maximum horizontal velocity - Absolute maximum for all velocity controlled modes. Any higher value is truncated. - 0 - 20 + Maximum horizontal velocity in AUTO mode. If higher speeds are commanded in a mission they will be capped to this velocity. + 0.0 + 20.0 m/s - 1 + 2 1 Proportional gain for horizontal velocity error - Defined as corrective acceleration in m/s^2 per m/s velocity error + defined as correction acceleration in m/s^2 per m/s velocity error 1.2 - 5 + 5.0 2 - 0.1 Manual control stick yaw rotation exponential curve - The higher the value the less sensitivity the stick has around zero while still reaching the maximum value with full stick deflection. 0 Purely linear input curve 1 Purely cubic input curve + The higher the value the less sensitivity the stick has around zero while still reaching the maximum value with full stick deflection. 0 Purely linear input curve (default) 1 Purely cubic input curve 0 1 2 - 0.01 Manual control stick vertical exponential curve - The higher the value the less sensitivity the stick has around zero while still reaching the maximum value with full stick deflection. 0 Purely linear input curve 1 Purely cubic input curve + The higher the value the less sensitivity the stick has around zero while still reaching the maximum value with full stick deflection. 0 Purely linear input curve (default) 1 Purely cubic input curve 0 1 2 - 0.01 - + Proportional gain for vertical position error - Defined as corrective velocity in m/s per m position error - 0.1 + 0.0 1.5 2 - 0.1 - + Overall Vertical Velocity Limit If set to a value greater than zero, other parameters are automatically set (such as MPC_Z_VEL_MAX_UP or MPC_LAND_SPEED). If set to a negative value, the existing individual parameters are used. -3 @@ -5467,65 +4871,41 @@ 1 0.5 - + Differential gain for vertical velocity error - Defined as corrective acceleration in m/s^2 per m/s^2 velocity derivative - 0 - 2 - 2 - 0.02 + defined as correction acceleration in m/s^2 per m/s^2 velocity derivative + 0.0 + 2.0 + 3 - + Integral gain for vertical velocity error - Defined as corrective acceleration in m/s^2 per m velocity integral + defined as correction acceleration in m/s^2 per m velocity integral Non zero value allows hovering thrust estimation on stabilized or autonomous takeoff. 0.2 - 3 - 2 - 0.1 + 3.0 + 3 - - Maximum descent velocity - Absolute maximum for all climb rate controlled modes. In manually piloted modes full stick deflection commands this velocity. For default autonomous velocity see MPC_Z_V_AUTO_UP + + Maximum vertical descent velocity + Maximum vertical velocity in AUTO mode and endpoint for stabilized modes (ALTCTRL, POSCTRL). 0.5 - 4 + 4.0 + m/s + + + Maximum vertical ascent velocity + Maximum vertical velocity in AUTO mode and endpoint for stabilized modes (ALTCTRL, POSCTRL). + 0.5 + 8.0 m/s 1 - 0.1 - - Maximum ascent velocity - Absolute maximum for all climb rate controlled modes. In manually piloted modes full stick deflection commands this velocity. For default autonomous velocity see MPC_Z_V_AUTO_UP - 0.5 - 8 - m/s - 1 - 0.1 - - + Proportional gain for vertical velocity error - Defined as corrective acceleration in m/s^2 per m/s velocity error - 2 - 15 + defined as correction acceleration in m/s^2 per m/s velocity error + 2.0 + 15.0 2 - 0.1 - - - Descent velocity in autonomous modes - For manual modes and offboard, see MPC_Z_VEL_MAX_DN - 0.5 - 4 - m/s - 1 - 0.5 - - - Ascent velocity in autonomous modes - For manually controlled modes and offboard see MPC_Z_VEL_MAX_UP - 0.5 - 8 - m/s - 1 - 0.5 Responsiveness @@ -5552,6 +4932,61 @@ + + Acro mode Expo factor for Roll and Pitch + Exponential factor for tuning the input curve shape. 0 Purely linear input curve 1 Purely cubic input curve + 0 + 1 + 2 + + + Acro mode Expo factor for Yaw + Exponential factor for tuning the input curve shape. 0 Purely linear input curve 1 Purely cubic input curve + 0 + 1 + 2 + + + Max acro pitch rate + default: 2 turns per second + 0.0 + 1800.0 + deg/s + 1 + 5 + + + Max acro roll rate + default: 2 turns per second + 0.0 + 1800.0 + deg/s + 1 + 5 + + + Acro mode SuperExpo factor for Roll and Pitch + SuperExpo factor for refining the input curve shape tuned using MC_ACRO_EXPO. 0 Pure Expo function 0.7 resonable shape enhancement for intuitive stick feel 0.95 very strong bent input curve only near maxima have effect + 0 + 0.95 + 2 + + + Acro mode SuperExpo factor for Yaw + SuperExpo factor for refining the input curve shape tuned using MC_ACRO_EXPO_Y. 0 Pure Expo function 0.7 resonable shape enhancement for intuitive stick feel 0.95 very strong bent input curve only near maxima have effect + 0 + 0.95 + 2 + + + Max acro yaw rate + default 1.5 turns per second + 0.0 + 1800.0 + deg/s + 1 + 5 + Battery power level scaler This compensates for voltage drop of the battery over time by attempting to normalize performance across the operating range of the battery. The copter should constantly behave as if it was fully charged with reduced max acceleration at lower battery percentages. i.e. if hover is at 0.5 throttle at 100% battery, it will still be 0.5 at 60% battery. @@ -5703,7 +5138,7 @@ Minimum motor rise time (slew rate limit) - Minimum time allowed for the motor input signal to pass through a range of 1000 PWM units. A value x means that the motor signal can only go from 1000 to 2000 PWM in minimum x seconds. Zero means that slew rate limiting is disabled. + Minimum time allowed for the motor input signal to pass through a range of 1000 PWM units. A value x means that the motor signal can only go from 1000 to 2000 PWM in maximum x seconds. Zero means that slew rate limiting is disabled. 0.0 s/(1000*PWM) @@ -5806,7 +5241,7 @@ RC channel 10 trim - Mid point value + Mid point value (has to be set to the same as min for throttle channel). 800.0 2200.0 us @@ -5843,7 +5278,7 @@ RC channel 11 trim - Mid point value + Mid point value (has to be set to the same as min for throttle channel). 800.0 2200.0 us @@ -5880,7 +5315,7 @@ RC channel 12 trim - Mid point value + Mid point value (has to be set to the same as min for throttle channel). 800.0 2200.0 us @@ -5917,7 +5352,7 @@ RC channel 13 trim - Mid point value + Mid point value (has to be set to the same as min for throttle channel). 800.0 2200.0 us @@ -5954,7 +5389,7 @@ RC channel 14 trim - Mid point value + Mid point value (has to be set to the same as min for throttle channel). 800.0 2200.0 us @@ -5991,7 +5426,7 @@ RC channel 15 trim - Mid point value + Mid point value (has to be set to the same as min for throttle channel). 800.0 2200.0 us @@ -6028,7 +5463,7 @@ RC channel 16 trim - Mid point value + Mid point value (has to be set to the same as min for throttle channel). 800.0 2200.0 us @@ -6065,7 +5500,7 @@ RC channel 17 trim - Mid point value + Mid point value (has to be set to the same as min for throttle channel). 800.0 2200.0 us @@ -6102,7 +5537,7 @@ RC channel 18 trim - Mid point value + Mid point value (has to be set to the same as min for throttle channel). 800.0 2200.0 us @@ -6140,7 +5575,7 @@ RC channel 1 trim - Mid point value + Mid point value (same as min for throttle) 800.0 2200.0 us @@ -6178,7 +5613,7 @@ RC channel 2 trim - Mid point value + Mid point value (has to be set to the same as min for throttle channel). 800.0 2200.0 us @@ -6216,7 +5651,7 @@ RC channel 3 trim - Mid point value + Mid point value (has to be set to the same as min for throttle channel). 800.0 2200.0 us @@ -6254,7 +5689,7 @@ RC channel 4 trim - Mid point value + Mid point value (has to be set to the same as min for throttle channel). 800.0 2200.0 us @@ -6291,7 +5726,7 @@ RC channel 5 trim - Mid point value + Mid point value (has to be set to the same as min for throttle channel). 800.0 2200.0 us @@ -6328,7 +5763,7 @@ RC channel 6 trim - Mid point value + Mid point value (has to be set to the same as min for throttle channel). 800.0 2200.0 us @@ -6365,7 +5800,7 @@ RC channel 7 trim - Mid point value + Mid point value (has to be set to the same as min for throttle channel). 800.0 2200.0 us @@ -6402,7 +5837,7 @@ RC channel 8 trim - Mid point value + Mid point value (has to be set to the same as min for throttle channel). 800.0 2200.0 us @@ -6439,7 +5874,7 @@ RC channel 9 trim - Mid point value + Mid point value (has to be set to the same as min for throttle channel). 800.0 2200.0 us @@ -6452,7 +5887,7 @@ Failsafe channel PWM threshold - Use RC_MAP_FAILSAFE to specify which channel is used to indicate RC loss via this threshold. By default this is the throttle channel. Set to a PWM value slightly above the PWM value for the channel (e.g. throttle) in a failsafe event, but below the minimum PWM value for the channel during normal operation. Note: The default value of 0 disables the feature (it is below the expected range). + Use RC_MAP_FAILSAFE to specify which channel is used to indicate RC loss via this theshold. By default this is the throttle channel. Set to a PWM value slightly above the PWM value for the channel (e.g. throttle) in a failsafe event, but below the minimum PWM value for the channel during normal operation. Note: The default value of 0 disables the feature (it is below the expected range). 0 2200 us @@ -6616,32 +6051,6 @@ Channel 18 - - RC channel to engage the main motor (for helicopters) - 0 - 18 - - Unassigned - Channel 1 - Channel 2 - Channel 3 - Channel 4 - Channel 5 - Channel 6 - Channel 7 - Channel 8 - Channel 9 - Channel 10 - Channel 11 - Channel 12 - Channel 13 - Channel 14 - Channel 15 - Channel 16 - Channel 17 - Channel 18 - - Failsafe channel mapping Configures which RC channel is used by the receiver to indicate the signal was lost (on receivers that use output a fixed signal value to report lost signal). If set to 0, the channel mapped to throttle is used. Use RC_FAILS_THR to set the threshold indicating lost signal. By default it's below the expected range and hence disabled. @@ -6899,25 +6308,25 @@ Pitch trim - The trim value is the actuator control value the system needs for straight and level flight. - -0.5 - 0.5 + The trim value is the actuator control value the system needs for straight and level flight. It can be calibrated by flying manually straight and level using the RC trims and copying them using the GCS. + -0.25 + 0.25 2 0.01 Roll trim - The trim value is the actuator control value the system needs for straight and level flight. - -0.5 - 0.5 + The trim value is the actuator control value the system needs for straight and level flight. It can be calibrated by flying manually straight and level using the RC trims and copying them using the GCS. + -0.25 + 0.25 2 0.01 Yaw trim - The trim value is the actuator control value the system needs for straight and level flight. - -0.5 - 0.5 + The trim value is the actuator control value the system needs for straight and level flight. It can be calibrated by flying manually straight and level using the RC trims and copying them using the GCS. + -0.25 + 0.25 2 0.01 @@ -6929,12 +6338,6 @@ -1 1 - - Threshold for selecting main motor engage - 0-1 indicate where in the full channel range the threshold sits 0 : min 1 : max sign indicates polarity of comparison positive : true when channel>th negative : true when channel<th - -1 - 1 - Threshold for the landing gear switch 0-1 indicate where in the full channel range the threshold sits 0 : min 1 : max sign indicates polarity of comparison positive : true when channel>th negative : true when channel<th @@ -7407,10 +6810,11 @@ Only climb to at least RTL_DESCEND_ALT above destination. - + Return mode loiter altitude - Descend to this altitude (above destination position) after return, and wait for time defined in RTL_LAND_DELAY. Land (i.e. slowly descend) from this altitude if autolanding allowed. VTOLs do transition to hover in this altitdue above the landing point. - 0 + Descend to this altitude (above destination position) after return, and wait for time defined in RTL_LAND_DELAY. Land (i.e. slowly descend) from this altitude if autolanding allowed. + 2 + 100 m 1 0.5 @@ -7428,14 +6832,16 @@ Return mode delay Delay before landing (after initial descent) in Return mode. If set to -1 the system will not land but loiter at RTL_DESCEND_ALT. -1 + 300 s 1 0.5 - + Loiter radius for rtl descend Set the radius for loitering to a safe altitude for VTOL transition. 25 + 1000 m 1 0.5 @@ -7444,6 +6850,7 @@ Horizontal radius from return point within which special rules for return mode apply The return altitude will be calculated based on RTL_CONE_ANG parameter. The yaw setpoint will switch to the one defined by corresponding waypoint. 0.5 + 100 m 1 0.5 @@ -7457,10 +6864,11 @@ Required precision landing - + Return mode return altitude - Default minimum altitude above destination (e.g. home, safe point, landing pattern) for return flight. The vehicle will climb to this altitude when Return mode is enganged, unless it currently is flying higher already. This is affected by RTL_MIN_DIST and RTL_CONE_ANG. + Default minimum altitude above destination (e.g. home, safe point, landing pattern) for return flight. This is affected by RTL_MIN_DIST and RTL_CONE_ANG. 0 + 150 m 1 0.5 @@ -7477,13 +6885,9 @@ - - RTL force approach landing - Only consider RTL point, if it has an approach defined. - RTL time estimate safety margin factor - Safety factor that is used to scale the actual RTL time estimate. Time with margin = RTL_TIME_FACTOR * time + RTL_TIME_MARGIN + Safety factor that is used to scale the actual RTL time estiamte. Time with margin = RTL_TIME_FACTOR * time + RTL_TIME_MARGIN 1.0 2.0 1 @@ -7499,6 +6903,60 @@ 1 + + + Address of the Roboclaw + The Roboclaw can be configured to have an address from 0x80 to 0x87, inclusive. It must be configured to match this parameter. + 128 + 135 + + 0x80 + 0x81 + 0x82 + 0x83 + 0x84 + 0x85 + 0x86 + 0x87 + + + + Roboclaw serial baud rate + Baud rate of the serial communication with the Roboclaw. The Roboclaw must be configured to match this rate. + 2400 + 460800 + true + + 2400 baud + 9600 baud + 19200 baud + 38400 baud + 57600 baud + 115200 baud + 230400 baud + 460800 baud + + + + Encoder counts per revolution + Number of encoder counts for one revolution. The roboclaw treats analog encoders (potentiometers) as having 2047 counts per rev. The default value of 1200 corresponds to the default configuration of the Aion R1 rover. + 1 + + + Encoder read period + How long to wait, in Milliseconds, between reading wheel encoder values over Uart from the Roboclaw + 1 + 1000 + ms + + + Uart write period + How long to wait, in Milliseconds, between writing actuator controls over Uart to the Roboclaw + 1 + 1000 + ms + + L1 damping @@ -7650,38 +7108,63 @@ + + Min airspeed scaling factor for takeoff + Pitch up will be commanded when the following airspeed is reached: FW_AIRSPD_MIN * RWTO_AIRSPD_SCL + 0.0 + 2.0 + norm + 2 + 0.01 + - Specifies which heading should be held during the runway takeoff ground roll - 0: airframe heading when takeoff is initiated 1: position control along runway direction (bearing defined from vehicle position on takeoff initiation to MAV_CMD_TAKEOFF position defined by operator) + Specifies which heading should be held during runnway takeoff + 0: airframe heading, 1: heading towards takeoff waypoint 0 1 Airframe - Runway + Waypoint + + Max pitch during takeoff + Fixed-wing settings are used if set to 0. Note that there is also a minimum pitch of 10 degrees during takeoff, so this must be larger if set. + 0.0 + 60.0 + deg + 1 + 0.5 + + + Max roll during climbout + Roll is limited during climbout to ensure enough lift and prevents aggressive navigation before we're on a safe height. + 0.0 + 60.0 + deg + 1 + 0.5 + Max throttle during runway takeoff + Can be used to test taxi on runway 0.0 1.0 norm 2 0.01 - - NPFG period while steering on runway - 1.0 + + Altitude AGL at which we have enough ground clearance to allow some roll + Until RWTO_NAV_ALT is reached the plane is held level and only rudder is used to keep the heading (see RWTO_HDG). This should be below FW_CLMBOUT_DIFF if FW_CLMBOUT_DIFF > 0. + 0.0 100.0 - s + m 1 - 0.1 - - - Enable use of yaw stick for nudging the wheel during runway ground roll - This is useful when map, GNSS, or yaw errors on ground are misaligned with what the operator intends for takeoff course. Particularly useful for skinny runways or if the wheel servo is a bit off trim. + 1 - Pitch setpoint during taxi / before takeoff rotation airspeed is reached + Pitch setpoint during taxi / before takeoff airspeed is reached A taildragger with steerable wheel might need to pitch up a little to keep its wheel on the ground before airspeed to takeoff is reached. -10.0 20.0 @@ -7697,22 +7180,6 @@ 2 0.1 - - Takeoff rotation airspeed - The calibrated airspeed threshold during the takeoff ground roll when the plane should start rotating (pitching up). Must be less than the takeoff airspeed, will otherwise be capped at the takeoff airpeed (see FW_TKO_AIRSPD). If set <= 0.0, defaults to 0.9 * takeoff airspeed (see FW_TKO_AIRSPD) - -1.0 - m/s - 1 - 0.1 - - - Takeoff rotation time - This is the time desired to linearly ramp in takeoff pitch constraints during the takeoff rotation - 0.1 - s - 1 - 0.1 - Runway takeoff with landing gear @@ -7770,14 +7237,13 @@ from boot until disarm from boot until shutdown depending on AUX1 RC channel - from 1st armed until shutdown Logging topic profile (integer bitmask) - This integer bitmask controls the set and rates of logged topics. The default allows for general log analysis while keeping the log file size reasonably small. Enabling multiple sets leads to higher bandwidth requirements and larger log files. Set bits true to enable: 0 : Default set (used for general log analysis) 1 : Full rate estimator (EKF2) replay topics 2 : Topics for thermal calibration (high rate raw IMU and Baro sensor data) 3 : Topics for system identification (high rate actuator control and IMU data) 4 : Full rates for analysis of fast maneuvers (RC, attitude, rates and actuators) 5 : Debugging topics (debug_*.msg topics, for custom code) 6 : Topics for sensor comparison (low rate raw IMU, Baro and magnetometer data) 7 : Topics for computer vision and collision avoidance 8 : Raw FIFO high-rate IMU (Gyro) 9 : Raw FIFO high-rate IMU (Accel) 10: Logging of mavlink tunnel message (useful for payload communication debugging) + This integer bitmask controls the set and rates of logged topics. The default allows for general log analysis while keeping the log file size reasonably small. Enabling multiple sets leads to higher bandwidth requirements and larger log files. Set bits true to enable: 0 : Default set (used for general log analysis) 1 : Full rate estimator (EKF2) replay topics 2 : Topics for thermal calibration (high rate raw IMU and Baro sensor data) 3 : Topics for system identification (high rate actuator control and IMU data) 4 : Full rates for analysis of fast maneuvers (RC, attitude, rates and actuators) 5 : Debugging topics (debug_*.msg topics, for custom code) 6 : Topics for sensor comparison (low rate raw IMU, Baro and Magnetomer data) 7 : Topics for computer vision and collision avoidance 8 : Raw FIFO high-rate IMU (Gyro) 9 : Raw FIFO high-rate IMU (Accel) 0 - 2047 + 1023 true Default set (general log analysis) @@ -7790,7 +7256,6 @@ Computer Vision and Avoidance Raw FIFO high-rate IMU (Gyro) Raw FIFO high-rate IMU (Accel) - Mavlink tunnel message logging @@ -7823,6 +7288,1122 @@ + + ID of the Accelerometer that the calibration is for + + + Accelerometer 0 priority + + Uninitialized + Disabled + Min + Low + Medium (Default) + High + Max + + + + Rotation of accelerometer 0 relative to airframe + An internal sensor will force a value of -1, so a GCS should only attempt to configure the rotation if the value is greater than or equal to zero. + -1 + 40 + true + + Internal + No rotation + Yaw 45° + Yaw 90° + Yaw 135° + Yaw 180° + Yaw 225° + Yaw 270° + Yaw 315° + Roll 180° + Roll 180°, Yaw 45° + Roll 180°, Yaw 90° + Roll 180°, Yaw 135° + Pitch 180° + Roll 180°, Yaw 225° + Roll 180°, Yaw 270° + Roll 180°, Yaw 315° + Roll 90° + Roll 90°, Yaw 45° + Roll 90°, Yaw 90° + Roll 90°, Yaw 135° + Roll 270° + Roll 270°, Yaw 45° + Roll 270°, Yaw 90° + Roll 270°, Yaw 135° + Pitch 90° + Pitch 270° + Pitch 180°, Yaw 90° + Pitch 180°, Yaw 270° + Roll 90°, Pitch 90° + Roll 180°, Pitch 90° + Roll 270°, Pitch 90° + Roll 90°, Pitch 180° + Roll 270°, Pitch 180° + Roll 90°, Pitch 270° + Roll 180°, Pitch 270° + Roll 270°, Pitch 270° + Roll 90°, Pitch 180°, Yaw 90° + Roll 90°, Yaw 270° + Roll 90°, Pitch 68°, Yaw 293° + Pitch 315° + Roll 90°, Pitch 315° + + + + Accelerometer calibration temperature + Temperature during last calibration. + celcius + + + Accelerometer X-axis offset + + + Accelerometer X-axis scaling factor + + + Accelerometer Y-axis offset + + + Accelerometer Y-axis scaling factor + + + Accelerometer Z-axis offset + + + Accelerometer Z-axis scaling factor + + + ID of the Accelerometer that the calibration is for + + + Accelerometer 1 priority + + Uninitialized + Disabled + Min + Low + Medium (Default) + High + Max + + + + Rotation of accelerometer 1 relative to airframe + An internal sensor will force a value of -1, so a GCS should only attempt to configure the rotation if the value is greater than or equal to zero. + -1 + 40 + true + + Internal + No rotation + Yaw 45° + Yaw 90° + Yaw 135° + Yaw 180° + Yaw 225° + Yaw 270° + Yaw 315° + Roll 180° + Roll 180°, Yaw 45° + Roll 180°, Yaw 90° + Roll 180°, Yaw 135° + Pitch 180° + Roll 180°, Yaw 225° + Roll 180°, Yaw 270° + Roll 180°, Yaw 315° + Roll 90° + Roll 90°, Yaw 45° + Roll 90°, Yaw 90° + Roll 90°, Yaw 135° + Roll 270° + Roll 270°, Yaw 45° + Roll 270°, Yaw 90° + Roll 270°, Yaw 135° + Pitch 90° + Pitch 270° + Pitch 180°, Yaw 90° + Pitch 180°, Yaw 270° + Roll 90°, Pitch 90° + Roll 180°, Pitch 90° + Roll 270°, Pitch 90° + Roll 90°, Pitch 180° + Roll 270°, Pitch 180° + Roll 90°, Pitch 270° + Roll 180°, Pitch 270° + Roll 270°, Pitch 270° + Roll 90°, Pitch 180°, Yaw 90° + Roll 90°, Yaw 270° + Roll 90°, Pitch 68°, Yaw 293° + Pitch 315° + Roll 90°, Pitch 315° + + + + Accelerometer calibration temperature + Temperature during last calibration. + celcius + + + Accelerometer X-axis offset + + + Accelerometer X-axis scaling factor + + + Accelerometer Y-axis offset + + + Accelerometer Y-axis scaling factor + + + Accelerometer Z-axis offset + + + Accelerometer Z-axis scaling factor + + + ID of the Accelerometer that the calibration is for + + + Accelerometer 2 priority + + Uninitialized + Disabled + Min + Low + Medium (Default) + High + Max + + + + Rotation of accelerometer 2 relative to airframe + An internal sensor will force a value of -1, so a GCS should only attempt to configure the rotation if the value is greater than or equal to zero. + -1 + 40 + true + + Internal + No rotation + Yaw 45° + Yaw 90° + Yaw 135° + Yaw 180° + Yaw 225° + Yaw 270° + Yaw 315° + Roll 180° + Roll 180°, Yaw 45° + Roll 180°, Yaw 90° + Roll 180°, Yaw 135° + Pitch 180° + Roll 180°, Yaw 225° + Roll 180°, Yaw 270° + Roll 180°, Yaw 315° + Roll 90° + Roll 90°, Yaw 45° + Roll 90°, Yaw 90° + Roll 90°, Yaw 135° + Roll 270° + Roll 270°, Yaw 45° + Roll 270°, Yaw 90° + Roll 270°, Yaw 135° + Pitch 90° + Pitch 270° + Pitch 180°, Yaw 90° + Pitch 180°, Yaw 270° + Roll 90°, Pitch 90° + Roll 180°, Pitch 90° + Roll 270°, Pitch 90° + Roll 90°, Pitch 180° + Roll 270°, Pitch 180° + Roll 90°, Pitch 270° + Roll 180°, Pitch 270° + Roll 270°, Pitch 270° + Roll 90°, Pitch 180°, Yaw 90° + Roll 90°, Yaw 270° + Roll 90°, Pitch 68°, Yaw 293° + Pitch 315° + Roll 90°, Pitch 315° + + + + Accelerometer calibration temperature + Temperature during last calibration. + celcius + + + Accelerometer X-axis offset + + + Accelerometer X-axis scaling factor + + + Accelerometer Y-axis offset + + + Accelerometer Y-axis scaling factor + + + Accelerometer Z-axis offset + + + Accelerometer Z-axis scaling factor + + + ID of the Accelerometer that the calibration is for + + + Accelerometer 3 priority + + Uninitialized + Disabled + Min + Low + Medium (Default) + High + Max + + + + Rotation of accelerometer 3 relative to airframe + An internal sensor will force a value of -1, so a GCS should only attempt to configure the rotation if the value is greater than or equal to zero. + -1 + 40 + true + + Internal + No rotation + Yaw 45° + Yaw 90° + Yaw 135° + Yaw 180° + Yaw 225° + Yaw 270° + Yaw 315° + Roll 180° + Roll 180°, Yaw 45° + Roll 180°, Yaw 90° + Roll 180°, Yaw 135° + Pitch 180° + Roll 180°, Yaw 225° + Roll 180°, Yaw 270° + Roll 180°, Yaw 315° + Roll 90° + Roll 90°, Yaw 45° + Roll 90°, Yaw 90° + Roll 90°, Yaw 135° + Roll 270° + Roll 270°, Yaw 45° + Roll 270°, Yaw 90° + Roll 270°, Yaw 135° + Pitch 90° + Pitch 270° + Pitch 180°, Yaw 90° + Pitch 180°, Yaw 270° + Roll 90°, Pitch 90° + Roll 180°, Pitch 90° + Roll 270°, Pitch 90° + Roll 90°, Pitch 180° + Roll 270°, Pitch 180° + Roll 90°, Pitch 270° + Roll 180°, Pitch 270° + Roll 270°, Pitch 270° + Roll 90°, Pitch 180°, Yaw 90° + Roll 90°, Yaw 270° + Roll 90°, Pitch 68°, Yaw 293° + Pitch 315° + Roll 90°, Pitch 315° + + + + Accelerometer calibration temperature + Temperature during last calibration. + celcius + + + Accelerometer X-axis offset + + + Accelerometer X-axis scaling factor + + + Accelerometer Y-axis offset + + + Accelerometer Y-axis scaling factor + + + Accelerometer Z-axis offset + + + Accelerometer Z-axis scaling factor + + + ID of the Gyro that the calibration is for + + + Gyro 0 priority + + Uninitialized + Disabled + Min + Low + Medium (Default) + High + Max + + + + Rotation of gyro 0 relative to airframe + An internal sensor will force a value of -1, so a GCS should only attempt to configure the rotation if the value is greater than or equal to zero. + -1 + 40 + true + + Internal + No rotation + Yaw 45° + Yaw 90° + Yaw 135° + Yaw 180° + Yaw 225° + Yaw 270° + Yaw 315° + Roll 180° + Roll 180°, Yaw 45° + Roll 180°, Yaw 90° + Roll 180°, Yaw 135° + Pitch 180° + Roll 180°, Yaw 225° + Roll 180°, Yaw 270° + Roll 180°, Yaw 315° + Roll 90° + Roll 90°, Yaw 45° + Roll 90°, Yaw 90° + Roll 90°, Yaw 135° + Roll 270° + Roll 270°, Yaw 45° + Roll 270°, Yaw 90° + Roll 270°, Yaw 135° + Pitch 90° + Pitch 270° + Pitch 180°, Yaw 90° + Pitch 180°, Yaw 270° + Roll 90°, Pitch 90° + Roll 180°, Pitch 90° + Roll 270°, Pitch 90° + Roll 90°, Pitch 180° + Roll 270°, Pitch 180° + Roll 90°, Pitch 270° + Roll 180°, Pitch 270° + Roll 270°, Pitch 270° + Roll 90°, Pitch 180°, Yaw 90° + Roll 90°, Yaw 270° + Roll 90°, Pitch 68°, Yaw 293° + Pitch 315° + Roll 90°, Pitch 315° + + + + Gyroscope calibration temperature + Temperature during last calibration. + celcius + + + Gyro X-axis offset + + + Gyro Y-axis offset + + + Gyro Z-axis offset + + + ID of the Gyro that the calibration is for + + + Gyro 1 priority + + Uninitialized + Disabled + Min + Low + Medium (Default) + High + Max + + + + Rotation of gyro 1 relative to airframe + An internal sensor will force a value of -1, so a GCS should only attempt to configure the rotation if the value is greater than or equal to zero. + -1 + 40 + true + + Internal + No rotation + Yaw 45° + Yaw 90° + Yaw 135° + Yaw 180° + Yaw 225° + Yaw 270° + Yaw 315° + Roll 180° + Roll 180°, Yaw 45° + Roll 180°, Yaw 90° + Roll 180°, Yaw 135° + Pitch 180° + Roll 180°, Yaw 225° + Roll 180°, Yaw 270° + Roll 180°, Yaw 315° + Roll 90° + Roll 90°, Yaw 45° + Roll 90°, Yaw 90° + Roll 90°, Yaw 135° + Roll 270° + Roll 270°, Yaw 45° + Roll 270°, Yaw 90° + Roll 270°, Yaw 135° + Pitch 90° + Pitch 270° + Pitch 180°, Yaw 90° + Pitch 180°, Yaw 270° + Roll 90°, Pitch 90° + Roll 180°, Pitch 90° + Roll 270°, Pitch 90° + Roll 90°, Pitch 180° + Roll 270°, Pitch 180° + Roll 90°, Pitch 270° + Roll 180°, Pitch 270° + Roll 270°, Pitch 270° + Roll 90°, Pitch 180°, Yaw 90° + Roll 90°, Yaw 270° + Roll 90°, Pitch 68°, Yaw 293° + Pitch 315° + Roll 90°, Pitch 315° + + + + Gyroscope calibration temperature + Temperature during last calibration. + celcius + + + Gyro X-axis offset + + + Gyro Y-axis offset + + + Gyro Z-axis offset + + + ID of the Gyro that the calibration is for + + + Gyro 2 priority + + Uninitialized + Disabled + Min + Low + Medium (Default) + High + Max + + + + Rotation of gyro 2 relative to airframe + An internal sensor will force a value of -1, so a GCS should only attempt to configure the rotation if the value is greater than or equal to zero. + -1 + 40 + true + + Internal + No rotation + Yaw 45° + Yaw 90° + Yaw 135° + Yaw 180° + Yaw 225° + Yaw 270° + Yaw 315° + Roll 180° + Roll 180°, Yaw 45° + Roll 180°, Yaw 90° + Roll 180°, Yaw 135° + Pitch 180° + Roll 180°, Yaw 225° + Roll 180°, Yaw 270° + Roll 180°, Yaw 315° + Roll 90° + Roll 90°, Yaw 45° + Roll 90°, Yaw 90° + Roll 90°, Yaw 135° + Roll 270° + Roll 270°, Yaw 45° + Roll 270°, Yaw 90° + Roll 270°, Yaw 135° + Pitch 90° + Pitch 270° + Pitch 180°, Yaw 90° + Pitch 180°, Yaw 270° + Roll 90°, Pitch 90° + Roll 180°, Pitch 90° + Roll 270°, Pitch 90° + Roll 90°, Pitch 180° + Roll 270°, Pitch 180° + Roll 90°, Pitch 270° + Roll 180°, Pitch 270° + Roll 270°, Pitch 270° + Roll 90°, Pitch 180°, Yaw 90° + Roll 90°, Yaw 270° + Roll 90°, Pitch 68°, Yaw 293° + Pitch 315° + Roll 90°, Pitch 315° + + + + Gyroscope calibration temperature + Temperature during last calibration. + celcius + + + Gyro X-axis offset + + + Gyro Y-axis offset + + + Gyro Z-axis offset + + + ID of the Gyro that the calibration is for + + + Gyro 3 priority + + Uninitialized + Disabled + Min + Low + Medium (Default) + High + Max + + + + Rotation of gyro 3 relative to airframe + An internal sensor will force a value of -1, so a GCS should only attempt to configure the rotation if the value is greater than or equal to zero. + -1 + 40 + true + + Internal + No rotation + Yaw 45° + Yaw 90° + Yaw 135° + Yaw 180° + Yaw 225° + Yaw 270° + Yaw 315° + Roll 180° + Roll 180°, Yaw 45° + Roll 180°, Yaw 90° + Roll 180°, Yaw 135° + Pitch 180° + Roll 180°, Yaw 225° + Roll 180°, Yaw 270° + Roll 180°, Yaw 315° + Roll 90° + Roll 90°, Yaw 45° + Roll 90°, Yaw 90° + Roll 90°, Yaw 135° + Roll 270° + Roll 270°, Yaw 45° + Roll 270°, Yaw 90° + Roll 270°, Yaw 135° + Pitch 90° + Pitch 270° + Pitch 180°, Yaw 90° + Pitch 180°, Yaw 270° + Roll 90°, Pitch 90° + Roll 180°, Pitch 90° + Roll 270°, Pitch 90° + Roll 90°, Pitch 180° + Roll 270°, Pitch 180° + Roll 90°, Pitch 270° + Roll 180°, Pitch 270° + Roll 270°, Pitch 270° + Roll 90°, Pitch 180°, Yaw 90° + Roll 90°, Yaw 270° + Roll 90°, Pitch 68°, Yaw 293° + Pitch 315° + Roll 90°, Pitch 315° + + + + Gyroscope calibration temperature + Temperature during last calibration. + celcius + + + Gyro X-axis offset + + + Gyro Y-axis offset + + + Gyro Z-axis offset + + + ID of Magnetometer the calibration is for + + + Mag 0 priority + + Uninitialized + Disabled + Min + Low + Medium (Default) + High + Max + + + + Rotation of magnetometer 0 relative to airframe + An internal sensor will force a value of -1, so a GCS should only attempt to configure the rotation if the value is greater than or equal to zero. + -1 + 40 + true + + Internal + No rotation + Yaw 45° + Yaw 90° + Yaw 135° + Yaw 180° + Yaw 225° + Yaw 270° + Yaw 315° + Roll 180° + Roll 180°, Yaw 45° + Roll 180°, Yaw 90° + Roll 180°, Yaw 135° + Pitch 180° + Roll 180°, Yaw 225° + Roll 180°, Yaw 270° + Roll 180°, Yaw 315° + Roll 90° + Roll 90°, Yaw 45° + Roll 90°, Yaw 90° + Roll 90°, Yaw 135° + Roll 270° + Roll 270°, Yaw 45° + Roll 270°, Yaw 90° + Roll 270°, Yaw 135° + Pitch 90° + Pitch 270° + Pitch 180°, Yaw 90° + Pitch 180°, Yaw 270° + Roll 90°, Pitch 90° + Roll 180°, Pitch 90° + Roll 270°, Pitch 90° + Roll 90°, Pitch 180° + Roll 270°, Pitch 180° + Roll 90°, Pitch 270° + Roll 180°, Pitch 270° + Roll 270°, Pitch 270° + Roll 90°, Pitch 180°, Yaw 90° + Roll 90°, Yaw 270° + Roll 90°, Pitch 68°, Yaw 293° + Pitch 315° + Roll 90°, Pitch 315° + + + + Magnetometer calibration temperature + Temperature during last calibration. + celcius + + + X Axis throttle compensation for Mag 0 + Coefficient describing linear relationship between X component of magnetometer in body frame axis and either current or throttle depending on value of CAL_MAG_COMP_TYP. Unit for throttle-based compensation is [G] and for current-based compensation [G/kA] + + + Magnetometer X-axis off diagonal factor + + + Magnetometer X-axis offset + + + Magnetometer X-axis scaling factor + + + Y Axis throttle compensation for Mag 0 + Coefficient describing linear relationship between Y component of magnetometer in body frame axis and either current or throttle depending on value of CAL_MAG_COMP_TYP. Unit for throttle-based compensation is [G] and for current-based compensation [G/kA] + + + Magnetometer Y-axis off diagonal factor + + + Magnetometer Y-axis offset + + + Magnetometer Y-axis scaling factor + + + Z Axis throttle compensation for Mag 0 + Coefficient describing linear relationship between Z component of magnetometer in body frame axis and either current or throttle depending on value of CAL_MAG_COMP_TYP. Unit for throttle-based compensation is [G] and for current-based compensation [G/kA] + + + Magnetometer Z-axis off diagonal factor + + + Magnetometer Z-axis offset + + + Magnetometer Z-axis scaling factor + + + ID of Magnetometer the calibration is for + + + Mag 1 priority + + Uninitialized + Disabled + Min + Low + Medium (Default) + High + Max + + + + Rotation of magnetometer 1 relative to airframe + An internal sensor will force a value of -1, so a GCS should only attempt to configure the rotation if the value is greater than or equal to zero. + -1 + 40 + true + + Internal + No rotation + Yaw 45° + Yaw 90° + Yaw 135° + Yaw 180° + Yaw 225° + Yaw 270° + Yaw 315° + Roll 180° + Roll 180°, Yaw 45° + Roll 180°, Yaw 90° + Roll 180°, Yaw 135° + Pitch 180° + Roll 180°, Yaw 225° + Roll 180°, Yaw 270° + Roll 180°, Yaw 315° + Roll 90° + Roll 90°, Yaw 45° + Roll 90°, Yaw 90° + Roll 90°, Yaw 135° + Roll 270° + Roll 270°, Yaw 45° + Roll 270°, Yaw 90° + Roll 270°, Yaw 135° + Pitch 90° + Pitch 270° + Pitch 180°, Yaw 90° + Pitch 180°, Yaw 270° + Roll 90°, Pitch 90° + Roll 180°, Pitch 90° + Roll 270°, Pitch 90° + Roll 90°, Pitch 180° + Roll 270°, Pitch 180° + Roll 90°, Pitch 270° + Roll 180°, Pitch 270° + Roll 270°, Pitch 270° + Roll 90°, Pitch 180°, Yaw 90° + Roll 90°, Yaw 270° + Roll 90°, Pitch 68°, Yaw 293° + Pitch 315° + Roll 90°, Pitch 315° + + + + Magnetometer calibration temperature + Temperature during last calibration. + celcius + + + X Axis throttle compensation for Mag 1 + Coefficient describing linear relationship between X component of magnetometer in body frame axis and either current or throttle depending on value of CAL_MAG_COMP_TYP. Unit for throttle-based compensation is [G] and for current-based compensation [G/kA] + + + Magnetometer X-axis off diagonal factor + + + Magnetometer X-axis offset + + + Magnetometer X-axis scaling factor + + + Y Axis throttle compensation for Mag 1 + Coefficient describing linear relationship between Y component of magnetometer in body frame axis and either current or throttle depending on value of CAL_MAG_COMP_TYP. Unit for throttle-based compensation is [G] and for current-based compensation [G/kA] + + + Magnetometer Y-axis off diagonal factor + + + Magnetometer Y-axis offset + + + Magnetometer Y-axis scaling factor + + + Z Axis throttle compensation for Mag 1 + Coefficient describing linear relationship between Z component of magnetometer in body frame axis and either current or throttle depending on value of CAL_MAG_COMP_TYP. Unit for throttle-based compensation is [G] and for current-based compensation [G/kA] + + + Magnetometer Z-axis off diagonal factor + + + Magnetometer Z-axis offset + + + Magnetometer Z-axis scaling factor + + + ID of Magnetometer the calibration is for + + + Mag 2 priority + + Uninitialized + Disabled + Min + Low + Medium (Default) + High + Max + + + + Rotation of magnetometer 2 relative to airframe + An internal sensor will force a value of -1, so a GCS should only attempt to configure the rotation if the value is greater than or equal to zero. + -1 + 40 + true + + Internal + No rotation + Yaw 45° + Yaw 90° + Yaw 135° + Yaw 180° + Yaw 225° + Yaw 270° + Yaw 315° + Roll 180° + Roll 180°, Yaw 45° + Roll 180°, Yaw 90° + Roll 180°, Yaw 135° + Pitch 180° + Roll 180°, Yaw 225° + Roll 180°, Yaw 270° + Roll 180°, Yaw 315° + Roll 90° + Roll 90°, Yaw 45° + Roll 90°, Yaw 90° + Roll 90°, Yaw 135° + Roll 270° + Roll 270°, Yaw 45° + Roll 270°, Yaw 90° + Roll 270°, Yaw 135° + Pitch 90° + Pitch 270° + Pitch 180°, Yaw 90° + Pitch 180°, Yaw 270° + Roll 90°, Pitch 90° + Roll 180°, Pitch 90° + Roll 270°, Pitch 90° + Roll 90°, Pitch 180° + Roll 270°, Pitch 180° + Roll 90°, Pitch 270° + Roll 180°, Pitch 270° + Roll 270°, Pitch 270° + Roll 90°, Pitch 180°, Yaw 90° + Roll 90°, Yaw 270° + Roll 90°, Pitch 68°, Yaw 293° + Pitch 315° + Roll 90°, Pitch 315° + + + + Magnetometer calibration temperature + Temperature during last calibration. + celcius + + + X Axis throttle compensation for Mag 2 + Coefficient describing linear relationship between X component of magnetometer in body frame axis and either current or throttle depending on value of CAL_MAG_COMP_TYP. Unit for throttle-based compensation is [G] and for current-based compensation [G/kA] + + + Magnetometer X-axis off diagonal factor + + + Magnetometer X-axis offset + + + Magnetometer X-axis scaling factor + + + Y Axis throttle compensation for Mag 2 + Coefficient describing linear relationship between Y component of magnetometer in body frame axis and either current or throttle depending on value of CAL_MAG_COMP_TYP. Unit for throttle-based compensation is [G] and for current-based compensation [G/kA] + + + Magnetometer Y-axis off diagonal factor + + + Magnetometer Y-axis offset + + + Magnetometer Y-axis scaling factor + + + Z Axis throttle compensation for Mag 2 + Coefficient describing linear relationship between Z component of magnetometer in body frame axis and either current or throttle depending on value of CAL_MAG_COMP_TYP. Unit for throttle-based compensation is [G] and for current-based compensation [G/kA] + + + Magnetometer Z-axis off diagonal factor + + + Magnetometer Z-axis offset + + + Magnetometer Z-axis scaling factor + + + ID of Magnetometer the calibration is for + + + Mag 3 priority + + Uninitialized + Disabled + Min + Low + Medium (Default) + High + Max + + + + Rotation of magnetometer 3 relative to airframe + An internal sensor will force a value of -1, so a GCS should only attempt to configure the rotation if the value is greater than or equal to zero. + -1 + 40 + true + + Internal + No rotation + Yaw 45° + Yaw 90° + Yaw 135° + Yaw 180° + Yaw 225° + Yaw 270° + Yaw 315° + Roll 180° + Roll 180°, Yaw 45° + Roll 180°, Yaw 90° + Roll 180°, Yaw 135° + Pitch 180° + Roll 180°, Yaw 225° + Roll 180°, Yaw 270° + Roll 180°, Yaw 315° + Roll 90° + Roll 90°, Yaw 45° + Roll 90°, Yaw 90° + Roll 90°, Yaw 135° + Roll 270° + Roll 270°, Yaw 45° + Roll 270°, Yaw 90° + Roll 270°, Yaw 135° + Pitch 90° + Pitch 270° + Pitch 180°, Yaw 90° + Pitch 180°, Yaw 270° + Roll 90°, Pitch 90° + Roll 180°, Pitch 90° + Roll 270°, Pitch 90° + Roll 90°, Pitch 180° + Roll 270°, Pitch 180° + Roll 90°, Pitch 270° + Roll 180°, Pitch 270° + Roll 270°, Pitch 270° + Roll 90°, Pitch 180°, Yaw 90° + Roll 90°, Yaw 270° + Roll 90°, Pitch 68°, Yaw 293° + Pitch 315° + Roll 90°, Pitch 315° + + + + Magnetometer calibration temperature + Temperature during last calibration. + celcius + + + X Axis throttle compensation for Mag 3 + Coefficient describing linear relationship between X component of magnetometer in body frame axis and either current or throttle depending on value of CAL_MAG_COMP_TYP. Unit for throttle-based compensation is [G] and for current-based compensation [G/kA] + + + Magnetometer X-axis off diagonal factor + + + Magnetometer X-axis offset + + + Magnetometer X-axis scaling factor + + + Y Axis throttle compensation for Mag 3 + Coefficient describing linear relationship between Y component of magnetometer in body frame axis and either current or throttle depending on value of CAL_MAG_COMP_TYP. Unit for throttle-based compensation is [G] and for current-based compensation [G/kA] + + + Magnetometer Y-axis off diagonal factor + + + Magnetometer Y-axis offset + + + Magnetometer Y-axis scaling factor + + + Z Axis throttle compensation for Mag 3 + Coefficient describing linear relationship between Z component of magnetometer in body frame axis and either current or throttle depending on value of CAL_MAG_COMP_TYP. Unit for throttle-based compensation is [G] and for current-based compensation [G/kA] + + + Magnetometer Z-axis off diagonal factor + + + Magnetometer Z-axis offset + + + Magnetometer Z-axis scaling factor + Type of magnetometer compensation @@ -7840,23 +8421,23 @@ Differential pressure sensor offset The offset (zero-reading) in Pascal - + Maximum height above ground when reliant on optical flow This parameter defines the maximum distance from ground at which the optical flow sensor operates reliably. The height setpoint will be limited to be no greater than this value when the navigation system is completely reliant on optical flow data and the height above ground estimate is valid. The sensor may be usable above this height, but accuracy will progressively degrade. 1.0 - 100.0 + 25.0 m 1 0.1 - + Magnitude of maximum angular flow rate reliably measurable by the optical flow sensor Optical flow data will not fused by the estimators if the magnitude of the flow rate exceeds this value and control loops will be instructed to limit ground speed such that the flow rate produced by movement over ground is less than 50% of this value. 1.0 rad/s 2 - + Minimum height above ground when reliant on optical flow This parameter defines the minimum distance from ground at which the optical flow sensor operates reliably. The sensor may be usable below this height, but accuracy will progressively reduce to loss of focus. 0.0 @@ -7867,11 +8448,6 @@ - - Enable external ADS1115 ADC - If enabled, the internal ADC is not used. - true - Capacity/current multiplier for high-current capable SMBUS battery 1 @@ -7926,9 +8502,20 @@ 2.00 m - - For legacy QGC support only - Use SENS_MAG_SIDES instead + + Automatically set external rotations + During calibration attempt to automatically determine the rotation of external magnetometers. + + + Bitfield selecting mag sides for calibration + If set to two side calibration, only the offsets are estimated, the scale calibration is left unchanged. Thus an initial six side calibration is recommended. Bits: ORIENTATION_TAIL_DOWN = 1 ORIENTATION_NOSE_DOWN = 2 ORIENTATION_LEFT = 4 ORIENTATION_RIGHT = 8 ORIENTATION_UPSIDE_DOWN = 16 ORIENTATION_RIGHTSIDE_UP = 32 + 34 + 63 + + Two side calibration + Three side calibration + Six side calibration + Low pass filter cutoff frequency for accel @@ -7963,7 +8550,6 @@ Bandwidth per notch filter when using dynamic notch filtering with ESC RPM. 5 30 - Hz IMU gyro dynamic notch filtering @@ -7975,17 +8561,6 @@ FFT - - IMU gyro dynamic notch filter harmonics - ESC RPM number of harmonics (multiples of RPM) for ESC RPM dynamic notch filtering. - 1 - 7 - - - IMU gyro dynamic notch filter minimum frequency - Minimum notch filter frequency in Hz. - Hz - IMU gyro FFT enable true @@ -8020,33 +8595,17 @@ 1 30 - + Notch filter bandwidth for gyro - The frequency width of the stop band for the 2nd order notch filter on the primary gyro. See "IMU_GYRO_NF0_FRQ" to activate the filter and to set the notch frequency. Applies to both angular velocity and angular acceleration sent to the controllers. + The frequency width of the stop band for the 2nd order notch filter on the primary gyro. See "IMU_GYRO_NF_FREQ" to activate the filter and to set the notch frequency. Applies to both angular velocity and angular acceleration sent to the controllers. 0 100 Hz true - + Notch filter frequency for gyro - The center frequency for the 2nd order notch filter on the primary gyro. This filter can be enabled to avoid feedback amplification of structural resonances at a specific frequency. This only affects the signal sent to the controllers, not the estimators. Applies to both angular velocity and angular acceleration sent to the controllers. See "IMU_GYRO_NF0_BW" to set the bandwidth of the filter. A value of 0 disables the filter. - 0 - 1000 - Hz - true - - - Notch filter 1 bandwidth for gyro - The frequency width of the stop band for the 2nd order notch filter on the primary gyro. See "IMU_GYRO_NF1_FRQ" to activate the filter and to set the notch frequency. Applies to both angular velocity and angular acceleration sent to the controllers. - 0 - 100 - Hz - true - - - Notch filter 2 frequency for gyro - The center frequency for the 2nd order notch filter on the primary gyro. This filter can be enabled to avoid feedback amplification of structural resonances at a specific frequency. This only affects the signal sent to the controllers, not the estimators. Applies to both angular velocity and angular acceleration sent to the controllers. See "IMU_GYRO_NF1_BW" to set the bandwidth of the filter. A value of 0 disables the filter. + The center frequency for the 2nd order notch filter on the primary gyro. This filter can be enabled to avoid feedback amplification of structural resonances at a specific frequency. This only affects the signal sent to the controllers, not the estimators. Applies to both angular velocity and angular acceleration sent to the controllers. See "IMU_GYRO_NF_BW" to set the bandwidth of the filter. A value of 0 disables the filter. 0 1000 Hz @@ -8082,41 +8641,6 @@ 400 Hz - - INA220 Power Monitor Config - 0 - 65535 - 1 - 1 - - - INA220 Power Monitor Battery Max Current - 0.1 - 500.0 - 2 - 0.1 - - - INA220 Power Monitor Regulator Max Current - 0.1 - 500.0 - 2 - 0.1 - - - INA220 Power Monitor Battery Shunt - 0.000000001 - 0.1 - 10 - .000000001 - - - INA220 Power Monitor Regulator Shunt - 0.000000001 - 0.1 - 10 - .000000001 - INA226 Power Monitor Config 0 @@ -8173,6 +8697,14 @@ 10 .000000001 + + PCF8583 rotorfreq (i2c) i2c address + true + + Address 0x50 (80) + Address 0x51 (81) + + PCF8583 rotorfreq (i2c) pulse count Nmumber of signals per rotation of actuator @@ -8187,60 +8719,23 @@ PCF8583 rotorfreq (i2c) pulse reset value - Internal device counter is reset to 0 when overrun this value, counter is able to store up to 6 digits reset of counter takes some time - measurement with reset has worse accuracy. 0 means reset counter after every measurement. + Internal device counter is reset to 0 when overun this value, counter is able to store upto 6 digits reset of counter takes some time - measurement with reset has worse accurancy. 0 means reset counter after every measurement. true - - AFBR Rangefinder Short/Long Range Threshold Hysteresis - This parameter defines the hysteresis for switching between short and long range mode. - 1 - 10 - m - - - AFBR Rangefinder Long Range Rate - This parameter defines measurement rate of the AFBR Rangefinder in long range mode. - 1 - 100 - - - AFBR Rangefinder Mode - This parameter defines the mode of the AFBR Rangefinder. - 0 - 3 - true - - Short Range Mode - Long Range Mode - High Speed Short Range Mode - High Speed Long Range Mode - - - - AFBR Rangefinder Short Range Rate - This parameter defines measurement rate of the AFBR Rangefinder in short range mode. - 1 - 100 - - - AFBR Rangefinder Short/Long Range Threshold - This parameter defines the threshold for switching between short and long range mode. The mode will switch from short to long range when the distance is greater than the threshold plus the hysteresis. The mode will switch from long to short range when the distance is less than the threshold minus the hysteresis. - 1 - 50 - m - QNH for barometer 500 1500 hPa + true Baro max rate - Barometric air data maximum publication rate. This is an upper bound, actual barometric data rate is still dependent on the sensor. + Barometric air data maximum publication rate. This is an upper bound, actual barometric data rate is still dependant on the sensor. 1 200 Hz + true Board rotation @@ -8317,34 +8812,6 @@ Enabled - - Analog Devices ADIS16507 IMU (external SPI) - true - - - Enable simulated airspeed sensor instance - 0 - 1 - true - - Disabled - Enabled - - - - ASP5033 differential pressure sensor (external I2C) - true - - - Enable simulated barometer sensor instance - 0 - 1 - true - - Disabled - Enabled - - SMBUS Smart battery driver BQ40Z50 and BQ40Z80 true @@ -8353,21 +8820,6 @@ Eagle Tree airspeed sensor (external I2C) true - - Enable simulated GPS sinstance - 0 - 1 - true - - Disabled - Enabled - - - - Enable INA220 Power Monitor - For systems a INA220 Power Monitor, this should be set to true - true - Enable INA226 Power Monitor For systems a INA226 Power Monitor, this should be set to true @@ -8383,10 +8835,6 @@ For systems a INA238 Power Monitor, this should be set to true true - - IR-LOCK Sensor (external I2C) - true - Lidar-Lite (LL40LS) 0 @@ -8398,16 +8846,6 @@ I2C - - Enable simulated magnetometer sensor instance - 0 - 1 - true - - Disabled - Enabled - - Maxbotix Sonar (mb12xx) true @@ -8422,37 +8860,18 @@ Autodetect - - TE MS4515 differential pressure sensor (external I2C) + + TE MS4525 differential pressure sensor (external I2C) true - - TE MS4525DO differential pressure sensor (external I2C) - true - - - TE MS5525DSO differential pressure sensor (external I2C) - true - - - PAA3905 Optical Flow + + TE MS5525 differential pressure sensor (external I2C) true - PAW3902/PAW3903 Optical Flow + PAW3902 & PAW3903 Optical Flow true - - PCF8583 eneable driver - Run PCF8583 driver automatically - 0 - 1 - true - - Disabled - Eneabled - - PGA460 Ultrasonic driver (PGA460) true @@ -8496,25 +8915,12 @@ SF11/c SF/LW20/b SF/LW20/c - SF/LW30/d - - SHT3x temperature and hygrometer - true - - - Goertek SPL06 Barometer (external I2C) - true - HY-SRF05 / HC-SR05 true - - TF02 Pro Distance Sensor (i2c) - true - Thermal control of sensor temperature @@ -8537,10 +8943,6 @@ TREvo3m - - VL53L0X Distance Sensor - true - VL53L1X Distance Sensor true @@ -8549,17 +8951,10 @@ External I2C probe Probe for optional external I2C devices. - - Optical flow max rate - Optical flow data maximum publication rate. This is an upper bound, actual optical flow data rate is still dependent on the sensor. - 1 - 200 - Hz + + PX4Flow board rotation + This parameter defines the yaw rotation of the PX4FLOW board relative to the vehicle body frame. Zero rotation is defined as X on flow board pointing towards front of vehicle. The recommneded installation default for the PX4FLOW board is with the Y axis forward (270 deg yaw). true - - - Optical flow rotation - This parameter defines the yaw rotation of the optical flow relative to the vehicle body frame. Zero rotation is defined as X on flow board pointing towards front of vehicle. No rotation Yaw 45° @@ -8571,7 +8966,7 @@ Yaw 315° - + Multi GPS Blending Control Mask Set bits in the following positions to set which GPS accuracy metrics will be used to calculate the blending weight. Set to zero to disable and always used first GPS instance. 0 : Set to true to use speed accuracy 1 : Set to true to use horizontal position accuracy 2 : Set to true to use vertical position accuracy 0 @@ -8596,14 +8991,6 @@ s 1 - - IMU auto calibration - Automatically initialize IMU (accel/gyro) calibration from bias estimates if available. - - - IMU notify clipping - Notify the user if the IMU is clipping - Sensors hub IMU mode true @@ -8645,14 +9032,10 @@ For systems with an external barometer, this should be set to false to make sure that the external is used. true - + Magnetometer auto calibration Automatically initialize magnetometer calibration from bias estimate if available. - - Automatically set external rotations - During calibration attempt to automatically determine the rotation of external magnetometers. - Sensors hub mag mode true @@ -8661,25 +9044,14 @@ Publish primary magnetometer - + Magnetometer max rate - Magnetometer data maximum publication rate. This is an upper bound, actual magnetometer data rate is still dependent on the sensor. + Magnetometer data maximum publication rate. This is an upper bound, actual magnetometer data rate is still dependant on the sensor. 1 200 Hz true - - Bitfield selecting mag sides for calibration - If set to two side calibration, only the offsets are estimated, the scale calibration is left unchanged. Thus an initial six side calibration is recommended. Bits: ORIENTATION_TAIL_DOWN = 1 ORIENTATION_NOSE_DOWN = 2 ORIENTATION_LEFT = 4 ORIENTATION_RIGHT = 8 ORIENTATION_UPSIDE_DOWN = 16 ORIENTATION_RIGHTSIDE_UP = 32 - 34 - 63 - - Two side calibration - Three side calibration - Six side calibration - - MaxBotix MB12XX Sensor 0 Rotation This parameter defines the rotation of the sensor relative to the platform. @@ -9101,16 +9473,6 @@ Target IMU device ID to regulate temperature - - Dynamically simulate failure of airspeed sensor instance - 0 - 1 - true - - Disabled - Enabled - - VOXL Power Monitor Shunt, Battery 0.000000001 @@ -9128,31 +9490,14 @@ true - - - MXS Serial Communication Baud rate - Baudrate for the Serial Port connected to the MXS Transponder - 0 - 10 - true - - 38400 - 600 - 4800 - 9600 - RESERVED - 57600 - 115200 - 230400 - 19200 - 460800 - 921600 - - - + + Barometer offset in meters + Absolute value superior to 10000 will disable barometer + m + - distance sensor maximum range + distance sensor maximun range 0.0 1000.0 m @@ -9160,7 +9505,7 @@ 0.01 - distance sensor minimum range + distance sensor minimun range 0.0 10.0 m @@ -9168,13 +9513,18 @@ 0.01 - if >= 0 the distance sensor measures will be overridden by this value + if >= 0 the distance sensor measures will be overrided by this value Absolute value superior to 10000 will disable distance sensor m + + Number of GPS satellites used + 0 + 50 + Vehicle inertia about X axis - The inertia is a 3 by 3 symmetric matrix. It represents the difficulty of the vehicle to modify its angular rate. + The intertia is a 3 by 3 symmetric matrix. It represents the difficulty of the vehicle to modify its angular rate. 0.0 kg m^2 3 @@ -9182,21 +9532,21 @@ Vehicle cross term inertia xy - The inertia is a 3 by 3 symmetric matrix. This value can be set to 0 for a quad symmetric about its center of mass. + The intertia is a 3 by 3 symmetric matrix. This value can be set to 0 for a quad symmetric about its center of mass. kg m^2 3 0.005 Vehicle cross term inertia xz - The inertia is a 3 by 3 symmetric matrix. This value can be set to 0 for a quad symmetric about its center of mass. + The intertia is a 3 by 3 symmetric matrix. This value can be set to 0 for a quad symmetric about its center of mass. kg m^2 3 0.005 Vehicle inertia about Y axis - The inertia is a 3 by 3 symmetric matrix. It represents the difficulty of the vehicle to modify its angular rate. + The intertia is a 3 by 3 symmetric matrix. It represents the difficulty of the vehicle to modify its angular rate. 0.0 kg m^2 3 @@ -9204,14 +9554,14 @@ Vehicle cross term inertia yz - The inertia is a 3 by 3 symmetric matrix. This value can be set to 0 for a quad symmetric about its center of mass. + The intertia is a 3 by 3 symmetric matrix. This value can be set to 0 for a quad symmetric about its center of mass. kg m^2 3 0.005 Vehicle inertia about Z axis - The inertia is a 3 by 3 symmetric matrix. It represents the difficulty of the vehicle to modify its angular rate. + The intertia is a 3 by 3 symmetric matrix. It represents the difficulty of the vehicle to modify its angular rate. 0.0 kg m^2 3 @@ -9256,6 +9606,33 @@ 1800000000 deg*1e7 + + North magnetic field at the initial location + This value represents the North magnetic field at the initial location. A magnetic field calculator can be found on the NOAA website Note, the values need to be converted from nano Tesla to Gauss LAT0, LON0, H0, MU_X, MU_Y, and MU_Z should ideally be consistent among each others to represent a physical ground location on Earth. + -1.0 + 1.0 + gauss + 2 + 0.001 + + + East magnetic field at the initial location + This value represents the East magnetic field at the initial location. A magnetic field calculator can be found on the NOAA website Note, the values need to be converted from nano Tesla to Gauss LAT0, LON0, H0, MU_X, MU_Y, and MU_Z should ideally be consistent among each others to represent a physical ground location on Earth. + -1.0 + 1.0 + gauss + 2 + 0.001 + + + Down magnetic field at the initial location + This value represents the Down magnetic field at the initial location. A magnetic field calculator can be found on the NOAA website Note, the values need to be converted from nano Tesla to Gauss LAT0, LON0, H0, MU_X, MU_Y, and MU_Z should ideally be consistent among each others to represent a physical ground location on Earth. + -1.0 + 1.0 + gauss + 2 + 0.001 + Pitch arm length This is the arm length generating the pitching moment This value can be measured with a ruler. This corresponds to half the distance between the front and rear motors. @@ -9272,6 +9649,21 @@ 2 0.05 + + magnetometer X offset in Gauss + Absolute value superior to 10000 will disable magnetometer + gauss + + + magnetometer Y offset in Gauss + Absolute value superior to 10000 will disable magnetometer + gauss + + + magnetometer Z offset in Gauss + Absolute value superior to 10000 will disable magnetometer + gauss + Vehicle mass This value can be measured by weighting the quad on a scale. @@ -9305,9 +9697,8 @@ Vehicle type true - Multicopter - Fixed-Wing - Tailsitter + MC + FW @@ -9317,25 +9708,12 @@ simulated barometer temperature offset - celcius simulated GPS number of satellites used 0 50 - - simulator origin altitude - m - - - simulator origin latitude - deg - - - simulator origin longitude - deg - simulated magnetometer X offset gauss @@ -9390,7 +9768,7 @@ Required temperature rise during thermal calibration - A temperature increase greater than this value is required during calibration. Calibration will complete for each sensor when the temperature increase above the starting temperature exceeds the value set by SYS_CAL_TDEL. If the temperature rise is insufficient, the calibration will continue indefinitely and the board will need to be repowered to exit. + A temperature increase greater than this value is required during calibration. Calibration will complete for each sensor when the temperature increase above the starting temeprature exceeds the value set by SYS_CAL_TDEL. If the temperature rise is insufficient, the calibration will continue indefinitely and the board will need to be repowered to exit. 10 celcius @@ -9404,6 +9782,11 @@ Temperature calibration for each sensor will ignore data if the temperature is lower than the value set by SYS_CAL_TMIN. celcius + + Enable Dynamic Control Allocation + If disabled, the existing mixing implementation is used. If enabled, dynamic control allocation with runtime configuration of the mixing and output functions is used. Note: this is work-in-progress and not all vehicle types are supported yet. + true + Dataman storage backend true @@ -9413,14 +9796,9 @@ RAM (not persistent) - + Enable factory calibration mode If enabled, future sensor calibrations will be stored to /fs/mtd_caldata. Note: this is only supported on boards with a separate calibration storage /fs/mtd_caldata. - - Disabled - All sensors - All sensors except mag - Enable failure injection @@ -9436,17 +9814,11 @@ Disable this if the system has no GPS. If disabled, the sensors hub will not process sensor_gps, and GPS will not be available for the rest of the system. true - + Control if the vehicle has a magnetometer - Set this to 0 if the board has no magnetometer. If set to 0, the preflight checks will not check for the presence of a magnetometer, otherwise N sensors are required. + Disable this if the board has no magnetometer, such as the Omnibus F4 SD. If disabled, the preflight checks will not check for the presence of a magnetometer. true - - Number of distance sensors to check being available - The preflight check will fail if fewer than this number of distance sensors with valid data is present. Disable the check with 0. - 0 - 4 - Enable HITL/SIH mode on next boot While enabled the system will boot in Hardware-In-The-Loop (HITL) or Simulation-In-Hardware (SIH) mode and not enable all sensors and checks. When disabled the same vehicle can be flown normally. Set to 'external HITL', if the system should perform as if it were a real vehicle (the only difference to a real system is then only the parameter value, which can be used for log analysis). @@ -9476,6 +9848,15 @@ Enable stack checking + + Set usage of IO board + Can be used to use a configure the use of the IO board. + true + + IO PWM disabled (RC only) + IO enabled (RC & PWM) + + @@ -10057,234 +10438,6 @@ Thermal compensation for rate gyro sensors true - - ID of Magnetometer that the calibration is for - - - Magnetometer calibration maximum temperature - - - Magnetometer calibration minimum temperature - - - Magnetometer calibration reference temperature - - - Magnetometer offset temperature ^0 polynomial coefficient - X axis - - - Magnetometer offset temperature ^0 polynomial coefficient - Y axis - - - Magnetometer offset temperature ^0 polynomial coefficient - Z axis - - - Magnetometer offset temperature ^1 polynomial coefficient - X axis - - - Magnetometer offset temperature ^1 polynomial coefficient - Y axis - - - Magnetometer offset temperature ^1 polynomial coefficient - Z axis - - - Magnetometer offset temperature ^2 polynomial coefficient - X axis - - - Magnetometer offset temperature ^2 polynomial coefficient - Y axis - - - Magnetometer offset temperature ^2 polynomial coefficient - Z axis - - - Magnetometer offset temperature ^3 polynomial coefficient - X axis - - - Magnetometer offset temperature ^3 polynomial coefficient - Y axis - - - Magnetometer offset temperature ^3 polynomial coefficient - Z axis - - - ID of Magnetometer that the calibration is for - - - Magnetometer calibration maximum temperature - - - Magnetometer calibration minimum temperature - - - Magnetometer calibration reference temperature - - - Magnetometer offset temperature ^0 polynomial coefficient - X axis - - - Magnetometer offset temperature ^0 polynomial coefficient - Y axis - - - Magnetometer offset temperature ^0 polynomial coefficient - Z axis - - - Magnetometer offset temperature ^1 polynomial coefficient - X axis - - - Magnetometer offset temperature ^1 polynomial coefficient - Y axis - - - Magnetometer offset temperature ^1 polynomial coefficient - Z axis - - - Magnetometer offset temperature ^2 polynomial coefficient - X axis - - - Magnetometer offset temperature ^2 polynomial coefficient - Y axis - - - Magnetometer offset temperature ^2 polynomial coefficient - Z axis - - - Magnetometer offset temperature ^3 polynomial coefficient - X axis - - - Magnetometer offset temperature ^3 polynomial coefficient - Y axis - - - Magnetometer offset temperature ^3 polynomial coefficient - Z axis - - - ID of Magnetometer that the calibration is for - - - Magnetometer calibration maximum temperature - - - Magnetometer calibration minimum temperature - - - Magnetometer calibration reference temperature - - - Magnetometer offset temperature ^0 polynomial coefficient - X axis - - - Magnetometer offset temperature ^0 polynomial coefficient - Y axis - - - Magnetometer offset temperature ^0 polynomial coefficient - Z axis - - - Magnetometer offset temperature ^1 polynomial coefficient - X axis - - - Magnetometer offset temperature ^1 polynomial coefficient - Y axis - - - Magnetometer offset temperature ^1 polynomial coefficient - Z axis - - - Magnetometer offset temperature ^2 polynomial coefficient - X axis - - - Magnetometer offset temperature ^2 polynomial coefficient - Y axis - - - Magnetometer offset temperature ^2 polynomial coefficient - Z axis - - - Magnetometer offset temperature ^3 polynomial coefficient - X axis - - - Magnetometer offset temperature ^3 polynomial coefficient - Y axis - - - Magnetometer offset temperature ^3 polynomial coefficient - Z axis - - - ID of Magnetometer that the calibration is for - - - Magnetometer calibration maximum temperature - - - Magnetometer calibration minimum temperature - - - Magnetometer calibration reference temperature - - - Magnetometer offset temperature ^0 polynomial coefficient - X axis - - - Magnetometer offset temperature ^0 polynomial coefficient - Y axis - - - Magnetometer offset temperature ^0 polynomial coefficient - Z axis - - - Magnetometer offset temperature ^1 polynomial coefficient - X axis - - - Magnetometer offset temperature ^1 polynomial coefficient - Y axis - - - Magnetometer offset temperature ^1 polynomial coefficient - Z axis - - - Magnetometer offset temperature ^2 polynomial coefficient - X axis - - - Magnetometer offset temperature ^2 polynomial coefficient - Y axis - - - Magnetometer offset temperature ^2 polynomial coefficient - Z axis - - - Magnetometer offset temperature ^3 polynomial coefficient - X axis - - - Magnetometer offset temperature ^3 polynomial coefficient - Y axis - - - Magnetometer offset temperature ^3 polynomial coefficient - Z axis - - - Thermal compensation for magnetometer sensors - true - - - - - Sagetech External Configuration Mode - Disables auto-configuration mode enabling MXS config through external software. - true - - - Sagetech MXS mode configuration - This parameter defines the operating mode of the MXS - 0 - 3 - false - - Off - On - Standby - Alt - - - - Sagetech MXS Participant Configuration - The MXS communication port to receive Target data from - 0 - 2 - false - - Auto - COM0 - COM1 - - @@ -10292,27 +10445,31 @@ 20000 1000000 - - Enable MovingBaselineData publication + + Cannode flow board rotation + This parameter defines the yaw rotation of the Cannode flow board relative to the vehicle body frame. Zero rotation is defined as X on flow board pointing towards front of vehicle. true + + No rotation + Yaw 45° + Yaw 90° + Yaw 135° + Yaw 180° + Yaw 225° + Yaw 270° + Yaw 315° + - - Enable MovingBaselineData subscription - 1 - true - - - Enable RTCM subscription - true + + UAVCAN Node ID + Read the specs at http://uavcan.org to learn more about Node ID. + 1 + 125 CAN built-in bus termination 1 - - Simulator Gazebo bridge enable - true - UAVCAN CAN bus bitrate 20000 @@ -10333,6 +10490,10 @@ Sensors and Actuators (ESCs) Automatic Config + + UAVCAN ESC will spin at idle throttle when armed, even if the mixer outputs zero setpoints + true + UAVCAN ANTI_COLLISION light operating mode This parameter defines the minimum condition under which the system will command the ANTI_COLLISION lights on 0 - Always off 1 - When autopilot is armed 2 - When autopilot is prearmed 3 - Always on @@ -10392,21 +10553,6 @@ 125 true - - publish Arming Status stream - Enable UAVCAN Arming Status stream publication uavcan::equipment::safety::ArmingStatus - true - - - publish moving baseline data RTCM stream - Enable UAVCAN RTCM stream publication ardupilot::gnss::MovingBaselineData - true - - - publish RTCM stream - Enable UAVCAN RTCM stream publication uavcan::equipment::gnss::RTCMStream - true - UAVCAN rangefinder maximum range This parameter defines the maximum valid range for a rangefinder connected via UAVCAN. @@ -10429,21 +10575,16 @@ subscription battery - Enable UAVCAN battery subscription. uavcan::equipment::power::BatteryInfo ardupilot::equipment::power::BatteryInfoAux 0 - Disable 1 - Use raw data. Recommended for Smart battery 2 - Filter the data with internal battery library + Enable UAVCAN battery subscription. 1) uavcan::equipment::power::BatteryInfo 2) cuav::equipment::power::CBAT 0 2 true - Disable - Raw data - Filter data + disabled + default + CUAV battery monitor - - subscription button - Enable UAVCAN button subscription. ardupilot::indication::Button - true - subscription differential pressure Enable UAVCAN differential pressure subscription. uavcan::equipment::air_data::RawAirData @@ -10459,14 +10600,9 @@ Enable UAVCAN GPS subscriptions. uavcan::equipment::gnss::Fix uavcan::equipment::gnss::Fix2 uavcan::equipment::gnss::Auxiliary true - - subscription hygrometer - Enable UAVCAN hygrometer subscriptions. dronecan::sensors::hygrometer::Hygrometer - true - subscription ICE - Enable UAVCAN internal combustion engine (ICE) subscription. uavcan::equipment::ice::reciprocating::Status + Enable UAVCAN internal combusion engine (ICE) subscription. uavcan::equipment::ice::reciprocating::Status true @@ -10476,12 +10612,100 @@ subscription magnetometer - Enable UAVCAN mag subscription. uavcan::equipment::ahrs::MagneticFieldStrength uavcan::equipment::ahrs::MagneticFieldStrength2 + Enable UAVCAN GPS subscription. uavcan::equipment::ahrs::MagneticFieldStrength uavcan::equipment::ahrs::MagneticFieldStrength2 true subscription range finder - Enable UAVCAN range finder subscription. uavcan::equipment::range_sensor::Measurement + Enable UAVCAN GPS subscription. uavcan::equipment::range_sensor::Measurement + true + + + + + UAVCAN/CAN v1 bus bitrate + 20000 + 1000000 + bit/s + true + + + UAVCAN v1 + 0 - UAVCAN disabled. 1 - Enables UAVCANv1 + true + + + actuator_outputs uORB over UAVCAN v1 publication port ID + -1 + 6143 + + + DS-015 battery parameters subscription port ID + -1 + 6143 + + + DS-015 battery status subscription port ID + -1 + 6143 + + + DS-015 battery energy source subscription port ID + -1 + 6143 + + + ESC 0 subscription port ID + -1 + 6143 + + + UAVCAN v1 ESC publication port ID + -1 + 6143 + + + GPS 0 subscription port ID + -1 + 6143 + + + GPS 1 subscription port ID + -1 + 6143 + + + UAVCAN v1 GPS publication port ID + -1 + 6143 + + + UAVCAN v1 leagcy battery port ID + -1 + 6143 + + + UAVCAN v1 Servo publication port ID + -1 + 6143 + + + sensor_gps uORB over UAVCAN v1 subscription port ID + -1 + 6143 + + + sensor_gps uORB over UAVCAN v1 publication port ID + -1 + 6143 + + + + + UAVCAN v1 Node ID + Read the specs at http://uavcan.org to learn more about Node ID. + -1 + 125 true @@ -10576,36 +10800,51 @@ 2 1 - - Duration motor tilt up in backtransition - Time in seconds it takes to tilt form VT_TILT_FW to VT_TILT_MC. - 0.1 - 10 - s + + Backtransition deceleration setpoint to pitch feedforward gain + 0 + 0.2 + rad s^2/m 1 - 0.1 + 0.01 Backtransition deceleration setpoint to pitch I gain 0 0.3 rad s/m - 2 + 1 0.05 Approximate deceleration during back transition - Used to calculate back transition distance in an auto mode. For standard vtol and tiltrotors a controller is used to track this value during the transition. + The approximate deceleration during a back transition in m/s/s Used to calculate back transition distance in mission mode. A lower value will make the VTOL transition further from the destination waypoint. For standard vtol and tiltrotors a controller is used to track this value during the transition. 0.5 10 m/s^2 2 0.1 - - Maximum duration of a back transition - Transition is also declared over if the groundspeed drops below MPC_XY_CRUISE. - 0.1 + + Delay in seconds before applying back transition throttle + Set this to a value greater than 0 to give the motor time to spin down. unit s + 0 + 10 + 2 + 1 + + + Output on airbrakes channel during back transition + Used for airbrakes or with ESCs that have reverse thrust enabled on a seperate channel Airbrakes need to be enables for your selected model/mixer + 0 + 1 + 2 + 0.01 + + + Duration of a back transition + Time in seconds used for a back transition + 0.00 20.00 s 2 @@ -10617,192 +10856,174 @@ 0.0 20.0 s - 1 - 0.1 - - Lock control surfaces in hover - If set to 1 the control surfaces are locked at the disarmed value in multicopter mode. - - - Use fixed-wing actuation in hover to accelerate forward - This feature can be used to avoid the plane having to pitch nose down in order to move forward. Prevents large, negative lift from pitching nose down into wind. Fixed-wing forward actuators refers to puller/pusher (standard VTOL), or forward-tilt (tiltrotor VTOL). Only active if demanded down pitch is below VT_PITCH_MIN. Use VT_FWD_THRUST_SC to tune it. Only active (if enabled) in Altitude, Position and Auto modes, not in Stabilized. - - Disabled - Enabled (except LANDING) - Enabled if distance to ground above MPC_LAND_ALT1 - Enabled if distance to ground above MPC_LAND_ALT2 - Enabled constantly - Enabled if distance to ground above MPC_LAND_ALT1 (except LANDING) - Enabled if distance to ground above MPC_LAND_ALT2 (except LANDING) - - - - Fixed-wing actuation thrust scale for hover forward flight - Scale applied to the demanded down-pitch to get the fixed-wing forward actuation in hover mode. Enabled via VT_FWD_THRUST_EN. - 0.0 - 2.0 + + Target throttle value for the transition to hover flight + standard vtol: pusher tailsitter, tiltrotor: main throttle Note for standard vtol: For ESCs and mixers that support reverse thrust on low PWM values set this to a negative value to apply active breaking For ESCs that support thrust reversal with a control channel please set VT_B_REV_OUT and set this to a positive value to apply active breaking + -1 + 1 2 0.01 + + Lock elevons in multicopter mode + If set to 1 the elevons are locked in multicopter mode + + + Enable/disable usage of fixed-wing actuators in hover to generate forward force (instead of pitching down) + This technique can be used to avoid the plane having to pitch down in order to move forward. This prevents large, negative lift values being created when facing strong winds. Fixed-wing forward actuators refers to puller/pusher (standard VTOL), or forward-tilt (tiltrotor VTOL). Only active if demaded down pitch is below VT_PITCH_MIN, and uses VT_FWD_THRUST_SC to get from demanded down pitch to fixed-wing actuation. + + Disable FW forward actuation in hover. + Enable FW forward actuation in hover in altitude, position and auto modes (except LANDING). + Enable FW forward actuation in hover in altitude, position and auto modes if above MPC_LAND_ALT1. + Enable FW forward actuation in hover in altitude, position and auto modes if above MPC_LAND_ALT2. + Enable FW forward actuation in hover in altitude, position and auto modes. + Enable FW forward actuation in hover in altitude, position and auto modes if above MPC_LAND_ALT1 (except LANDING). + Enable FW forward actuation in hover in altitude, position and auto modes if above MPC_LAND_ALT2 (except LANDING). + + + + Fixed-wing actuator thrust scale for hover forward flight + Scale applied to the demanded down-pitch to get the fixed-wing forward actuation in hover mode. Only active if demaded down pitch is below VT_PITCH_MIN. Enabled via VT_FWD_THRUST_EN. + 0.0 + 2.0 + + + Adaptive QuadChute + Maximum negative altitude error for fixed wing flight. If the altitude drops below this value below the altitude setpoint the vehicle will transition back to MC mode and enter failsafe RTL. + 0.0 + 200.0 + Differential thrust in forwards flight - Enable differential thrust seperately for roll, pitch, yaw in forward (fixed-wing) mode. The effectiveness of differential thrust around the corresponding axis can be tuned by setting VT_FW_DIFTHR_S_R / VT_FW_DIFTHR_S_P / VT_FW_DIFTHR_S_Y. + Set to 1 to enable differential thrust in fixed-wing flight. 0 - 7 - - Yaw - Roll - Pitch - + 1 + 0 - - Pitch differential thrust factor in forward flight - Differential thrust in forward flight is enabled via VT_FW_DIFTHR_EN. + + Differential thrust scaling factor + This factor specifies how the yaw input gets mapped to differential thrust in forwards flight. 0.0 - 2.0 - 2 - 0.1 - - - Roll differential thrust factor in forward flight - Differential thrust in forward flight is enabled via VT_FW_DIFTHR_EN. - 0.0 - 2.0 - 2 - 0.1 - - - Yaw differential thrust factor in forward flight - Differential thrust in forward flight is enabled via VT_FW_DIFTHR_EN. - 0.0 - 2.0 + 1.0 2 0.1 - Quad-chute altitude - Minimum altitude for fixed-wing flight. When the vehicle is in fixed-wing mode and the altitude drops below this altitude (relative altitude above local origin), it will instantly switch back to MC mode and execute behavior defined in COM_QC_ACT. + QuadChute Altitude + Minimum altitude for fixed wing flight, when in fixed wing the altitude drops below this altitude the vehicle will transition back to MC mode and enter failsafe RTL 0.0 200.0 - m - 1 + + + The channel number of motors that must be turned off in fixed wing mode + 0 + 12345678 + 0 1 - - Quad-chute maximum height - Maximum height above the ground (if available, otherwise above Home if available, otherwise above the local origin) where triggering a quad-chute is possible. At high altitudes there is a big risk to deplete the battery and therefore crash if quad-chuting there. - 0 - m - 1 + + Permanent stabilization in fw mode + If set to one this parameter will cause permanent attitude stabilization in fw mode. This parameter has been introduced for pure convenience sake. - Quad-chute max pitch threshold - Absolute pitch threshold for quad-chute triggering in FW mode. Above this the vehicle will transition back to MC mode and execute behavior defined in COM_QC_ACT. Set to 0 do disable this threshold. + QuadChute Max Pitch + Maximum pitch angle before QuadChute engages Above this the vehicle will transition back to MC mode and enter failsafe RTL 0 180 - deg - Quad-chute max roll threshold - Absolute roll threshold for quad-chute triggering in FW mode. Above this the vehicle will transition back to MC mode and execute behavior defined in COM_QC_ACT. Set to 0 do disable this threshold. + QuadChute Max Roll + Maximum roll angle before QuadChute engages Above this the vehicle will transition back to MC mode and enter failsafe RTL 0 180 - deg Duration of a front transition Time in seconds used for a transition - 0.1 + 0.00 20.00 s 2 1 - Target throttle value for the transition to fixed-wing flight + Target throttle value for the transition to fixed wing flight + standard vtol: pusher tailsitter, tiltrotor: main throttle 0.0 1.0 3 0.01 - Airspeed-less front transition time (open loop) + Airspeed less front transition time (open loop) The duration of the front transition when there is no airspeed feedback available. 1.0 30.0 s - 1 - 0.5 - + + Idle speed of VTOL when in multicopter mode + 900 + 2000 + us + 0 + 1 + + Minimum pitch angle during hover landing - Overrides VT_PITCH_MIN when the vehicle is in LAND mode (hovering). During landing it can be beneficial to reduce the pitch angle to reduce the generated lift in head wind. + Overrides VT_PTCH_MIN when the vehicle is in LAND mode (hovering). During landing it can be beneficial to allow lower minimum pitch angles as it can avoid the wings generating too much lift and preventing the vehicle from sinking at the desired rate. -10.0 45.0 - deg - 1 - 0.1 - - Minimum pitch angle during hover - Any pitch setpoint below this value is translated to a forward force by the fixed-wing forward actuation if VT_FW_TRHUST_EN is set to 1. - -10.0 - 45.0 - deg - 1 - 0.1 + + Enable the usage of AUX outputs for hover motors + Set this parameter to true if the vehicle's hover motors are connected to the FMU (AUX) port. Not required for boards that only have a FMU, and no IO. Only applies for standard VTOL and tiltrotor. - - Pusher throttle ramp up slew rate - Defines the slew rate of the puller/pusher throttle during transitions. Zero will deactivate the slew rate limiting and thus produce an instant throttle rise to the transition throttle VT_F_TRANS_THR. + + The channel number of motors which provide lift during hover 0 - 1/s + 12345678 + 0 + 1 + + + Pusher throttle ramp up window + Defines the time window during which the pusher throttle will be ramped up linearly to VT_F_TRANS_THR during a transition to fixed wing mode. Zero or negative values will produce an instant throttle rise to VT_F_TRANS_THR. + 20 2 0.01 - - Quad-chute uncommanded descent threshold - Altitude error threshold for quad-chute triggering during fixed-wing flight. The check is only active if altitude is controlled and the vehicle is below the current altitude reference. The altitude error is relative to the highest altitude the vehicle has achieved since it has flown below the current altitude reference. Set to 0 do disable. - 0.0 - 200.0 - m - 1 - 1 - - - Quad-chute transition altitude loss threshold - Altitude loss threshold for quad-chute triggering during VTOL transition to fixed-wing flight in altitude-controlled flight modes. Active until 5s after completing transition to fixed-wing. If the current altitude is more than this value below the altitude at the beginning of the transition, it will instantly switch back to MC mode and execute behavior defined in COM_QC_ACT. Set to 0 do disable this threshold. - 0 - 50 - m - 1 - 1 - - - Spoiler setting while landing (hover) - -1 - 1 - norm - 1 - 0.1 + + Minimum pitch angle during hover + Minimum pitch angle during hover flight. If the desired pitch angle is is lower than this value then the fixed-wing forward actuation can be used to compensate for the missing thrust in forward direction (see VT_FW_TRHUST_EN) + -10.0 + 45.0 - Normalized tilt in FW + Position of tilt servo in fw mode 0.0 1.0 3 0.01 - Normalized tilt in Hover + Position of tilt servo in mc mode 0.0 1.0 3 0.01 - - Normalized tilt in transition to FW + + Tilt actuator control value commanded when disarmed and during the first second after arming + This specific tilt during spin-up is necessary for some systems whose motors otherwise don't spin-up freely. + 0.0 + 1.0 + 3 + 0.01 + + + Position of tilt servo in transition mode 0.0 1.0 3 @@ -10814,12 +11035,10 @@ 0.0 20.0 s - 1 - 0.1 Duration of front transition phase 2 - Time in seconds it takes to tilt form VT_TILT_TRANS to VT_TILT_FW. + Time in seconds it should take for the rotors to rotate forward completely from the point when the plane has picked up enough airspeed and is ready to go into fixed wind mode. 0.1 5.0 s @@ -10829,7 +11048,7 @@ Front transition timeout Time in seconds after which transition will be cancelled. Disabled if set to 0. - 0.1 + 0.00 30.00 s 2 @@ -10839,6 +11058,7 @@ VTOL Type (Tailsitter=0, Tiltrotor=1, Standard=2) 0 2 + 0 true Tailsitter @@ -10856,18 +11076,73 @@ 0.01 - - - VTOL Takeoff relative loiter altitude - Altitude relative to home at which vehicle will loiter after front transition. - 20 - 300 - m - 1 - 1 + + + Inertia matrix, XX component + kg m^2 + 5 + 0.00001 + + + Inertia matrix, XY component + kg m^2 + 5 + 0.00001 + + + Inertia matrix, XZ component + kg m^2 + 5 + 0.00001 + + + Inertia matrix, YY component + kg m^2 + 5 + 0.00001 + + + Inertia matrix, YZ component + kg m^2 + 5 + 0.00001 + + + Inertia matrix, ZZ component + kg m^2 + 5 + 0.00001 + + + Mass + kg + 5 + 0.00001 + + EXFW_HDNG_P + + + EXFW_PITCH_P + + + EXFW_ROLL_P + + + Enable user assisted descent speed for autonomous land routine + When enabled, descent speed will be: stick full up - 0 stick centered - MPC_LAND_SPEED stick full down - 2 * MPC_LAND_SPEED + 0 + 1 + + Fixed descent speed of MPC_LAND_SPEED + User assisted descent speed + + + + RV_YAW_P + Skip the controller diff --git a/src/FirmwarePlugin/PX4/PX4Resources.qrc b/src/FirmwarePlugin/PX4/PX4Resources.qrc index 3431508..e83713a 100644 --- a/src/FirmwarePlugin/PX4/PX4Resources.qrc +++ b/src/FirmwarePlugin/PX4/PX4Resources.qrc @@ -7,6 +7,7 @@ ../../AutoPilotPlugins/PX4/FlightModesComponentSummary.qml ../../AutoPilotPlugins/PX4/PowerComponent.qml ../../AutoPilotPlugins/PX4/PowerComponentSummary.qml + ../../AutoPilotPlugins/PX4/PX4AdvancedFlightModes.qml ../../AutoPilotPlugins/PX4/PX4FlightModes.qml ../../AutoPilotPlugins/PX4/PX4RadioComponentSummary.qml ../../AutoPilotPlugins/PX4/PX4SimpleFlightModes.qml @@ -19,8 +20,6 @@ ../../AutoPilotPlugins/PX4/PX4TuningComponentCopterPosition.qml ../../AutoPilotPlugins/PX4/PX4TuningComponentPlane.qml ../../AutoPilotPlugins/PX4/PX4TuningComponentPlaneAll.qml - ../../AutoPilotPlugins/PX4/PX4TuningComponentPlaneAttitude.qml - ../../AutoPilotPlugins/PX4/PX4TuningComponentPlaneRate.qml ../../AutoPilotPlugins/PX4/PX4TuningComponentPlaneTECS.qml ../../AutoPilotPlugins/PX4/PX4TuningComponentVTOL.qml ../../AutoPilotPlugins/PX4/SafetyComponent.qml diff --git a/src/FirstRunPromptDialogs/FirstRunPrompt.qml b/src/FirstRunPromptDialogs/FirstRunPrompt.qml index 3e2b196..63b4fe1 100644 --- a/src/FirstRunPromptDialogs/FirstRunPrompt.qml +++ b/src/FirstRunPromptDialogs/FirstRunPrompt.qml @@ -15,12 +15,12 @@ import QGroundControl.Controls 1.0 // Base class for all first run prompt dialogs QGCPopupDialog { - buttons: StandardButton.Ok + buttons: StandardButton.Ok property int promptId property bool markAsShownOnClose: true - onClosed: { + onHideDialog: { if (markAsShownOnClose) { QGroundControl.settingsManager.appSettings.firstRunPromptIdsMarkIdAsShown(promptId) } diff --git a/src/FlightDisplay/CMakeLists.txt b/src/FlightDisplay/CMakeLists.txt index f8f2c38..6aafa3c 100644 --- a/src/FlightDisplay/CMakeLists.txt +++ b/src/FlightDisplay/CMakeLists.txt @@ -7,6 +7,7 @@ add_custom_target(FligthDisplayQml FlightDisplayViewUVC.qml FlightDisplayViewVideo.qml FlightDisplayViewWidgets.qml + FlyViewAirspaceIndicator.qml FlyViewCustomLayer.qml FlyViewInstrumentPanel.qml FlyViewMap.qml @@ -25,9 +26,7 @@ add_custom_target(FligthDisplayQml GuidedActionRTL.qml GuidedActionsController.qml GuidedActionTakeoff.qml - GuidedActionGripper.qml - GripperMenu.qml - GuidedValueSlider.qml + GuidedAltitudeSlider.qml GuidedToolStripAction.qml MultiRotorChecklist.qml MultiVehicleList.qml diff --git a/src/FlightDisplay/FlightDisplayViewUVC.qml b/src/FlightDisplay/FlightDisplayViewUVC.qml index dbe2dce..c5ca599 100644 --- a/src/FlightDisplay/FlightDisplayViewUVC.qml +++ b/src/FlightDisplay/FlightDisplayViewUVC.qml @@ -19,7 +19,6 @@ Rectangle { color: Qt.rgba(0,0,0,0.75) clip: true anchors.centerIn: parent - visible: QGroundControl.videoManager.isUvc function adjustAspectRatio() { @@ -33,7 +32,7 @@ Rectangle { Camera { id: camera - deviceId: QGroundControl.videoManager.uvcVideoSourceID + deviceId: QGroundControl.videoManager.videoSourceID captureMode: Camera.CaptureViewfinder onDeviceIdChanged: { adjustAspectRatio() @@ -48,15 +47,12 @@ Rectangle { source: camera anchors.fill: parent fillMode: VideoOutput.PreserveAspectCrop - visible: QGroundControl.videoManager.isUvc - - onVisibleChanged: { - console.log('UVC Video output visible: ', visible); - if (visible) { - camera.start() - } else { - camera.stop() - } - } + visible: !QGroundControl.videoManager.isGStreamer + } + onVisibleChanged: { + if(visible) + camera.start() + else + camera.stop() } } diff --git a/src/FlightDisplay/FlightDisplayViewVideo.qml b/src/FlightDisplay/FlightDisplayViewVideo.qml index 05913d3..d00b45b 100644 --- a/src/FlightDisplay/FlightDisplayViewVideo.qml +++ b/src/FlightDisplay/FlightDisplayViewVideo.qml @@ -38,32 +38,19 @@ Item { property double _thermalHeightFactor: 0.85 //-- TODO - Image { - id: noVideo - anchors.fill: parent - source: "/res/NoVideoBackground.jpg" - fillMode: Image.PreserveAspectCrop - visible: !(QGroundControl.videoManager.decoding) - - Rectangle { - anchors.centerIn: parent - width: noVideoLabel.contentWidth + ScreenTools.defaultFontPixelHeight - height: noVideoLabel.contentHeight + ScreenTools.defaultFontPixelHeight - radius: ScreenTools.defaultFontPixelWidth / 2 - color: "black" - opacity: 0.5 - } - - QGCLabel { - id: noVideoLabel - text: QGroundControl.settingsManager.videoSettings.streamEnabled.rawValue ? qsTr("WAITING FOR VIDEO") : qsTr("VIDEO DISABLED") - font.family: ScreenTools.demiboldFontFamily - color: "white" - font.pointSize: useSmallFont ? ScreenTools.smallFontPointSize : ScreenTools.largeFontPointSize - anchors.centerIn: parent - } + Rectangle { + id: noVideo + anchors.fill: parent + color: Qt.rgba(0,0,0,0.75) + visible: !(QGroundControl.videoManager.decoding) + QGCLabel { + text: QGroundControl.settingsManager.videoSettings.streamEnabled.rawValue ? qsTr("WAITING FOR VIDEO") : qsTr("VIDEO DISABLED") + font.family: ScreenTools.demiboldFontFamily + color: "white" + font.pointSize: useSmallFont ? ScreenTools.smallFontPointSize : ScreenTools.largeFontPointSize + anchors.centerIn: parent } - + } Rectangle { anchors.fill: parent color: "black" diff --git a/src/FlightDisplay/FlyView.qml b/src/FlightDisplay/FlyView.qml index 68c2a8b..86f5fdf 100644 --- a/src/FlightDisplay/FlyView.qml +++ b/src/FlightDisplay/FlyView.qml @@ -18,6 +18,8 @@ import QtQuick.Window 2.2 import QtQml.Models 2.1 import QGroundControl 1.0 +import QGroundControl.Airspace 1.0 +import QGroundControl.Airmap 1.0 import QGroundControl.Controllers 1.0 import QGroundControl.Controls 1.0 import QGroundControl.FactSystem 1.0 @@ -49,8 +51,7 @@ Item { property real _margins: ScreenTools.defaultFontPixelWidth / 2 property var _guidedController: guidedActionsController property var _guidedActionList: guidedActionList - property var _guidedValueSlider: guidedValueSlider - property var _widgetLayer: widgetLayer + property var _guidedAltSlider: guidedAltSlider property real _toolsMargin: ScreenTools.defaultFontPixelWidth * 0.75 property rect _centerViewport: Qt.rect(0, 0, width, height) property real _rightPanelWidth: ScreenTools.defaultFontPixelWidth * 30 @@ -78,14 +79,13 @@ Item { anchors.top: parent.top anchors.bottom: parent.bottom anchors.left: parent.left - anchors.right: guidedValueSlider.visible ? guidedValueSlider.left : parent.right + anchors.right: guidedAltSlider.visible ? guidedAltSlider.left : parent.right z: _fullItemZorder + 1 parentToolInsets: _toolInsets mapControl: _mapControl visible: !QGroundControl.videoManager.fullScreen } - FlyViewCustomLayer { id: customOverlay anchors.fill: widgetLayer @@ -95,25 +95,11 @@ Item { visible: !QGroundControl.videoManager.fullScreen } - // Development tool for visualizing the insets for a paticular layer, enable if needed - /* - FlyViewInsetViewer { - id: widgetLayerInsetViewer - anchors.top: parent.top - anchors.bottom: parent.bottom - anchors.left: parent.left - anchors.right: guidedValueSlider.visible ? guidedValueSlider.left : parent.right - - z: widgetLayer.z + 1 - - insetsToView: customOverlay.totalToolInsets - }*/ - GuidedActionsController { id: guidedActionsController missionController: _missionController actionList: _guidedActionList - guidedValueSlider: _guidedValueSlider + altitudeSlider: _guidedAltSlider } /*GuidedActionConfirm { @@ -123,7 +109,7 @@ Item { anchors.horizontalCenter: parent.horizontalCenter z: QGroundControl.zOrderTopMost guidedController: _guidedController - guidedValueSlider: _guidedValueSlider + altitudeSlider: _guidedAltSlider }*/ GuidedActionList { @@ -135,9 +121,9 @@ Item { guidedController: _guidedController } - //-- Guided value slider (e.g. altitude) - GuidedValueSlider { - id: guidedValueSlider + //-- Altitude slider + GuidedAltitudeSlider { + id: guidedAltSlider anchors.margins: _toolsMargin anchors.right: parent.right anchors.top: parent.top diff --git a/src/FlightDisplay/FlyViewAirspaceIndicator.qml b/src/FlightDisplay/FlyViewAirspaceIndicator.qml new file mode 100644 index 0000000..91a2585 --- /dev/null +++ b/src/FlightDisplay/FlyViewAirspaceIndicator.qml @@ -0,0 +1,66 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +import QtQuick 2.12 +import QtQuick.Controls 2.4 + +import QGroundControl 1.0 +import QGroundControl.Airspace 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.Palette 1.0 +import QGroundControl.ScreenTools 1.0 + +Rectangle { + id: _root + width: airspaceRow.width + (ScreenTools.defaultFontPixelWidth * 3) + height: airspaceRow.height * 1.25 + color: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(1,1,1,0.95) : Qt.rgba(0,0,0,0.75) + visible: show && QGroundControl.airmapSupported && _flightPermit && _flightPermit !== AirspaceFlightPlanProvider.PermitNone + radius: 3 + border.width: 1 + border.color: qgcPal.globalTheme === QGCPalette.Light ? Qt.rgba(0,0,0,0.35) : Qt.rgba(1,1,1,0.35) + + property bool show: false + + property var _flightPermit: QGroundControl.airmapSupported ? QGroundControl.airspaceManager.flightPlan.flightPermitStatus : null + property string _providerName: QGroundControl.airspaceManager.providerName + + QGCPalette { id: qgcPal; colorGroupEnabled: enabled } + + Row { + id: airspaceRow + spacing: ScreenTools.defaultFontPixelWidth + anchors.centerIn: parent + + QGCLabel { text: _providerName+":"; anchors.verticalCenter: parent.verticalCenter; } + QGCLabel { + text: { + if(_flightPermit) { + if(_flightPermit === AirspaceFlightPlanProvider.PermitPending) + return qsTr("Approval Pending") + if(_flightPermit === AirspaceFlightPlanProvider.PermitAccepted || _flightPermit === AirspaceFlightPlanProvider.PermitNotRequired) + return qsTr("Flight Approved") + if(_flightPermit === AirspaceFlightPlanProvider.PermitRejected) + return qsTr("Flight Rejected") + } + return "" + } + color: { + if(_flightPermit) { + if(_flightPermit === AirspaceFlightPlanProvider.PermitPending) + return qgcPal.colorOrange + if(_flightPermit === AirspaceFlightPlanProvider.PermitAccepted || _flightPermit === AirspaceFlightPlanProvider.PermitNotRequired) + return qgcPal.colorGreen + } + return qgcPal.colorRed + } + anchors.verticalCenter: parent.verticalCenter; + } + } +} diff --git a/src/FlightDisplay/FlyViewCustomLayer.qml b/src/FlightDisplay/FlyViewCustomLayer.qml index c09b7e4..a8ead7d 100644 --- a/src/FlightDisplay/FlyViewCustomLayer.qml +++ b/src/FlightDisplay/FlyViewCustomLayer.qml @@ -18,6 +18,8 @@ import QtQuick.Window 2.2 import QtQml.Models 2.1 import QGroundControl 1.0 +import QGroundControl.Airspace 1.0 +import QGroundControl.Airmap 1.0 import QGroundControl.Controllers 1.0 import QGroundControl.Controls 1.0 import QGroundControl.FactSystem 1.0 @@ -36,20 +38,19 @@ Item { property var totalToolInsets: _toolInsets // These are the insets for your custom overlay additions property var mapControl - // since this file is a placeholder for the custom layer in a standard build, we will just pass through the parent insets QGCToolInsets { - id: _toolInsets - leftEdgeTopInset: parentToolInsets.leftEdgeTopInset - leftEdgeCenterInset: parentToolInsets.leftEdgeCenterInset - leftEdgeBottomInset: parentToolInsets.leftEdgeBottomInset - rightEdgeTopInset: parentToolInsets.rightEdgeTopInset - rightEdgeCenterInset: parentToolInsets.rightEdgeCenterInset - rightEdgeBottomInset: parentToolInsets.rightEdgeBottomInset - topEdgeLeftInset: parentToolInsets.topEdgeLeftInset - topEdgeCenterInset: parentToolInsets.topEdgeCenterInset - topEdgeRightInset: parentToolInsets.topEdgeRightInset - bottomEdgeLeftInset: parentToolInsets.bottomEdgeLeftInset - bottomEdgeCenterInset: parentToolInsets.bottomEdgeCenterInset - bottomEdgeRightInset: parentToolInsets.bottomEdgeRightInset + id: _toolInsets + leftEdgeCenterInset: 0 + leftEdgeTopInset: 0 + leftEdgeBottomInset: 0 + rightEdgeCenterInset: 0 + rightEdgeTopInset: 0 + rightEdgeBottomInset: 0 + topEdgeCenterInset: 0 + topEdgeLeftInset: 0 + topEdgeRightInset: 0 + bottomEdgeCenterInset: 0 + bottomEdgeLeftInset: 0 + bottomEdgeRightInset: 0 } } diff --git a/src/FlightDisplay/FlyViewInsetViewer.qml b/src/FlightDisplay/FlyViewInsetViewer.qml deleted file mode 100644 index 2f95208..0000000 --- a/src/FlightDisplay/FlyViewInsetViewer.qml +++ /dev/null @@ -1,194 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2020 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -import QtQuick 2.12 -import QtQuick.Controls 2.4 -import QtQuick.Dialogs 1.3 -import QtQuick.Layouts 1.12 - -import QtLocation 5.3 -import QtPositioning 5.3 -import QtQuick.Window 2.2 -import QtQml.Models 2.1 - -import QGroundControl 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.Controllers 1.0 -import QGroundControl.FlightDisplay 1.0 -import QGroundControl.ScreenTools 1.0 -import QGroundControl.FlightMap 1.0 - - -// This is the ui overlay layer for the widgets/tools for Fly View -Item { - id: _root - property var insetsToView: QGCToolInsets {} - property int _linethickness: 3 - - Rectangle { - anchors.left: parent.left - anchors.verticalCenter: parent.verticalCenter - anchors.leftMargin: parent.width/8 - height: checkboxcolumn.height - width: checkboxcolumn.width - color: "dimgray" - - ColumnLayout { - id: checkboxcolumn - QGCCheckBox{ - checked: true - text: "leftEdgeTopInset" - onClicked: leftEdgeTopInset.visible = checked - textColor: leftEdgeTopInset.color - textBold: true - } - QGCCheckBox{ - checked: true - text: "leftEdgeBottomInset" - onClicked: leftEdgeBottomInset.visible = checked - textColor: leftEdgeBottomInset.color - textBold: true - } - QGCCheckBox{ - checked: true - text: "rightEdgeTopInset" - onClicked: rightEdgeTopInset.visible = checked - textColor: rightEdgeTopInset.color - textBold: true - } - QGCCheckBox{ - checked: true - text: "rightEdgeBottomInset" - onClicked: rightEdgeBottomInset.visible = checked - textColor: rightEdgeBottomInset.color - textBold: true - } - QGCCheckBox{ - checked: true - text: "topEdgeLeftInset" - onClicked: topEdgeLeftInset.visible = checked - textColor: topEdgeLeftInset.color - textBold: true - } - QGCCheckBox{ - checked: true - text: "topEdgeRightInset" - onClicked: topEdgeRightInset.visible = checked - textColor: topEdgeRightInset.color - textBold: true - } - QGCCheckBox{ - checked: true - text: "bottomEdgeLeftInset" - onClicked: bottomEdgeLeftInset.visible = checked - textColor: bottomEdgeLeftInset.color - textBold: true - } - QGCCheckBox{ - checked: true - text: "bottomEdgeRightInset" - onClicked: bottomEdgeRightInset.visible = checked - textColor: bottomEdgeRightInset.color - textBold: true - } - QGCCheckBox{ - checked: true - text: "centerInsetRect" - onClicked: centerInsetRect.visible = checked - textColor: centerInsetRect.border.color - textBold: true - } - } - - } - - Rectangle { // leftEdgeTopInset - id: leftEdgeTopInset - anchors.top: parent.top - anchors.left: parent.left - anchors.leftMargin: insetsToView.leftEdgeTopInset - height: parent.height - width: _linethickness - color: "coral" - } - Rectangle { // leftEdgeBottomInset - id: leftEdgeBottomInset - anchors.top: parent.top - anchors.left: parent.left - anchors.leftMargin: insetsToView.leftEdgeBottomInset - height: parent.height - width: _linethickness - color: "cornflowerblue" - } - Rectangle { // rightEdgeTopInset - id: rightEdgeTopInset - anchors.top: parent.top - anchors.right: parent.right - anchors.rightMargin: insetsToView.rightEdgeTopInset - height: parent.height - width: _linethickness - color: "darkslateblue" - } - Rectangle { // rightEdgeBottomInset - id: rightEdgeBottomInset - anchors.top: parent.top - anchors.right: parent.right - anchors.rightMargin: insetsToView.rightEdgeBottomInset - height: parent.height - width: _linethickness - color: "firebrick" - } - Rectangle { // topEdgeLeftInset - id: topEdgeLeftInset - anchors.top: parent.top - anchors.left: parent.left - anchors.topMargin: insetsToView.topEdgeLeftInset - height: _linethickness - width: parent.width - color: "mediumseagreen" - } - Rectangle { // topEdgeRightInset - id: topEdgeRightInset - anchors.top: parent.top - anchors.left: parent.left - anchors.topMargin: insetsToView.topEdgeRightInset - height: _linethickness - width: parent.width - color: "moccasin" - } - Rectangle { // bottomEdgeLeftInset - id: bottomEdgeLeftInset - anchors.bottom: parent.bottom - anchors.left: parent.left - anchors.bottomMargin: insetsToView.bottomEdgeLeftInset - height: _linethickness - width: parent.width - color: "salmon" - } - Rectangle { // bottomEdgeRightInset - id: bottomEdgeRightInset - anchors.bottom: parent.bottom - anchors.left: parent.left - anchors.bottomMargin: insetsToView.bottomEdgeRightInset - height: _linethickness - width: parent.width - color: "slategrey" - } - Rectangle { - id: centerInsetRect - x: insetsToView.leftEdgeCenterInset - y: insetsToView.topEdgeCenterInset - width: _root.width - insetsToView.leftEdgeCenterInset - insetsToView.rightEdgeCenterInset - height: _root.height - insetsToView.topEdgeCenterInset - insetsToView.bottomEdgeCenterInset - color: "transparent" - border.color: "yellow" - border.width: 1 - radius: 0 - } -} diff --git a/src/FlightDisplay/FlyViewInstrumentPanel.qml b/src/FlightDisplay/FlyViewInstrumentPanel.qml index 32ab45e..38b8ab5 100644 --- a/src/FlightDisplay/FlyViewInstrumentPanel.qml +++ b/src/FlightDisplay/FlyViewInstrumentPanel.qml @@ -10,6 +10,8 @@ import QtQuick 2.12 import QGroundControl 1.0 +import QGroundControl.Airspace 1.0 +import QGroundControl.Airmap 1.0 import QGroundControl.Controls 1.0 import QGroundControl.ScreenTools 1.0 @@ -21,6 +23,13 @@ Column { property real availableHeight + AirspaceControl { + id: airspaceControl + width: parent.width + planView: false + visible: QGroundControl.airmapSupported ? QGroundControl.settingsManager.airMapSettings.enableAirMap.rawValue : false + } + FlightDisplayViewWidgets { id: flightDisplayViewWidgets width: parent.width diff --git a/src/FlightDisplay/FlyViewMap.qml b/src/FlightDisplay/FlyViewMap.qml index 1396874..8dcfaf3 100644 --- a/src/FlightDisplay/FlyViewMap.qml +++ b/src/FlightDisplay/FlyViewMap.qml @@ -12,9 +12,9 @@ import QtQuick.Controls 2.4 import QtLocation 5.3 import QtPositioning 5.3 import QtQuick.Dialogs 1.2 -import QtQuick.Layouts 1.11 import QGroundControl 1.0 +import QGroundControl.Airspace 1.0 import QGroundControl.Controllers 1.0 import QGroundControl.Controls 1.0 import QGroundControl.FlightDisplay 1.0 @@ -50,6 +50,7 @@ FlightMap { property var _activeVehicleCoordinate: _activeVehicle ? _activeVehicle.coordinate : QtPositioning.coordinate() property real _toolButtonTopMargin: parent.height - mainWindow.height + (ScreenTools.defaultFontPixelHeight / 2) property real _toolsMargin: ScreenTools.defaultFontPixelWidth * 0.75 + property bool _airspaceEnabled: QGroundControl.airmapSupported ? (QGroundControl.settingsManager.airMapSettings.enableAirMap.rawValue && QGroundControl.airspaceManager.connected): false property var _flyViewSettings: QGroundControl.settingsManager.flyViewSettings property bool _keepMapCenteredOnVehicle: _flyViewSettings.keepMapCenteredOnVehicle.rawValue @@ -57,6 +58,16 @@ FlightMap { property bool _keepVehicleCentered: pipMode ? true : false property bool _saveZoomLevelSetting: true + function updateAirspace(reset) { + if(_airspaceEnabled) { + var coordinateNW = _root.toCoordinate(Qt.point(0,0), false /* clipToViewPort */) + var coordinateSE = _root.toCoordinate(Qt.point(width,height), false /* clipToViewPort */) + if(coordinateNW.isValid && coordinateSE.isValid) { + QGroundControl.airspaceManager.setROI(coordinateNW, coordinateSE, false /*planView*/, reset) + } + } + } + function _adjustMapZoomForPipMode() { _saveZoomLevelSetting = false if (pipMode) { @@ -81,10 +92,16 @@ FlightMap { onZoomLevelChanged: { if (_saveZoomLevelSetting) { QGroundControl.flightMapZoom = zoomLevel + updateAirspace(false) } } onCenterChanged: { QGroundControl.flightMapPosition = center + updateAirspace(false) + } + + on_AirspaceEnabledChanged: { + updateAirspace(true) } // We track whether the user has panned or not to correctly handle automatic map positioning @@ -126,59 +143,17 @@ FlightMap { animateLong.start() } - // returns the rectangle formed by the four center insets - // used for checking if vehicle is under ui, and as a target for recentering the view - function _insetCenterRect() { + function _insetRect() { return Qt.rect(toolInsets.leftEdgeCenterInset, toolInsets.topEdgeCenterInset, _root.width - toolInsets.leftEdgeCenterInset - toolInsets.rightEdgeCenterInset, _root.height - toolInsets.topEdgeCenterInset - toolInsets.bottomEdgeCenterInset) } - // returns the four rectangles formed by the 8 corner insets - // used for detecting if the vehicle has flown under the instrument panel, virtual joystick etc - function _insetCornerRects() { - var rects = { - "topleft": Qt.rect(0,0, - toolInsets.leftEdgeTopInset, - toolInsets.topEdgeLeftInset), - "topright": Qt.rect(_root.width-toolInsets.rightEdgeTopInset,0, - toolInsets.rightEdgeTopInset, - toolInsets.topEdgeRightInset), - "bottomleft": Qt.rect(0,_root.height-toolInsets.bottomEdgeLeftInset, - toolInsets.leftEdgeBottomInset, - toolInsets.bottomEdgeLeftInset), - "bottomright": Qt.rect(_root.width-toolInsets.rightEdgeBottomInset,_root.height-toolInsets.bottomEdgeRightInset, - toolInsets.rightEdgeBottomInset, - toolInsets.bottomEdgeRightInset)} - return rects - } - function recenterNeeded() { var vehiclePoint = _root.fromCoordinate(_activeVehicleCoordinate, false /* clipToViewport */) - var centerRect = _insetCenterRect() - //return !pointInRect(vehiclePoint,insetRect) - - // If we are outside the center inset rectangle, recenter - if(!pointInRect(vehiclePoint, centerRect)){ - return true - } - - // if we are inside the center inset rectangle - // then additionally check if we are underneath one of the corner inset rectangles - var cornerRects = _insetCornerRects() - if(pointInRect(vehiclePoint, cornerRects["topleft"])){ - return true - } else if(pointInRect(vehiclePoint, cornerRects["topright"])){ - return true - } else if(pointInRect(vehiclePoint, cornerRects["bottomleft"])){ - return true - } else if(pointInRect(vehiclePoint, cornerRects["bottomright"])){ - return true - } - - // if we are inside the center inset rectangle, and not under any corner elements - return false + var insetRect = _insetRect() + return !pointInRect(vehiclePoint, insetRect) } function updateMapToVehiclePosition() { @@ -193,8 +168,8 @@ FlightMap { if (firstVehiclePositionReceived && recenterNeeded()) { // Move the map such that the vehicle is centered within the inset area var vehiclePoint = _root.fromCoordinate(_activeVehicleCoordinate, false /* clipToViewport */) - var centerInsetRect = _insetCenterRect() - var centerInsetPoint = Qt.point(centerInsetRect.x + centerInsetRect.width / 2, centerInsetRect.y + centerInsetRect.height / 2) + var insetRect = _insetRect() + var centerInsetPoint = Qt.point(insetRect.x + insetRect.width / 2, insetRect.y + insetRect.height / 2) var centerOffset = Qt.point((_root.width / 2) - centerInsetPoint.x, (_root.height / 2) - centerInsetPoint.y) var vehicleOffsetPoint = Qt.point(vehiclePoint.x + centerOffset.x, vehiclePoint.y + centerOffset.y) var vehicleOffsetCoord = _root.toCoordinate(vehicleOffsetPoint, false /* clipToViewport */) @@ -307,7 +282,6 @@ FlightMap { heading: object.heading alert: object.alert map: _root - size: pipMode ? ScreenTools.defaultFontPixelHeight : ScreenTools.defaultFontPixelHeight * 2.5 z: QGroundControl.zOrderVehicles } } @@ -537,109 +511,75 @@ FlightMap { } } - // Handle guided mode clicks MouseArea { anchors.fill: parent - Popup { + QGCMenu { id: clickMenu - modal: true - property var coord + QGCMenuItem { + text: qsTr("Go to location") + visible: globals.guidedControllerFlyView.showGotoLocation - function setCoordinates(mouseX, mouseY) { - var newX = mouseX - var newY = mouseY - - // Filtering coordinates - if (newX + clickMenu.width > _root.width) { - newX = _root.width - clickMenu.width + onTriggered: { + gotoLocationItem.show(clickMenu.coord) + globals.guidedControllerFlyView.confirmAction(globals.guidedControllerFlyView.actionGoto, clickMenu.coord, gotoLocationItem) } - if (newY + clickMenu.height > _root.height) { - newY = _root.height - clickMenu.height - } - - // Set coordiantes - x = newX - y = newY } + QGCMenuItem { + text: qsTr("Orbit at location") + visible: globals.guidedControllerFlyView.showOrbit - background: Rectangle { - radius: ScreenTools.defaultFontPixelHeight * 0.5 - color: qgcPal.window - border.color: qgcPal.text + onTriggered: { + orbitMapCircle.show(clickMenu.coord) + globals.guidedControllerFlyView.confirmAction(globals.guidedControllerFlyView.actionOrbit, clickMenu.coord, orbitMapCircle) + } } + QGCMenuItem { + text: qsTr("ROI at location") + visible: globals.guidedControllerFlyView.showROI - ColumnLayout { - id: mainLayout - spacing: ScreenTools.defaultFontPixelWidth / 2 - - QGCButton { - Layout.fillWidth: true - text: "Go to location" - visible: globals.guidedControllerFlyView.showGotoLocation - onClicked: { - if (clickMenu.opened) { - clickMenu.close() - } - gotoLocationItem.show(clickMenu.coord) - globals.guidedControllerFlyView.confirmAction(globals.guidedControllerFlyView.actionGoto, clickMenu.coord, gotoLocationItem) - } - } - - QGCButton { - Layout.fillWidth: true - text: "Orbit at location" - visible: globals.guidedControllerFlyView.showOrbit - onClicked: { - if (clickMenu.opened) { - clickMenu.close() - } - orbitMapCircle.show(clickMenu.coord) - globals.guidedControllerFlyView.confirmAction(globals.guidedControllerFlyView.actionOrbit, clickMenu.coord, orbitMapCircle) - } - } - - QGCButton { - Layout.fillWidth: true - text: "ROI at location" - visible: globals.guidedControllerFlyView.showROI - onClicked: { - if (clickMenu.opened) { - clickMenu.close() - } - roiLocationItem.show(clickMenu.coord) - globals.guidedControllerFlyView.confirmAction(globals.guidedControllerFlyView.actionROI, clickMenu.coord, roiLocationItem) - } - } - - QGCButton { - Layout.fillWidth: true - text: "Set home here" - visible: globals.guidedControllerFlyView.showSetHome - onClicked: { - if (clickMenu.opened) { - clickMenu.close() - } - globals.guidedControllerFlyView.confirmAction(globals.guidedControllerFlyView.actionSetHome, clickMenu.coord) - } + onTriggered: { + roiLocationItem.show(clickMenu.coord) + globals.guidedControllerFlyView.confirmAction(globals.guidedControllerFlyView.actionROI, clickMenu.coord, roiLocationItem) } } } onClicked: { - if (!globals.guidedControllerFlyView.guidedUIVisible && (globals.guidedControllerFlyView.showGotoLocation || globals.guidedControllerFlyView.showOrbit || globals.guidedControllerFlyView.showROI || globals.guidedControllerFlyView.showSetHome)) { + if (!globals.guidedControllerFlyView.guidedUIVisible && (globals.guidedControllerFlyView.showGotoLocation || globals.guidedControllerFlyView.showOrbit || globals.guidedControllerFlyView.showROI)) { orbitMapCircle.hide() gotoLocationItem.hide() var clickCoord = _root.toCoordinate(Qt.point(mouse.x, mouse.y), false /* clipToViewPort */) clickMenu.coord = clickCoord - clickMenu.setCoordinates(mouse.x, mouse.y) - clickMenu.open() + clickMenu.popup() } } } + // Airspace overlap support + MapItemView { + model: _airspaceEnabled && QGroundControl.settingsManager.airMapSettings.enableAirspace && QGroundControl.airspaceManager.airspaceVisible ? QGroundControl.airspaceManager.airspaces.circles : [] + delegate: MapCircle { + center: object.center + radius: object.radius + color: object.color + border.color: object.lineColor + border.width: object.lineWidth + } + } + + MapItemView { + model: _airspaceEnabled && QGroundControl.settingsManager.airMapSettings.enableAirspace && QGroundControl.airspaceManager.airspaceVisible ? QGroundControl.airspaceManager.airspaces.polygons : [] + delegate: MapPolygon { + path: object.polygon + color: object.color + border.color: object.lineColor + border.width: object.lineWidth + } + } + MapScale { id: mapScale anchors.margins: _toolsMargin diff --git a/src/FlightDisplay/FlyViewMissionCompleteDialog.qml b/src/FlightDisplay/FlyViewMissionCompleteDialog.qml index 8b490c7..bcc225d 100644 --- a/src/FlightDisplay/FlyViewMissionCompleteDialog.qml +++ b/src/FlightDisplay/FlyViewMissionCompleteDialog.qml @@ -32,8 +32,8 @@ Item { property bool _vehicleInMissionFlightMode: _activeVehicle ? (_activeVehicle.flightMode === _activeVehicle.missionFlightMode) : false property bool _vehicleWasInMissionFlightMode: false property bool _showMissionCompleteDialog: _vehicleWasArmed && _vehicleWasInMissionFlightMode && - (missionController.containsItems || geoFenceController.containsItems || rallyPointController.containsItems || - (_activeVehicle ? _activeVehicle.cameraTriggerPoints.count !== 0 : false)) + (missionController.containsItems || geoFenceController.containsItems || rallyPointController.containsItems || + (_activeVehicle ? _activeVehicle.cameraTriggerPoints.count !== 0 : false)) on_VehicleArmedChanged: { if (_vehicleArmed) { @@ -41,7 +41,7 @@ Item { _vehicleWasInMissionFlightMode = _vehicleInMissionFlightMode } else { if (_showMissionCompleteDialog) { - missionCompleteDialogComponent.createObject(mainWindow).open() + mainWindow.showComponentDialog(missionCompleteDialogComponent, qsTr("Flight Plan complete"), mainWindow.showDialogDefaultWidth, StandardButton.Close) } _vehicleWasArmed = false _vehicleWasInMissionFlightMode = false @@ -57,83 +57,85 @@ Item { Component { id: missionCompleteDialogComponent - QGCPopupDialog { - id: missionCompleteDialog - title: qsTr("Flight Plan complete") - buttons: StandardButton.Close - + QGCViewDialog { property var activeVehicleCopy: _activeVehicle onActiveVehicleCopyChanged: if (!activeVehicleCopy) { - missionCompleteDialog.close() + hideDialog() } - ColumnLayout { - id: column - width: 40 * ScreenTools.defaultFontPixelWidth - spacing: ScreenTools.defaultFontPixelHeight - - QGCLabel { - Layout.fillWidth: true - text: qsTr("%1 Images Taken").arg(_activeVehicle.cameraTriggerPoints.count) - horizontalAlignment: Text.AlignHCenter - visible: _activeVehicle.cameraTriggerPoints.count !== 0 - } - - QGCButton { - Layout.fillWidth: true - text: qsTr("Remove plan from vehicle") - visible: !_activeVehicle.communicationLost// && !_activeVehicle.apmFirmware // ArduPilot has a bug somewhere with mission clear - onClicked: { - _planController.removeAllFromVehicle() - missionCompleteDialog.close() - } - } - - QGCButton { - Layout.fillWidth: true - Layout.alignment: Qt.AlignHCenter - text: qsTr("Leave plan on vehicle") - onClicked: missionCompleteDialog.close() - - } - - Rectangle { - Layout.fillWidth: true - color: qgcPal.text - height: 1 - } + QGCFlickable { + anchors.fill: parent + contentHeight: column.height ColumnLayout { - Layout.fillWidth: true + id: column + anchors.margins: _margins + anchors.left: parent.left + anchors.right: parent.right spacing: ScreenTools.defaultFontPixelHeight - visible: !_activeVehicle.communicationLost && globals.guidedControllerFlyView.showResumeMission + + QGCLabel { + Layout.fillWidth: true + text: qsTr("%1 Images Taken").arg(_activeVehicle.cameraTriggerPoints.count) + horizontalAlignment: Text.AlignHCenter + visible: _activeVehicle.cameraTriggerPoints.count !== 0 + } + + QGCButton { + Layout.fillWidth: true + text: qsTr("Remove plan from vehicle") + visible: !_activeVehicle.communicationLost// && !_activeVehicle.apmFirmware // ArduPilot has a bug somewhere with mission clear + onClicked: { + _planController.removeAllFromVehicle() + hideDialog() + } + } QGCButton { Layout.fillWidth: true Layout.alignment: Qt.AlignHCenter - text: qsTr("Resume Mission From Waypoint %1").arg(globals.guidedControllerFlyView._resumeMissionIndex) + text: qsTr("Leave plan on vehicle") + onClicked: hideDialog() + } - onClicked: { - globals.guidedControllerFlyView.executeAction(globals.guidedControllerFlyView.actionResumeMission, null, null) - missionCompleteDialog.close() + Rectangle { + Layout.fillWidth: true + color: qgcPal.text + height: 1 + } + + ColumnLayout { + Layout.fillWidth: true + spacing: ScreenTools.defaultFontPixelHeight + visible: !_activeVehicle.communicationLost && globals.guidedControllerFlyView.showResumeMission + + QGCButton { + Layout.fillWidth: true + Layout.alignment: Qt.AlignHCenter + text: qsTr("Resume Mission From Waypoint %1").arg(globals.guidedControllerFlyView._resumeMissionIndex) + + onClicked: { + globals.guidedControllerFlyView.executeAction(globals.guidedControllerFlyView.actionResumeMission, null, null) + hideDialog() + } + } + + QGCLabel { + Layout.fillWidth: true + wrapMode: Text.WordWrap + text: qsTr("Resume Mission will rebuild the current mission from the last flown waypoint and upload it to the vehicle for the next flight.") } } QGCLabel { Layout.fillWidth: true wrapMode: Text.WordWrap - text: qsTr("Resume Mission will rebuild the current mission from the last flown waypoint and upload it to the vehicle for the next flight.") + color: qgcPal.warningText + text: qsTr("If you are changing batteries for Resume Mission do not disconnect from the vehicle.") + visible: globals.guidedControllerFlyView.showResumeMission } } - - QGCLabel { - Layout.fillWidth: true - wrapMode: Text.WordWrap - color: qgcPal.warningText - text: qsTr("If you are changing batteries for Resume Mission do not disconnect from the vehicle.") - visible: globals.guidedControllerFlyView.showResumeMission - } } } } diff --git a/src/FlightDisplay/FlyViewPreFlightChecklistPopup.qml b/src/FlightDisplay/FlyViewPreFlightChecklistPopup.qml index eeff2d4..b3116ab 100644 --- a/src/FlightDisplay/FlyViewPreFlightChecklistPopup.qml +++ b/src/FlightDisplay/FlyViewPreFlightChecklistPopup.qml @@ -44,7 +44,9 @@ QGCPopupDialog { interval: 1000 repeat: false onTriggered: { + // FIXME: What was the visible check in here for if (!_checklistComplete) { + console.log("open", _root.width, _root.height) _root.open() } else { _root.close() diff --git a/src/FlightDisplay/FlyViewToolStripActionList.qml b/src/FlightDisplay/FlyViewToolStripActionList.qml index 331aaea..451a482 100644 --- a/src/FlightDisplay/FlyViewToolStripActionList.qml +++ b/src/FlightDisplay/FlyViewToolStripActionList.qml @@ -28,7 +28,6 @@ ToolStripActionList { GuidedActionLand { }, GuidedActionRTL { }, GuidedActionPause { }, - GuidedActionActionList { }, - GuidedActionGripper { } + GuidedActionActionList { } ] } diff --git a/src/FlightDisplay/FlyViewWidgetLayer.qml b/src/FlightDisplay/FlyViewWidgetLayer.qml index 8f4fbea..76cf0c9 100644 --- a/src/FlightDisplay/FlyViewWidgetLayer.qml +++ b/src/FlightDisplay/FlyViewWidgetLayer.qml @@ -19,6 +19,8 @@ import QtQml.Models 2.1 import QGroundControl 1.0 import QGroundControl.Controls 1.0 +import QGroundControl.Airspace 1.0 +import QGroundControl.Airmap 1.0 import QGroundControl.Controllers 1.0 import QGroundControl.Controls 1.0 import QGroundControl.FactSystem 1.0 @@ -46,22 +48,21 @@ Item { property real _toolsMargin: ScreenTools.defaultFontPixelWidth * 0.75 property rect _centerViewport: Qt.rect(0, 0, width, height) property real _rightPanelWidth: ScreenTools.defaultFontPixelWidth * 30 - property alias _gripperMenu: gripperOptions QGCToolInsets { id: _totalToolInsets - leftEdgeTopInset: toolStrip.leftEdgeTopInset - leftEdgeCenterInset: parentToolInsets.leftEdgeCenterInset - leftEdgeBottomInset: virtualJoystickMultiTouch.visible ? virtualJoystickMultiTouch.leftEdgeBottomInset : parentToolInsets.leftEdgeBottomInset - rightEdgeTopInset: instrumentPanel.rightEdgeTopInset - rightEdgeCenterInset: (telemetryPanel.rightEdgeCenterInset > photoVideoControl.rightEdgeCenterInset) ? telemetryPanel.rightEdgeCenterInset : photoVideoControl.rightEdgeCenterInset - rightEdgeBottomInset: virtualJoystickMultiTouch.visible ? virtualJoystickMultiTouch.rightEdgeBottomInset : parentToolInsets.rightEdgeBottomInset - topEdgeLeftInset: toolStrip.topEdgeLeftInset - topEdgeCenterInset: mapScale.topEdgeCenterInset - topEdgeRightInset: instrumentPanel.topEdgeRightInset - bottomEdgeLeftInset: virtualJoystickMultiTouch.visible ? virtualJoystickMultiTouch.bottomEdgeLeftInset : parentToolInsets.bottomEdgeLeftInset - bottomEdgeCenterInset: telemetryPanel.bottomEdgeCenterInset - bottomEdgeRightInset: virtualJoystickMultiTouch.visible ? virtualJoystickMultiTouch.bottomEdgeRightInset : parentToolInsets.bottomEdgeRightInset + leftEdgeTopInset: toolStrip.leftInset + leftEdgeCenterInset: toolStrip.leftInset + leftEdgeBottomInset: parentToolInsets.leftEdgeBottomInset + rightEdgeTopInset: parentToolInsets.rightEdgeTopInset + rightEdgeCenterInset: parentToolInsets.rightEdgeCenterInset + rightEdgeBottomInset: parentToolInsets.rightEdgeBottomInset + topEdgeLeftInset: parentToolInsets.topEdgeLeftInset + topEdgeCenterInset: parentToolInsets.topEdgeCenterInset + topEdgeRightInset: parentToolInsets.topEdgeRightInset + bottomEdgeLeftInset: parentToolInsets.bottomEdgeLeftInset + bottomEdgeCenterInset: mapScale.centerInset + bottomEdgeRightInset: 0 } FlyViewMissionCompleteDialog { @@ -105,16 +106,6 @@ Item { visible: !multiVehiclePanelSelector.showSingleVehiclePanel } - - GuidedActionConfirm { - anchors.margins: _toolsMargin - anchors.top: parent.top - anchors.horizontalCenter: parent.horizontalCenter - z: QGroundControl.zOrderTopMost - guidedController: _guidedController - guidedValueSlider: _guidedValueSlider - } - FlyViewInstrumentPanel { id: instrumentPanel anchors.margins: _toolsMargin @@ -125,8 +116,7 @@ Item { visible: QGroundControl.corePlugin.options.flyView.showInstrumentPanel && multiVehiclePanelSelector.showSingleVehiclePanel availableHeight: parent.height - y - _toolsMargin - property real rightEdgeTopInset: visible ? parent.width - x : 0 - property real topEdgeRightInset: visible ? y + height : 0 + property real rightInset: visible ? parent.width - x : 0 } PhotoVideoControl { @@ -134,9 +124,6 @@ Item { anchors.margins: _toolsMargin anchors.right: parent.right width: _rightPanelWidth - - property real rightEdgeCenterInset: visible ? parent.width - x : 0 - state: _verticalCenter ? "verticalCenter" : "topAnchor" states: [ State { @@ -165,9 +152,6 @@ Item { x: recalcXPosition() anchors.margins: _toolsMargin - property real bottomEdgeCenterInset: 0 - property real rightEdgeCenterInset: 0 - // States for custom layout support states: [ State { @@ -185,8 +169,6 @@ Item { PropertyChanges { target: telemetryPanel x: recalcXPosition() - bottomEdgeCenterInset: visible ? parent.height-y : 0 - rightEdgeCenterInset: 0 } }, @@ -201,11 +183,6 @@ Item { anchors.right: parent.right anchors.verticalCenter: undefined } - PropertyChanges { - target: telemetryPanel - bottomEdgeCenterInset: 0 - rightEdgeCenterInset: visible ? parent.width - x : 0 - } }, State { @@ -219,11 +196,6 @@ Item { anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter } - PropertyChanges { - target: telemetryPanel - bottomEdgeCenterInset: 0 - rightEdgeCenterInset: visible ? parent.width - x : 0 - } } ] @@ -259,13 +231,6 @@ Item { property bool autoCenterThrottle: QGroundControl.settingsManager.appSettings.virtualJoystickAutoCenterThrottle.rawValue property bool _virtualJoystickEnabled: QGroundControl.settingsManager.appSettings.virtualJoystick.rawValue - - property real bottomEdgeLeftInset: parent.height-y - property real bottomEdgeRightInset: parent.height-y - - // Width is difficult to access directly hence this hack which may not work in all circumstances - property real leftEdgeBottomInset: visible ? bottomEdgeLeftInset + width/18 - ScreenTools.defaultFontPixelHeight*2 : 0 - property real rightEdgeBottomInset: visible ? bottomEdgeRightInset + width/18 - ScreenTools.defaultFontPixelHeight*2 : 0 } FlyViewToolStrip { @@ -278,15 +243,17 @@ Item { maxHeight: parent.height - y - parentToolInsets.bottomEdgeLeftInset - _toolsMargin visible: !QGroundControl.videoManager.fullScreen - onDisplayPreFlightChecklist: preFlightChecklistPopup.createObject(mainWindow).open() + onDisplayPreFlightChecklist: mainWindow.showPopupDialogFromComponent(preFlightChecklistPopup) - - property real topEdgeLeftInset: visible ? y + height : 0 - property real leftEdgeTopInset: visible ? x + width : 0 + property real leftInset: x + width } - GripperMenu { - id: gripperOptions + FlyViewAirspaceIndicator { + anchors.top: parent.top + anchors.topMargin: ScreenTools.defaultFontPixelHeight * 0.25 + anchors.horizontalCenter: parent.horizontalCenter + z: QGroundControl.zOrderWidgets + show: mapControl.pipState.state !== mapControl.pipState.pipState } VehicleWarnings { @@ -303,7 +270,7 @@ Item { buttonsOnLeft: false visible: !ScreenTools.isTinyScreen && QGroundControl.corePlugin.options.flyView.showMapScale && mapControl.pipState.state === mapControl.pipState.fullState - property real topEdgeCenterInset: visible ? y + height : 0 + property real centerInset: visible ? parent.height - y : 0 } Component { diff --git a/src/FlightDisplay/GripperMenu.qml b/src/FlightDisplay/GripperMenu.qml deleted file mode 100644 index b1c863e..0000000 --- a/src/FlightDisplay/GripperMenu.qml +++ /dev/null @@ -1,71 +0,0 @@ - -import QtQuick 2.3 -import QtQuick.Controls 1.2 -import QtQuick.Controls.Styles 1.4 -import QtQuick.Dialogs 1.2 -import QtLocation 5.3 -import QtPositioning 5.3 -import QtQuick.Layouts 1.2 - -import QGroundControl 1.0 -import QGroundControl.ScreenTools 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.Palette 1.0 -import QGroundControl.Vehicle 1.0 -import QGroundControl.FlightMap 1.0 - -Component { - id: messageDialogComponent - QGCPopupDialog { - title: "Select one action" - property var acceptFunction: null - buttons: StandardButton.Cancel - - onRejected:{ - _guidedController._gripperFunction = Vehicle.Invalid_option - _guidedController.closeAll() - close() - } - - onAccepted: { - if (acceptFunction) { - _guidedController._gripperFunction = Vehicle.Invalid_option - close() - } - } - - RowLayout { - QGCColumnButton { - id: grabButton - text: "Grab" - iconSource: "/res/GripperGrab.svg" - pointSize: ScreenTools.defaultFontPointSize * 3.5 - backRadius: width / 40 - heightFactor: 0.75 - Layout.preferredHeight: releaseButton.height - Layout.preferredWidth: releaseButton.width - - onClicked: { - _guidedController._gripperFunction = Vehicle.Gripper_grab - close() - } - } - - QGCColumnButton { - id: releaseButton - text: "Release" - iconSource: "/res/GripperRelease.svg" - pointSize: ScreenTools.defaultFontPointSize * 3.5 - backRadius: width / 40 - heightFactor: 0.75 - Layout.preferredWidth: ScreenTools.defaultFontPixelWidth * 27 - Layout.preferredHeight: Layout.preferredWidth / 1.20 - - onClicked: { - _guidedController._gripperFunction = Vehicle.Gripper_release - close() - } - } - } - } -} diff --git a/src/FlightDisplay/GuidedActionConfirm.qml b/src/FlightDisplay/GuidedActionConfirm.qml index b01dce3..63272eb 100644 --- a/src/FlightDisplay/GuidedActionConfirm.qml +++ b/src/FlightDisplay/GuidedActionConfirm.qml @@ -17,15 +17,15 @@ import QGroundControl.Controls 1.0 import QGroundControl.Palette 1.0 Rectangle { - id: _root - width: ScreenTools.defaultFontPixelWidth * 45 - height: mainLayout.height + (_margins * 2) - radius: ScreenTools.defaultFontPixelWidth / 2 - color: qgcPal.window - visible: false + id: _root + Layout.minimumWidth: mainLayout.width + (_margins * 2) + Layout.preferredHeight: mainLayout.height + (_margins * 2) + radius: ScreenTools.defaultFontPixelWidth / 2 + color: qgcPal.windowShadeLight + visible: false property var guidedController - property var guidedValueSlider + property var altitudeSlider property string title // Currently unused property alias message: messageText.text property int action @@ -40,12 +40,6 @@ Rectangle { Component.onCompleted: guidedController.confirmDialog = this - onVisibleChanged: { - if (visible) { - slider.focus = true - } - } - onHideTriggerChanged: { if (hideTrigger) { confirmCancelled() @@ -63,7 +57,7 @@ Rectangle { } function confirmCancelled() { - guidedValueSlider.visible = false + altitudeSlider.visible = false visible = false hideTrigger = false visibleTimer.stop() @@ -83,18 +77,15 @@ Rectangle { QGCPalette { id: qgcPal } ColumnLayout { - id: mainLayout - anchors.margins: _margins - anchors.left: parent.left - anchors.right: parent.right - spacing: _margins + id: mainLayout + anchors.horizontalCenter: parent.horizontalCenter + spacing: _margins QGCLabel { id: messageText Layout.fillWidth: true horizontalAlignment: Text.AlignHCenter wrapMode: Text.WordWrap - font.pointSize: ScreenTools.mediumFontPointSize } QGCCheckBox { @@ -105,23 +96,23 @@ Rectangle { } RowLayout { - Layout.fillWidth: true - spacing: ScreenTools.defaultFontPixelWidth + Layout.alignment: Qt.AlignHCenter + spacing: ScreenTools.defaultFontPixelWidth SliderSwitch { - id: slider - confirmText: ScreenTools.isMobile ? qsTr("Slide to confirm") : qsTr("Slide or hold spacebar") - Layout.fillWidth: true + id: slider + confirmText: qsTr("Slide to confirm") + Layout.minimumWidth: Math.max(implicitWidth, ScreenTools.defaultFontPixelWidth * 30) onAccept: { _root.visible = false - var sliderOutputValue = 0 - if (guidedValueSlider.visible) { - sliderOutputValue = guidedValueSlider.getOutputValue() - guidedValueSlider.visible = false + var altitudeChange = 0 + if (altitudeSlider.visible) { + altitudeChange = altitudeSlider.getAltitudeChangeValue() + altitudeSlider.visible = false } hideTrigger = false - guidedController.executeAction(_root.action, _root.actionData, sliderOutputValue, _root.optionChecked) + guidedController.executeAction(_root.action, _root.actionData, altitudeChange, _root.optionChecked) if (mapIndicator) { mapIndicator.actionConfirmed() mapIndicator = undefined diff --git a/src/FlightDisplay/GuidedActionGripper.qml b/src/FlightDisplay/GuidedActionGripper.qml deleted file mode 100644 index cddb3c4..0000000 --- a/src/FlightDisplay/GuidedActionGripper.qml +++ /dev/null @@ -1,24 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2020 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -import QGroundControl.FlightDisplay 1.0 -import QGroundControl 1.0 - -GuidedToolStripAction { - property var activeVehicle: QGroundControl.multiVehicleManager.activeVehicle - property bool _initialConnectComplete: activeVehicle ? activeVehicle.initialConnectComplete : false - property bool _grip_enable: _initialConnectComplete ? activeVehicle.hasGripper : false - property bool _isVehicleArmed: _initialConnectComplete ? activeVehicle.armed : false - - text: "Gripper" - iconSource: "/res/Gripper.svg" - visible: !_isVehicleArmed && _grip_enable // in this way if the pilot it's on the ground can release the cargo without actions tool - enabled: _grip_enable - actionID: _guidedController.actionGripper -} diff --git a/src/FlightDisplay/GuidedActionList.qml b/src/FlightDisplay/GuidedActionList.qml index 6b494d7..f72e253 100644 --- a/src/FlightDisplay/GuidedActionList.qml +++ b/src/FlightDisplay/GuidedActionList.qml @@ -14,7 +14,6 @@ import QtQuick.Layouts 1.2 import QGroundControl 1.0 import QGroundControl.ScreenTools 1.0 import QGroundControl.Controls 1.0 -import QGroundControl.Controllers 1.0 import QGroundControl.FlightDisplay 1.0 import QGroundControl.Palette 1.0 @@ -29,7 +28,7 @@ Rectangle { visible: false property var guidedController - property var guidedValueSlider + property var altitudeSlider function show() { visible = true @@ -63,26 +62,9 @@ Rectangle { text: guidedController.landAbortMessage, action: guidedController.actionLandAbort, visible: guidedController.showLandAbort - }, - { - title: guidedController.changeSpeedTitle, - text: guidedController.changeSpeedMessage, - action: guidedController.actionChangeSpeed, - visible: guidedController.showChangeSpeed - }, - { - title: guidedController.gripperTitle, - text: guidedController.gripperMessage, - action: guidedController.actionGripper, - visible: guidedController.showGripper } ] - property var _customManager: CustomActionManager { - id: customManager - } - readonly property bool hasCustomActions: QGroundControl.settingsManager.flyViewSettings.enableCustomActions.rawValue && customManager.hasActions - QGCPalette { id: qgcPal } DeadMouseArea { @@ -108,13 +90,12 @@ Rectangle { Layout.minimumWidth: _width Layout.maximumWidth: _width - property real _width: Math.min((_actionWidth * 3) + _actionHorizSpacing*2, actionRow.width) + property real _width: Math.min((_actionWidth * 2) + _actionHorizSpacing, actionRow.width) RowLayout { id: actionRow spacing: _actionHorizSpacing - // These are the pre-defined Actions Repeater { id: actionRepeater model: _model @@ -132,6 +113,8 @@ Rectangle { Layout.minimumWidth: _actionWidth Layout.maximumWidth: _actionWidth Layout.fillHeight: true + + property real _width: ScreenTools.defaultFontPixelWidth * 25 } QGCButton { @@ -144,41 +127,8 @@ Rectangle { guidedController.confirmAction(modelData.action) } } - } // ColumnLayout - } // Repeater - - // These are the user-defined Custom Actions - Repeater { - id: customRepeater - model: customManager.actions - - ColumnLayout { - spacing: ScreenTools.defaultFontPixelHeight / 2 - visible: _root.hasCustomActions - Layout.fillHeight: true - - QGCLabel { - id: customMessage - text: "Custom Action #" + (index + 1) - horizontalAlignment: Text.AlignHCenter - wrapMode: Text.WordWrap - Layout.minimumWidth: _actionWidth - Layout.maximumWidth: _actionWidth - Layout.fillHeight: true - } - - QGCButton { - id: customButton - text: object.label - Layout.alignment: Qt.AlignCenter - - onClicked: { - var vehicle = QGroundControl.multiVehicleManager.activeVehicle - object.sendTo(vehicle) - } - } - } // ColumnLayout - } // Repeater + } + } } } } diff --git a/src/FlightDisplay/GuidedActionsController.qml b/src/FlightDisplay/GuidedActionsController.qml index 2698535..4d533d2 100644 --- a/src/FlightDisplay/GuidedActionsController.qml +++ b/src/FlightDisplay/GuidedActionsController.qml @@ -30,7 +30,7 @@ Item { property var missionController property var confirmDialog property var actionList - property var guidedValueSlider + property var altitudeSlider property var orbitMapCircle readonly property string emergencyStopTitle: qsTr("EMERGENCY STOP") @@ -39,7 +39,6 @@ Item { readonly property string disarmTitle: qsTr("Disarm") readonly property string rtlTitle: qsTr("Return") readonly property string takeoffTitle: qsTr("Takeoff") - readonly property string gripperTitle: qsTr("Gripper Function") readonly property string landTitle: qsTr("Land") readonly property string startMissionTitle: qsTr("Start Mission") readonly property string mvStartMissionTitle: qsTr("Start Mission (MV)") @@ -48,15 +47,12 @@ Item { readonly property string pauseTitle: qsTr("Pause") readonly property string mvPauseTitle: qsTr("Pause (MV)") readonly property string changeAltTitle: qsTr("Change Altitude") - readonly property string changeCruiseSpeedTitle: qsTr("Change Max Ground Speed") - readonly property string changeAirspeedTitle: qsTr("Change Airspeed") readonly property string orbitTitle: qsTr("Orbit") readonly property string landAbortTitle: qsTr("Land Abort") readonly property string setWaypointTitle: qsTr("Set Waypoint") readonly property string gotoTitle: qsTr("Go To Location") readonly property string vtolTransitionTitle: qsTr("VTOL Transition") readonly property string roiTitle: qsTr("ROI") - readonly property string setHomeTitle: qsTr("Set Home") readonly property string actionListTitle: qsTr("Action") readonly property string armMessage: qsTr("Arm the vehicle.") @@ -64,15 +60,12 @@ Item { readonly property string disarmMessage: qsTr("Disarm the vehicle") readonly property string emergencyStopMessage: qsTr("WARNING: THIS WILL STOP ALL MOTORS. IF VEHICLE IS CURRENTLY IN THE AIR IT WILL CRASH.") readonly property string takeoffMessage: qsTr("Takeoff from ground and hold position.") - readonly property string gripperMessage: qsTr("Grab or Release the cargo") readonly property string startMissionMessage: qsTr("Takeoff from ground and start the current mission.") readonly property string continueMissionMessage: qsTr("Continue the mission from the current waypoint.") readonly property string resumeMissionUploadFailMessage: qsTr("Upload of resume mission failed. Confirm to retry upload") readonly property string landMessage: qsTr("Land the vehicle at the current position.") readonly property string rtlMessage: qsTr("Return to the launch position of the vehicle.") readonly property string changeAltMessage: qsTr("Change the altitude of the vehicle up or down.") - readonly property string changeCruiseSpeedMessage: qsTr("Change the maximum horizontal cruise speed.") - readonly property string changeAirspeedMessage: qsTr("Change the equivalent airspeed setpoint") readonly property string gotoMessage: qsTr("Move the vehicle to the specified location.") property string setWaypointMessage: qsTr("Adjust current waypoint to %1.").arg(_actionData) readonly property string orbitMessage: qsTr("Orbit the vehicle around the specified location.") @@ -82,7 +75,6 @@ Item { readonly property string vtolTransitionFwdMessage: qsTr("Transition VTOL to fixed wing flight.") readonly property string vtolTransitionMRMessage: qsTr("Transition VTOL to multi-rotor flight.") readonly property string roiMessage: qsTr("Make the specified location a Region Of Interest.") - readonly property string setHomeMessage: qsTr("Set vehicle home as the specified location. This will affect Return to Home position") readonly property int actionRTL: 1 readonly property int actionLand: 2 @@ -108,40 +100,28 @@ Item { readonly property int actionROI: 22 readonly property int actionActionList: 23 readonly property int actionForceArm: 24 - readonly property int actionChangeSpeed: 25 - readonly property int actionGripper: 26 - readonly property int actionSetHome: 27 property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle property bool _useChecklist: QGroundControl.settingsManager.appSettings.useChecklist.rawValue && QGroundControl.corePlugin.options.preFlightChecklistUrl.toString().length property bool _enforceChecklist: _useChecklist && QGroundControl.settingsManager.appSettings.enforceChecklist.rawValue - property bool _checklistPassed: _activeVehicle ? (_useChecklist ? (_enforceChecklist ? _activeVehicle.checkListState === Vehicle.CheckListPassed : true) : true) : true - property bool _canArm: _activeVehicle ? (_checklistPassed && (!_activeVehicle.healthAndArmingCheckReport.supported || _activeVehicle.healthAndArmingCheckReport.canArm)) : false - property bool _canTakeoff: _activeVehicle ? (_checklistPassed && (!_activeVehicle.healthAndArmingCheckReport.supported || _activeVehicle.healthAndArmingCheckReport.canTakeoff)) : false - property bool _canStartMission: _activeVehicle ? (_checklistPassed && (!_activeVehicle.healthAndArmingCheckReport.supported || _activeVehicle.healthAndArmingCheckReport.canStartMission)) : false - property bool _initialConnectComplete: _activeVehicle ? _activeVehicle.initialConnectComplete : false + property bool _canArm: _activeVehicle ? (_useChecklist ? (_enforceChecklist ? _activeVehicle.checkListState === Vehicle.CheckListPassed : true) : true) : false property bool showEmergenyStop: _guidedActionsEnabled && !_hideEmergenyStop && _vehicleArmed && _vehicleFlying property bool showArm: _guidedActionsEnabled && !_vehicleArmed && _canArm property bool showForceArm: _guidedActionsEnabled && !_vehicleArmed property bool showDisarm: _guidedActionsEnabled && _vehicleArmed && !_vehicleFlying property bool showRTL: _guidedActionsEnabled && _vehicleArmed && _activeVehicle.guidedModeSupported && _vehicleFlying && !_vehicleInRTLMode - property bool showTakeoff: _guidedActionsEnabled && _activeVehicle.takeoffVehicleSupported && !_vehicleFlying && _canTakeoff + property bool showTakeoff: _guidedActionsEnabled && _activeVehicle.takeoffVehicleSupported && !_vehicleFlying && _canArm property bool showLand: _guidedActionsEnabled && _activeVehicle.guidedModeSupported && _vehicleArmed && !_activeVehicle.fixedWing && !_vehicleInLandMode - property bool showStartMission: _guidedActionsEnabled && _missionAvailable && !_missionActive && !_vehicleFlying && _canStartMission + property bool showStartMission: _guidedActionsEnabled && _missionAvailable && !_missionActive && !_vehicleFlying && _canArm property bool showContinueMission: _guidedActionsEnabled && _missionAvailable && !_missionActive && _vehicleArmed && _vehicleFlying && (_currentMissionIndex < _missionItemCount - 1) property bool showPause: _guidedActionsEnabled && _vehicleArmed && _activeVehicle.pauseVehicleSupported && _vehicleFlying && !_vehiclePaused && !_fixedWingOnApproach property bool showChangeAlt: _guidedActionsEnabled && _vehicleFlying && _activeVehicle.guidedModeSupported && _vehicleArmed && !_missionActive - property bool showChangeSpeed: _guidedActionsEnabled && _vehicleFlying && _activeVehicle.guidedModeSupported && _vehicleArmed && !_missionActive && _speedLimitsAvailable property bool showOrbit: _guidedActionsEnabled && _vehicleFlying && __orbitSupported && !_missionActive property bool showROI: _guidedActionsEnabled && _vehicleFlying && __roiSupported && !_missionActive property bool showLandAbort: _guidedActionsEnabled && _vehicleFlying && _fixedWingOnApproach property bool showGotoLocation: _guidedActionsEnabled && _vehicleFlying - property bool showSetHome: _guidedActionsEnabled - property bool showActionList: _guidedActionsEnabled && (showStartMission || showResumeMission || showChangeAlt || showLandAbort || actionList.hasCustomActions) - property bool showGripper: _initialConnectComplete ? _activeVehicle.hasGripper : false - property string changeSpeedTitle: _fixedWing ? changeAirspeedTitle : changeCruiseSpeedTitle - property string changeSpeedMessage: _fixedWing ? changeAirspeedMessage : changeCruiseSpeedMessage + property bool showActionList: _guidedActionsEnabled && (showStartMission || showResumeMission || showChangeAlt || showLandAbort) // Note: The '_missionItemCount - 2' is a hack to not trigger resume mission when a mission ends with an RTL item property bool showResumeMission: _activeVehicle && !_vehicleArmed && _vehicleWasFlying && _missionAvailable && _resumeMissionIndex > 0 && (_resumeMissionIndex < _missionItemCount - 2) @@ -170,9 +150,6 @@ Item { property bool _vehicleWasFlying: false property bool _rcRSSIAvailable: _activeVehicle ? _activeVehicle.rcRSSI > 0 && _activeVehicle.rcRSSI <= 100 : false property bool _fixedWingOnApproach: _activeVehicle ? _activeVehicle.fixedWing && _vehicleLanding : false - property bool _fixedWing: _activeVehicle ? _activeVehicle.fixedWing || _activeVehicle.vtolInFwdFlight : false - property bool _speedLimitsAvailable: _activeVehicle && ((_fixedWing && _activeVehicle.haveFWSpeedLimits) || (!_fixedWing && _activeVehicle.haveMRSpeedLimits)) - property var _gripperFunction: undefined // You can turn on log output for GuidedActionsController by turning on GuidedActionsControllerLog category property bool __guidedModeSupported: _activeVehicle ? _activeVehicle.guidedModeSupported : false @@ -187,34 +164,6 @@ Item { } } - function setupSlider(actionCode) { - // generic defaults - guidedValueSlider.configureAsLinearSlider() - guidedValueSlider.setIsSpeedSlider(false) - - if (actionCode === actionTakeoff) { - guidedValueSlider.setMinVal(_activeVehicle.minimumTakeoffAltitude()) - guidedValueSlider.setValue(_activeVehicle ? _activeVehicle.minimumTakeoffAltitude() : 0) - guidedValueSlider.setDisplayText("Height") - } else if (actionCode === actionChangeSpeed) { - guidedValueSlider.setIsSpeedSlider(true) - if (_fixedWing) { - guidedValueSlider.setDisplayText("Set Airspeed") - guidedValueSlider.setMinVal(QGroundControl.unitsConversion.metersSecondToAppSettingsSpeedUnits(_activeVehicle.minimumEquivalentAirspeed()).toFixed(1)) - guidedValueSlider.setMaxVal(QGroundControl.unitsConversion.metersSecondToAppSettingsSpeedUnits(_activeVehicle.maximumEquivalentAirspeed()).toFixed(1)) - guidedValueSlider.setValue(_activeVehicle.airSpeed.value) - } else if (!_fixedWing && _activeVehicle.haveMRSpeedLimits) { - guidedValueSlider.setDisplayText("Set Speed") - guidedValueSlider.setMinVal(QGroundControl.unitsConversion.metersSecondToAppSettingsSpeedUnits(0.1).toFixed(1)) - guidedValueSlider.setMaxVal(QGroundControl.unitsConversion.metersSecondToAppSettingsSpeedUnits(_activeVehicle.maximumHorizontalSpeedMultirotor()).toFixed(1)) - guidedValueSlider.setValue(QGroundControl.unitsConversion.metersSecondToAppSettingsSpeedUnits(_activeVehicle.maximumHorizontalSpeedMultirotor()/2).toFixed(1)) - } - } else if (actionCode === actionChangeAlt || actionCode === actionOrbit || actionCode === actionGoto || actionCode === actionPause) { - guidedValueSlider.setDisplayText("New Alt(rel)") - guidedValueSlider.configureAsRelativeAltSliderExp() - } - } - on_ActiveVehicleChanged: _outputState() Component.onCompleted: _outputState() @@ -359,7 +308,7 @@ Item { function closeAll() { confirmDialog.visible = false actionList.visible = false - guidedValueSlider.visible = false + altitudeSlider.visible = false } // Called when an action is about to be executed in order to confirm @@ -372,9 +321,6 @@ Item { confirmDialog.mapIndicator = mapIndicator confirmDialog.optionText = "" _actionData = actionData - - setupSlider(actionCode) - switch (actionCode) { case actionArm: if (_vehicleFlying || !_guidedActionsEnabled) { @@ -406,7 +352,8 @@ Item { confirmDialog.title = takeoffTitle confirmDialog.message = takeoffMessage confirmDialog.hideTrigger = Qt.binding(function() { return !showTakeoff }) - guidedValueSlider.visible = true + altitudeSlider.setToMinimumTakeoff() + altitudeSlider.visible = true break; case actionStartMission: showImmediate = false @@ -451,7 +398,8 @@ Item { confirmDialog.title = changeAltTitle confirmDialog.message = changeAltMessage confirmDialog.hideTrigger = Qt.binding(function() { return !showChangeAlt }) - guidedValueSlider.visible = true + altitudeSlider.reset() + altitudeSlider.visible = true break; case actionGoto: confirmDialog.title = gotoTitle @@ -466,7 +414,8 @@ Item { confirmDialog.title = orbitTitle confirmDialog.message = orbitMessage confirmDialog.hideTrigger = Qt.binding(function() { return !showOrbit }) - guidedValueSlider.visible = true + altitudeSlider.reset() + altitudeSlider.visible = true break; case actionLandAbort: confirmDialog.title = landAbortTitle @@ -477,7 +426,8 @@ Item { confirmDialog.title = pauseTitle confirmDialog.message = pauseMessage confirmDialog.hideTrigger = Qt.binding(function() { return !showPause }) - guidedValueSlider.visible = true + altitudeSlider.reset() + altitudeSlider.visible = true break; case actionMVPause: confirmDialog.title = mvPauseTitle @@ -502,23 +452,6 @@ Item { case actionActionList: actionList.show() return - case actionChangeSpeed: - confirmDialog.hideTrigger = true - confirmDialog.title = changeSpeedTitle - confirmDialog.message = changeSpeedMessage - guidedValueSlider.visible = true - break - case actionGripper: - confirmDialog.hideTrigger = true - confirmDialog.title = gripperTitle - confirmDialog.message = gripperMessage - _widgetLayer._gripperMenu.createObject(mainWindow).open() - break - case actionSetHome: - confirmDialog.title = setHomeTitle - confirmDialog.message = setHomeMessage - confirmDialog.hideTrigger = Qt.binding(function() { return !showSetHome }) - break default: console.warn("Unknown actionCode", actionCode) return @@ -527,7 +460,7 @@ Item { } // Executes the specified action - function executeAction(actionCode, actionData, sliderOutputValue, optionChecked) { + function executeAction(actionCode, actionData, actionAltitudeChange, optionChecked) { var i; var rgVehicle; switch (actionCode) { @@ -538,7 +471,7 @@ Item { _activeVehicle.guidedModeLand() break case actionTakeoff: - _activeVehicle.guidedModeTakeoff(sliderOutputValue) + _activeVehicle.guidedModeTakeoff(actionAltitudeChange) break case actionResumeMission: case actionResumeMissionUploadFail: @@ -567,7 +500,7 @@ Item { _activeVehicle.emergencyStop() break case actionChangeAlt: - _activeVehicle.guidedModeChangeAltitude(sliderOutputValue, false /* pauseVehicle */) + _activeVehicle.guidedModeChangeAltitude(actionAltitudeChange, false /* pauseVehicle */) break case actionGoto: _activeVehicle.guidedModeGotoLocation(actionData) @@ -576,13 +509,13 @@ Item { _activeVehicle.setCurrentMissionSequence(actionData) break case actionOrbit: - _activeVehicle.guidedModeOrbit(orbitMapCircle.center, orbitMapCircle.radius() * (orbitMapCircle.clockwiseRotation ? 1 : -1), _activeVehicle.altitudeAMSL.rawValue + sliderOutputValue) + _activeVehicle.guidedModeOrbit(orbitMapCircle.center, orbitMapCircle.radius() * (orbitMapCircle.clockwiseRotation ? 1 : -1), _activeVehicle.altitudeAMSL.rawValue + actionAltitudeChange) break case actionLandAbort: _activeVehicle.abortLanding(50) // hardcoded value for climbOutAltitude that is currently ignored break case actionPause: - _activeVehicle.guidedModeChangeAltitude(sliderOutputValue, true /* pauseVehicle */) + _activeVehicle.guidedModeChangeAltitude(actionAltitudeChange, true /* pauseVehicle */) break case actionMVPause: rgVehicle = QGroundControl.multiVehicleManager.vehicles @@ -599,23 +532,6 @@ Item { case actionROI: _activeVehicle.guidedModeROI(actionData) break - case actionChangeSpeed: - if (_activeVehicle) { - // We need to convert back to m/s as that is what mavlink standard uses for MAV_CMD_DO_CHANGE_SPEED - var metersSecondSpeed = QGroundControl.unitsConversion.appSettingsSpeedUnitsToMetersSecond(sliderOutputValue).toFixed(1) - if (_activeVehicle.vtolInFwdFlight || _activeVehicle.fixedWing) { - _activeVehicle.guidedModeChangeEquivalentAirspeedMetersSecond(metersSecondSpeed) - } else { - _activeVehicle.guidedModeChangeGroundSpeedMetersSecond(metersSecondSpeed) - } - } - break - case actionGripper: - _gripperFunction === undefined ? _activeVehicle.sendGripperAction(Vehicle.Invalid_option) : _activeVehicle.sendGripperAction(_gripperFunction) - break - case actionSetHome: - _activeVehicle.doSetHome(actionData) - break default: console.warn(qsTr("Internal error: unknown actionCode"), actionCode) break diff --git a/src/FlightDisplay/GuidedAltitudeSlider.qml b/src/FlightDisplay/GuidedAltitudeSlider.qml new file mode 100644 index 0000000..39e4bd8 --- /dev/null +++ b/src/FlightDisplay/GuidedAltitudeSlider.qml @@ -0,0 +1,106 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +import QtQuick 2.3 +import QtQuick.Controls 1.2 + +import QGroundControl 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.Vehicle 1.0 + +/// Altitude slider for guided change altitude command +Rectangle { + id: _root + + readonly property real _maxAlt: 121.92 // 400 feet + readonly property real _minAlt: 3 + + property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle + property var _flyViewSettings: QGroundControl.settingsManager.flyViewSettings + property real _vehicleAltitude: _activeVehicle ? _activeVehicle.altitudeRelative.rawValue : 0 + property bool _fixedWing: _activeVehicle ? _activeVehicle.fixedWing : false + property real _sliderMaxAlt: _flyViewSettings ? _flyViewSettings.guidedMaximumAltitude.rawValue : 0 + property real _sliderMinAlt: _flyViewSettings ? _flyViewSettings.guidedMinimumAltitude.rawValue : 0 + property bool _flying: _activeVehicle ? _activeVehicle.flying : false + + function reset() { + altSlider.value = 0 + } + + function setToMinimumTakeoff() { + altField.setToMinimumTakeoff() + } + + /// Returns the user specified change in altitude from the current vehicle altitude + function getAltitudeChangeValue() { + return altField.newAltitudeMeters - _vehicleAltitude + } + + function log10(value) { + if (value === 0) { + return 0 + } else { + return Math.log(value) / Math.LN10 + } + } + + Column { + id: headerColumn + anchors.margins: _margins + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + + QGCLabel { + anchors.left: parent.left + anchors.right: parent.right + wrapMode: Text.WordWrap + horizontalAlignment: Text.AlignHCenter + text: qsTr("New Alt(rel)") + } + + QGCLabel { + id: altField + anchors.horizontalCenter: parent.horizontalCenter + text: newAltitudeAppUnits + " " + QGroundControl.unitsConversion.appSettingsHorizontalDistanceUnitsString + + property real altGainRange: Math.max(_sliderMaxAlt - _vehicleAltitude, 0) + property real altLossRange: Math.max(_vehicleAltitude - _sliderMinAlt, 0) + property real altExp: Math.pow(altSlider.value, 3) + property real altLossGain: altExp * (altSlider.value > 0 ? altGainRange : altLossRange) + property real newAltitudeMeters: _vehicleAltitude + altLossGain + property string newAltitudeAppUnits: QGroundControl.unitsConversion.metersToAppSettingsHorizontalDistanceUnits(newAltitudeMeters).toFixed(1) + + function setToMinimumTakeoff() { + altSlider.value = Math.pow(_activeVehicle.minimumTakeoffAltitude() / altGainRange, 1.0/3.0) + } + } + } + + QGCSlider { + id: altSlider + anchors.margins: _margins + anchors.top: headerColumn.bottom + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + orientation: Qt.Vertical + minimumValue: _flying ? -1 : 0 + maximumValue: 1 + zeroCentered: true + rotation: 180 + + // We want slide up to be positive values + transform: Rotation { + origin.x: altSlider.width / 2 + origin.y: altSlider.height / 2 + angle: 180 + } + } +} diff --git a/src/FlightDisplay/GuidedValueSlider.qml b/src/FlightDisplay/GuidedValueSlider.qml deleted file mode 100644 index a7487c6..0000000 --- a/src/FlightDisplay/GuidedValueSlider.qml +++ /dev/null @@ -1,179 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2020 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -import QtQuick 2.3 -import QtQuick.Controls 1.2 - -import QGroundControl 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.Vehicle 1.0 -import QGroundControl.Palette 1.0 - -Rectangle { - id: _root - - property var _flyViewSettings: QGroundControl.settingsManager.flyViewSettings - property real _vehicleAltitude: _activeVehicle ? _activeVehicle.altitudeRelative.rawValue : 0 - property bool _fixedWing: _activeVehicle ? _activeVehicle.fixedWing : false - property real _sliderMaxVal: _flyViewSettings ? _flyViewSettings.guidedMaximumAltitude.rawValue : 0 - property real _sliderMinVal: _flyViewSettings ? _flyViewSettings.guidedMinimumAltitude.rawValue : 0 - property real _sliderCenterValue: _vehicleAltitude - property string _displayText: "" - property bool _altSlider: true - property bool _speedSlider: false - - property var sliderValue : valueSlider.value - - onSliderValueChanged: { - valueField.updateFunction(sliderValue) - } - - on_SliderCenterValueChanged: { - valueField.updateFunction(sliderValue) - } - - function setValue(val) { - valueSlider.value = valueField.getSliderValueFromOutput(val) - valueField.updateFunction(valueSlider.value) - } - - function configureAsRelativeAltSliderExp() { - _sliderMaxVal = _flyViewSettings ? _flyViewSettings.guidedMaximumAltitude.rawValue : 0 - _sliderMinVal = _flyViewSettings ? _flyViewSettings.guidedMinimumAltitude.rawValue : 0 - _sliderCenterValue = Qt.binding(function() { return _vehicleAltitude }) - _altSlider = true - valueField.updateFunction = valueField.updateExpAroundCenterValue - valueSlider.value = 0 - valueField.updateFunction(sliderValue) - - } - - function configureAsLinearSlider() { - _altSlider = false - valueField.updateFunction = valueField.updateLinear - - } - - function setMinVal(min_val) { - _sliderMinVal = min_val - } - - function setMaxVal(max_val) { - _sliderMaxVal = max_val - } - - function setCenterValue(center) { - _sliderCenterValue = center - } - - function setDisplayText(text) { - _displayText = text - } - - function setIsSpeedSlider(isSpeed) { - _speedSlider = isSpeed - } - - function getOutputValue() { - if (_altSlider) { - return valueField.newValue - _sliderCenterValue - } else { - return valueField.newValue - } - } - - Column { - id: headerColumn - anchors.margins: _margins - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right - - QGCLabel { - anchors.left: parent.left - anchors.right: parent.right - wrapMode: Text.WordWrap - horizontalAlignment: Text.AlignHCenter - text: _displayText - } - - QGCLabel { - id: valueField - anchors.horizontalCenter: parent.horizontalCenter - text: newValueAppUnits + " " + (_speedSlider ? QGroundControl.unitsConversion.appSettingsSpeedUnitsString - : QGroundControl.unitsConversion.appSettingsHorizontalDistanceUnitsString) - - property real newValue - property string newValueAppUnits - - property var updateFunction : updateExpAroundCenterValue - - function updateExpAroundCenterValue(value) { - var decreaseRange = Math.max(_sliderCenterValue - _sliderMinVal, 0) - var increaseRange = Math.max(_sliderMaxVal - _sliderCenterValue, 0) - var valExp = Math.pow(valueSlider.value, 3) - var delta = valExp * (valueSlider.value > 0 ? increaseRange : decreaseRange) - newValue = _sliderCenterValue + delta - newValueAppUnits = QGroundControl.unitsConversion.metersToAppSettingsHorizontalDistanceUnits(newValue).toFixed(1) - } - - function updateLinear(value) { - // value is between -1 and 1 - newValue = _sliderMinVal + (value + 1) * 0.5 * (_sliderMaxVal - _sliderMinVal) - if (_speedSlider) { - // Already working in converted units - newValueAppUnits = newValue.toFixed(1) - } else { - newValueAppUnits = QGroundControl.unitsConversion.metersToAppSettingsHorizontalDistanceUnits(newValue).toFixed(1) - } - } - - function getSliderValueFromOutputLinear(val) { - return 2 * (val - _sliderMinVal) / (_sliderMaxVal - _sliderMinVal) - 1 - } - - function getSliderValueFromOutputExp(val) { - if (val >= _sliderCenterValue) { - return Math.pow(val / Math.max(_sliderMaxVal - _sliderCenterValue, 0), 1.0/3.0) - } else { - return -Math.pow(val / Math.max(_sliderCenterValue - _sliderMinVal, 0), 1.0/3.0) - } - } - - function getSliderValueFromOutput(output) { - if (updateFunction == updateExpAroundCenterValue) { - return getSliderValueFromOutputExp(output) - } else { - return getSliderValueFromOutputLinear(output) - } - } - } - } - - QGCSlider { - id: valueSlider - anchors.margins: _margins - anchors.top: headerColumn.bottom - anchors.bottom: parent.bottom - anchors.left: parent.left - anchors.right: parent.right - orientation: Qt.Vertical - minimumValue: -1 - maximumValue: 1 - zeroCentered: false - rotation: 180 - - // We want slide up to be positive values - transform: Rotation { - origin.x: valueSlider.width / 2 - origin.y: valueSlider.height / 2 - angle: 180 - } - } -} diff --git a/src/FlightDisplay/TelemetryValuesBar.qml b/src/FlightDisplay/TelemetryValuesBar.qml index 136cfe1..b5c8a9c 100644 --- a/src/FlightDisplay/TelemetryValuesBar.qml +++ b/src/FlightDisplay/TelemetryValuesBar.qml @@ -92,17 +92,8 @@ Rectangle { y: telemetryLayout.y width: telemetryLayout.width height: telemetryLayout.height - hoverEnabled: !ScreenTools.isMobile + hoverEnabled: true propagateComposedEvents: true - - onClicked: { - if (ScreenTools.isMobile && !valueArea.settingsUnlocked) { - valueArea.settingsUnlocked = true - mouse.accepted = true - } else { - mouse.accepted = false - } - } } HorizontalFactValueGrid { @@ -110,5 +101,11 @@ Rectangle { userSettingsGroup: telemetryBarUserSettingsGroup defaultSettingsGroup: telemetryBarDefaultSettingsGroup } + + GuidedActionConfirm { + Layout.fillWidth: true + guidedController: _guidedController + altitudeSlider: _guidedAltSlider + } } } diff --git a/src/FlightDisplay/VehicleWarnings.qml b/src/FlightDisplay/VehicleWarnings.qml index 44259a1..3624b0c 100644 --- a/src/FlightDisplay/VehicleWarnings.qml +++ b/src/FlightDisplay/VehicleWarnings.qml @@ -23,7 +23,7 @@ Rectangle { property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle property bool _noGPSLockVisible: _activeVehicle && _activeVehicle.requiresGpsFix && !_activeVehicle.coordinate.isValid - property bool _prearmErrorVisible: _activeVehicle && !_activeVehicle.armed && _activeVehicle.prearmError && !_activeVehicle.healthAndArmingCheckReport.supported + property bool _prearmErrorVisible: _activeVehicle && !_activeVehicle.armed && _activeVehicle.prearmError Column { id: warningsCol diff --git a/src/FlightMap/FlightMap.qml b/src/FlightMap/FlightMap.qml index 7aefc11..0cc1c61 100644 --- a/src/FlightMap/FlightMap.qml +++ b/src/FlightMap/FlightMap.qml @@ -66,13 +66,12 @@ Map { } function centerToSpecifiedLocation() { - specifyMapPositionDialog.createObject(mainWindow).open() + mainWindow.showComponentDialog(specifyMapPositionDialog, qsTr("Specify Position"), mainWindow.showDialogDefaultWidth, StandardButton.Close) } Component { id: specifyMapPositionDialog EditPositionDialog { - title: qsTr("Specify Position") coordinate: center onCoordinateChanged: center = coordinate } @@ -103,11 +102,9 @@ Map { on_ActiveVehicleCoordinateChanged: _possiblyCenterToVehiclePosition() - onMapReadyChanged: { - if (_map.mapReady) { - updateActiveMapType() - _possiblyCenterToVehiclePosition() - } + Component.onCompleted: { + updateActiveMapType() + _possiblyCenterToVehiclePosition() } Connections { diff --git a/src/FlightMap/MapItems/VehicleMapItem.qml b/src/FlightMap/MapItems/VehicleMapItem.qml index 49c8106..176f479 100644 --- a/src/FlightMap/MapItems/VehicleMapItem.qml +++ b/src/FlightMap/MapItems/VehicleMapItem.qml @@ -19,14 +19,12 @@ import QGroundControl.Controls 1.0 /// Marker for displaying a vehicle location on the map MapQuickItem { - id: _root - property var vehicle /// Vehicle object, undefined for ADSB vehicle property var map property double altitude: Number.NaN ///< NAN to not show property string callsign: "" ///< Vehicle callsign property double heading: vehicle ? vehicle.heading.value : Number.NaN ///< Vehicle heading, NAN for none - property real size: ScreenTools.defaultFontPixelHeight * 3 /// Default size for icon, most usage overrides this + property real size: _adsbVehicle ? _adsbSize : _uavSize /// Size for icon property bool alert: false /// Collision alert anchorPoint.x: vehicleItem.width / 2 @@ -35,6 +33,8 @@ MapQuickItem { property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle property bool _adsbVehicle: vehicle ? false : true + property real _uavSize: ScreenTools.defaultFontPixelHeight * 5 + property real _adsbSize: ScreenTools.defaultFontPixelHeight * 2.5 property var _map: map property bool _multiVehicle: QGroundControl.multiVehicleManager.vehicles.count > 1 @@ -65,8 +65,8 @@ MapQuickItem { id: vehicleIcon source: _adsbVehicle ? (alert ? "/qmlimages/AlertAircraft.svg" : "/qmlimages/AwarenessAircraft.svg") : vehicle.vehicleImageOpaque mipmap: true - width: _root.size - sourceSize.width: _root.size + width: size + sourceSize.width: size fillMode: Image.PreserveAspectFit transform: Rotation { origin.x: vehicleIcon.width / 2 diff --git a/src/FlightMap/Widgets/PhotoVideoControl.qml b/src/FlightMap/Widgets/PhotoVideoControl.qml index 73eeee4..61d3a07 100644 --- a/src/FlightMap/Widgets/PhotoVideoControl.qml +++ b/src/FlightMap/Widgets/PhotoVideoControl.qml @@ -25,7 +25,7 @@ import QGroundControl.FactControls 1.0 Rectangle { height: mainLayout.height + (_margins * 2) - color: Qt.rgba(qgcPal.window.r, qgcPal.window.g, qgcPal.window.b, 0.5) + color: "#80000000" radius: _margins visible: (_mavlinkCamera || _videoStreamAvailable || _simpleCameraAvailable) && multiVehiclePanelSelector.showSingleVehiclePanel @@ -101,19 +101,7 @@ Rectangle { function toggleShooting() { console.log("toggleShooting", _anyVideoStreamAvailable) - - // This whole mavlinkCameraCaptureVideoOrPhotos stuff is to work around some strange qml boolean testing - // behavior which wasn't working correctly. This should work: - // if (_mavlinkCamera && (_mavlinkCamera.capturesVideo || _mavlinkCamera.capturesPhotos) ) { - // but it doesn't for some strange reason. Hence all the stuff below... - var mavlinkCameraCaptureVideoOrPhotos = false - if (_mavlinkCamera) { - if (_mavlinkCamera.capturesVideo || _mavlinkCamera.capturesPhotos) { - mavlinkCameraCaptureVideoOrPhotos = true - } - } - - if (mavlinkCameraCaptureVideoOrPhotos) { + if (_mavlinkCamera && _mavlinkCamera.capturesVideo) { if(_mavlinkCameraInVideoMode) { _mavlinkCamera.toggleVideo() } else { @@ -165,7 +153,7 @@ Rectangle { QGCMouseArea { fillItem: parent - onClicked: settingsDialogComponent.createObject(mainWindow).open() + onClicked: mainWindow.showPopupDialogFromComponent(settingsDialogComponent) } } diff --git a/src/Joystick/Joystick.cc b/src/Joystick/Joystick.cc index b9835c4..8492924 100644 --- a/src/Joystick/Joystick.cc +++ b/src/Joystick/Joystick.cc @@ -19,7 +19,7 @@ #include -// JoystickLog Category declaration moved to QGCLoggingCategory.cc to allow access in Vehicle +QGC_LOGGING_CATEGORY(JoystickLog, "JoystickLog") QGC_LOGGING_CATEGORY(JoystickValuesLog, "JoystickValuesLog") const char* Joystick::_settingsGroup = "Joysticks"; @@ -65,8 +65,6 @@ const char* Joystick::_buttonActionGimbalLeft = QT_TR_NOOP("Gimbal Left" const char* Joystick::_buttonActionGimbalRight = QT_TR_NOOP("Gimbal Right"); const char* Joystick::_buttonActionGimbalCenter = QT_TR_NOOP("Gimbal Center"); const char* Joystick::_buttonActionEmergencyStop = QT_TR_NOOP("Emergency Stop"); -const char* Joystick::_buttonActionGripperGrab = QT_TR_NOOP("Gripper Close"); -const char* Joystick::_buttonActionGripperRelease = QT_TR_NOOP("Gripper Open"); const char* Joystick::_rgFunctionSettingsKey[Joystick::maxFunction] = { "RollAxis", @@ -108,8 +106,6 @@ Joystick::Joystick(const QString& name, int axisCount, int buttonCount, int hatC , _totalButtonCount(_buttonCount+_hatButtonCount) , _multiVehicleManager(multiVehicleManager) { - qRegisterMetaType(); - _rgAxisValues = new int[static_cast(_axisCount)]; _rgCalibration = new Calibration_t[static_cast(_axisCount)]; _rgButtonValues = new uint8_t[static_cast(_totalButtonCount)]; @@ -124,7 +120,6 @@ Joystick::Joystick(const QString& name, int axisCount, int buttonCount, int hatC _updateTXModeSettingsKey(_multiVehicleManager->activeVehicle()); _loadSettings(); connect(_multiVehicleManager, &MultiVehicleManager::activeVehicleChanged, this, &Joystick::_activeVehicleChanged); - connect(qgcApp()->toolbox()->multiVehicleManager()->vehicles(), &QmlObjectListModel::countChanged, this, &Joystick::_vehicleCountChanged); _customMavCommands = JoystickMavCommand::load("JoystickMavCommands.json"); } @@ -222,20 +217,6 @@ void Joystick::_activeVehicleChanged(Vehicle* activeVehicle) setTXMode(mode); } } -void Joystick::_flightModesChanged() -{ - _buildActionList(_activeVehicle); -} - -void Joystick::_vehicleCountChanged(int count) -{ - if(count == 0) - { - // then the last vehicle has been deleted - qCDebug(JoystickLog) << "Stopping joystick thread due to last active vehicle deletion"; - this->stopPolling(); - } -} void Joystick::_loadSettings() { @@ -505,9 +486,7 @@ void Joystick::run() while (!_exitThread) { _update(); _handleButtons(); - if (axisCount() != 0) { - _handleAxis(); - } + _handleAxis(); QGC::SLEEP::msleep(qMin(static_cast(1000.0f / _maxAxisFrequencyHz), static_cast(1000.0f / _maxButtonFrequencyHz)) / 2); } _close(); @@ -720,13 +699,11 @@ void Joystick::startPolling(Vehicle* vehicle) disconnect(this, &Joystick::centerGimbal, _activeVehicle, &Vehicle::centerGimbal); disconnect(this, &Joystick::gimbalControlValue, _activeVehicle, &Vehicle::gimbalControlValue); disconnect(this, &Joystick::emergencyStop, _activeVehicle, &Vehicle::emergencyStop); - disconnect(this, &Joystick::gripperAction, _activeVehicle, &Vehicle::setGripperAction); - disconnect(_activeVehicle, &Vehicle::flightModesChanged, this, &Joystick::_flightModesChanged); } // Always set up the new vehicle _activeVehicle = vehicle; // If joystick is not calibrated, disable it - if ( axisCount() != 0 && !_calibrated ) { + if ( !_calibrated ) { vehicle->setJoystickEnabled(false); } // Update qml in case of joystick transition @@ -744,8 +721,6 @@ void Joystick::startPolling(Vehicle* vehicle) connect(this, &Joystick::centerGimbal, _activeVehicle, &Vehicle::centerGimbal); connect(this, &Joystick::gimbalControlValue, _activeVehicle, &Vehicle::gimbalControlValue); connect(this, &Joystick::emergencyStop, _activeVehicle, &Vehicle::emergencyStop); - connect(this, &Joystick::gripperAction, _activeVehicle, &Vehicle::setGripperAction); - connect(_activeVehicle, &Vehicle::flightModesChanged, this, &Joystick::_flightModesChanged); } } if (!isRunning()) { @@ -765,8 +740,6 @@ void Joystick::stopPolling(void) disconnect(this, &Joystick::gimbalYawStep, _activeVehicle, &Vehicle::gimbalYawStep); disconnect(this, &Joystick::centerGimbal, _activeVehicle, &Vehicle::centerGimbal); disconnect(this, &Joystick::gimbalControlValue, _activeVehicle, &Vehicle::gimbalControlValue); - disconnect(this, &Joystick::gripperAction, _activeVehicle, &Vehicle::setGripperAction); - disconnect(_activeVehicle, &Vehicle::flightModesChanged, this, &Joystick::_flightModesChanged); } _exitThread = true; } @@ -973,8 +946,8 @@ void Joystick::setCircleCorrection(bool circleCorrection) void Joystick::setAxisFrequency(float val) { //-- Arbitrary limits - val = qMax(_minAxisFrequencyHz, val); - val = qMin(_maxAxisFrequencyHz, val); + val = qMin(_minAxisFrequencyHz, val); + val = qMax(_maxAxisFrequencyHz, val); _axisFrequencyHz = val; _saveSettings(); emit axisFrequencyHzChanged(); @@ -983,8 +956,8 @@ void Joystick::setAxisFrequency(float val) void Joystick::setButtonFrequency(float val) { //-- Arbitrary limits - val = qMax(_minButtonFrequencyHz, val); - val = qMin(_maxButtonFrequencyHz, val); + val = qMin(_minButtonFrequencyHz, val); + val = qMax(_maxButtonFrequencyHz, val); _buttonFrequencyHz = val; _saveSettings(); emit buttonFrequencyHzChanged(); @@ -1018,7 +991,7 @@ void Joystick::_executeButtonAction(const QString& action, bool buttonDown) if (buttonDown) emit setVtolInFwdFlight(true); } else if (action == _buttonActionVTOLMultiRotor) { if (buttonDown) emit setVtolInFwdFlight(false); - } else if (_activeVehicle->flightModes().contains(action)) { + } else if (_activeVehicle->flightModes().contains(action) || _activeVehicle->extraJoystickFlightModes().contains(action)) { if (buttonDown) emit setFlightMode(action); } else if(action == _buttonActionContinuousZoomIn || action == _buttonActionContinuousZoomOut) { if (buttonDown) { @@ -1056,14 +1029,6 @@ void Joystick::_executeButtonAction(const QString& action, bool buttonDown) } } else if(action == _buttonActionEmergencyStop) { if(buttonDown) emit emergencyStop(); - } else if(action == _buttonActionGripperGrab) { - if(buttonDown) { - emit gripperAction(GRIPPER_ACTION_GRAB); - } - } else if(action == _buttonActionGripperRelease) { - if(buttonDown) { - emit gripperAction(GRIPPER_ACTION_RELEASE); - } } else { if (buttonDown && _activeVehicle) { for (auto& item : _customMavCommands) { @@ -1073,6 +1038,7 @@ void Joystick::_executeButtonAction(const QString& action, bool buttonDown) } } } + qCDebug(JoystickLog) << "_buttonAction unknown action:" << action; } } @@ -1135,6 +1101,10 @@ void Joystick::_buildActionList(Vehicle* activeVehicle) foreach(auto mode, list) { _assignableButtonActions.append(new AssignableButtonAction(this, mode)); } + list = activeVehicle->extraJoystickFlightModes(); + foreach(auto mode, list) { + _assignableButtonActions.append(new AssignableButtonAction(this, mode)); + } } _assignableButtonActions.append(new AssignableButtonAction(this, _buttonActionVTOLFixedWing)); _assignableButtonActions.append(new AssignableButtonAction(this, _buttonActionVTOLMultiRotor)); @@ -1156,12 +1126,8 @@ void Joystick::_buildActionList(Vehicle* activeVehicle) _assignableButtonActions.append(new AssignableButtonAction(this, _buttonActionGimbalRight, true)); _assignableButtonActions.append(new AssignableButtonAction(this, _buttonActionGimbalCenter)); _assignableButtonActions.append(new AssignableButtonAction(this, _buttonActionEmergencyStop)); - _assignableButtonActions.append(new AssignableButtonAction(this, _buttonActionGripperGrab)); - _assignableButtonActions.append(new AssignableButtonAction(this, _buttonActionGripperRelease)); - - for (auto& item : _customMavCommands) { + for (auto& item : _customMavCommands) _assignableButtonActions.append(new AssignableButtonAction(this, item.name())); - } for(int i = 0; i < _assignableButtonActions.count(); i++) { AssignableButtonAction* p = qobject_cast(_assignableButtonActions[i]); diff --git a/src/Joystick/Joystick.h b/src/Joystick/Joystick.h index 7405630..81ccb07 100644 --- a/src/Joystick/Joystick.h +++ b/src/Joystick/Joystick.h @@ -14,16 +14,15 @@ #include #include -#include #include "QGCLoggingCategory.h" #include "Vehicle.h" #include "MultiVehicleManager.h" #include "JoystickMavCommand.h" +#include -// JoystickLog Category declaration moved to QGCLoggingCategory.cc to allow access in Vehicle +Q_DECLARE_LOGGING_CATEGORY(JoystickLog) Q_DECLARE_LOGGING_CATEGORY(JoystickValuesLog) -Q_DECLARE_METATYPE(GRIPPER_ACTIONS) /// Action assigned to button class AssignedButtonAction : public QObject { @@ -218,12 +217,6 @@ signals: void setVtolInFwdFlight (bool set); void setFlightMode (const QString& flightMode); void emergencyStop (); - /** - * @brief Send MAV_CMD_DO_GRIPPER command to the vehicle - * - * @param gripperAction (Open / Close) Gripper action to command - */ - void gripperAction (GRIPPER_ACTIONS gripperAction); protected: void _setDefaultCalibration (); @@ -359,12 +352,7 @@ private: static const char* _buttonActionGimbalRight; static const char* _buttonActionGimbalCenter; static const char* _buttonActionEmergencyStop; - static const char* _buttonActionGripperGrab; - static const char* _buttonActionGripperRelease; - private slots: void _activeVehicleChanged(Vehicle* activeVehicle); - void _vehicleCountChanged(int count); - void _flightModesChanged(); }; diff --git a/src/Joystick/JoystickManager.cc b/src/Joystick/JoystickManager.cc index bd03f15..0cba191 100644 --- a/src/Joystick/JoystickManager.cc +++ b/src/Joystick/JoystickManager.cc @@ -175,15 +175,14 @@ QString JoystickManager::activeJoystickName(void) return _activeJoystick ? _activeJoystick->name() : QString(); } -bool JoystickManager::setActiveJoystickName(const QString& name) +void JoystickManager::setActiveJoystickName(const QString& name) { - if (_name2JoystickMap.contains(name)) { - setActiveJoystick(_name2JoystickMap[name]); - return true; - } else { + if (!_name2JoystickMap.contains(name)) { qCWarning(JoystickManagerLog) << "Set active not in map" << name; - return false; + return; } + + setActiveJoystick(_name2JoystickMap[name]); } /* diff --git a/src/Joystick/JoystickManager.h b/src/Joystick/JoystickManager.h index 6614501..f4f939a 100644 --- a/src/Joystick/JoystickManager.h +++ b/src/Joystick/JoystickManager.h @@ -47,7 +47,7 @@ public: void setActiveJoystick(Joystick* joystick); QString activeJoystickName(void); - bool setActiveJoystickName(const QString& name); + void setActiveJoystickName(const QString& name); void restartJoystickCheckTimer(void); diff --git a/src/Joystick/JoystickSDL.cc b/src/Joystick/JoystickSDL.cc index 4743e38..172627c 100644 --- a/src/Joystick/JoystickSDL.cc +++ b/src/Joystick/JoystickSDL.cc @@ -44,6 +44,11 @@ QMap JoystickSDL::discover(MultiVehicleManager* _multiVehicl axisCount = SDL_JoystickNumAxes(sdlJoystick); buttonCount = SDL_JoystickNumButtons(sdlJoystick); hatCount = SDL_JoystickNumHats(sdlJoystick); +#ifdef Q_OS_WIN + if (name == QStringLiteral("Xbox Series X Controller") || name == QStringLiteral("Controller (Xbox One For Windows)")) { + hatCount = 0; + } +#endif if (axisCount < 0 || buttonCount < 0 || hatCount < 0) { qCWarning(JoystickLog) << "\t libsdl error parsing joystick features:" << SDL_GetError(); } diff --git a/src/MissionManager/CorridorScanComplexItem.cc b/src/MissionManager/CorridorScanComplexItem.cc index cf11fa6..565cc92 100644 --- a/src/MissionManager/CorridorScanComplexItem.cc +++ b/src/MissionManager/CorridorScanComplexItem.cc @@ -346,15 +346,7 @@ void CorridorScanComplexItem::_rebuildTransectsPhase1(void) QList reversedVertices; for (int j=transectVertices.count()-1; j>=0; j--) { reversedVertices.append(transectVertices[j]); - - // as we are flying the transect reversed, we also need to swap entry and exit coordinate types - if (reversedVertices.last().coordType == CoordTypeSurveyEntry) { - reversedVertices.last().coordType = CoordTypeSurveyExit; - } else if (reversedVertices.last().coordType == CoordTypeSurveyExit) { - reversedVertices.last().coordType = CoordTypeSurveyEntry; - } } - transectVertices = reversedVertices; } else { reverseVertices = true; diff --git a/src/MissionManager/GeoFenceController.cc b/src/MissionManager/GeoFenceController.cc index 7092d1f..4e3042d 100644 --- a/src/MissionManager/GeoFenceController.cc +++ b/src/MissionManager/GeoFenceController.cc @@ -39,9 +39,6 @@ const char* GeoFenceController::_jsonCirclesKey = "circles"; const char* GeoFenceController::_breachReturnAltitudeFactName = "Altitude"; const char* GeoFenceController::_px4ParamCircularFence = "GF_MAX_HOR_DIST"; -const char* GeoFenceController::_apmParamCircularFenceRadius = "FENCE_RADIUS"; -const char* GeoFenceController::_apmParamCircularFenceEnabled = "FENCE_ENABLE"; -const char* GeoFenceController::_apmParamCircularFenceType = "FENCE_TYPE"; GeoFenceController::GeoFenceController(PlanMasterController* masterController, QObject* parent) : PlanElementController (masterController, parent) @@ -498,102 +495,30 @@ bool GeoFenceController::supported(void) const return (_managerVehicle->capabilityBits() & MAV_PROTOCOL_CAPABILITY_MISSION_FENCE) && (_managerVehicle->maxProtoVersion() >= 200); } -/* Returns the radius of the "paramCircularFence" - * which is called the "Geofence Failsafe" in PX4 and the "Circular Geofence" on Ardupilot - * this code should ideally live in the firmware plugin since it is specific to apm and px4 firmwares */ +// Hack for PX4 double GeoFenceController::paramCircularFence(void) { - if(_managerVehicle->isOfflineEditingVehicle()){ + if (_managerVehicle->isOfflineEditingVehicle() || !_managerVehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, _px4ParamCircularFence)) { return 0; } - if(_managerVehicle->px4Firmware()){ - if(!_managerVehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, _px4ParamCircularFence)){ - return 0; - } - - return _managerVehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, _px4ParamCircularFence)->rawValue().toDouble(); - } - - if(_managerVehicle->apmFirmware()) - { - if (!_managerVehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, _apmParamCircularFenceRadius) || - !_managerVehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, _apmParamCircularFenceEnabled) || - !_managerVehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, _apmParamCircularFenceType)){ - return 0; - } - - bool apm_fence_enabled = _managerVehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, _apmParamCircularFenceEnabled)->rawValue().toBool(); - bool apm_fence_type_circle = (1 << 1) & _managerVehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, _apmParamCircularFenceType)->rawValue().toUInt(); - - if(!apm_fence_enabled || !apm_fence_type_circle) - return 0; - - return _managerVehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, _apmParamCircularFenceRadius)->rawValue().toDouble(); - } - - return 0; + return _managerVehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, _px4ParamCircularFence)->rawValue().toDouble(); } void GeoFenceController::_parametersReady(void) { - /* When parameters are ready we setup notifications of param changes - * so that if a param changes we can emit paramCircularFenceChanged - * and trigger an update to the UI */ - - // First disconnect from any existing facts if (_px4ParamCircularFenceFact) { _px4ParamCircularFenceFact->disconnect(this); _px4ParamCircularFenceFact = nullptr; } - if (_apmParamCircularFenceRadiusFact) { - _apmParamCircularFenceRadiusFact->disconnect(this); - _apmParamCircularFenceRadiusFact = nullptr; - } - if (_apmParamCircularFenceEnabledFact) { - _apmParamCircularFenceEnabledFact->disconnect(this); - _apmParamCircularFenceEnabledFact = nullptr; - } - if (_apmParamCircularFenceTypeFact) { - _apmParamCircularFenceTypeFact->disconnect(this); - _apmParamCircularFenceTypeFact = nullptr; - } - // then connect to needed paremters - // While checking they exist to avoid errors - ParameterManager* _paramManager = _managerVehicle->parameterManager(); - - if(_managerVehicle->isOfflineEditingVehicle()){ + if (_managerVehicle->isOfflineEditingVehicle() || !_managerVehicle->parameterManager()->parameterExists(FactSystem::defaultComponentId, _px4ParamCircularFence)) { emit paramCircularFenceChanged(); return; } - if(_managerVehicle->px4Firmware()){ - if(!_paramManager->parameterExists(FactSystem::defaultComponentId, _px4ParamCircularFence)){ - emit paramCircularFenceChanged(); - return; - } - - _px4ParamCircularFenceFact = _paramManager->getParameter(FactSystem::defaultComponentId, _px4ParamCircularFence); - connect(_px4ParamCircularFenceFact, &Fact::rawValueChanged, this, &GeoFenceController::paramCircularFenceChanged); - } - else if(_managerVehicle->apmFirmware()) - { - if (!_paramManager->parameterExists(FactSystem::defaultComponentId, _apmParamCircularFenceRadius) || - !_paramManager->parameterExists(FactSystem::defaultComponentId, _apmParamCircularFenceEnabled) || - !_paramManager->parameterExists(FactSystem::defaultComponentId, _apmParamCircularFenceType)){ - emit paramCircularFenceChanged(); - return; - } - - _apmParamCircularFenceRadiusFact = _paramManager->getParameter(FactSystem::defaultComponentId, _apmParamCircularFenceRadius); - _apmParamCircularFenceEnabledFact = _paramManager->getParameter(FactSystem::defaultComponentId, _apmParamCircularFenceEnabled); - _apmParamCircularFenceTypeFact = _paramManager->getParameter(FactSystem::defaultComponentId, _apmParamCircularFenceType); - connect(_apmParamCircularFenceRadiusFact, &Fact::rawValueChanged, this, &GeoFenceController::paramCircularFenceChanged); - connect(_apmParamCircularFenceEnabledFact, &Fact::rawValueChanged, this, &GeoFenceController::paramCircularFenceChanged); - connect(_apmParamCircularFenceTypeFact, &Fact::rawValueChanged, this, &GeoFenceController::paramCircularFenceChanged); - } - + _px4ParamCircularFenceFact = _managerVehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, _px4ParamCircularFence); + connect(_px4ParamCircularFenceFact, &Fact::rawValueChanged, this, &GeoFenceController::paramCircularFenceChanged); emit paramCircularFenceChanged(); } diff --git a/src/MissionManager/GeoFenceController.h b/src/MissionManager/GeoFenceController.h index 19f0643..83bb2e2 100644 --- a/src/MissionManager/GeoFenceController.h +++ b/src/MissionManager/GeoFenceController.h @@ -35,8 +35,8 @@ public: Q_PROPERTY(QGeoCoordinate breachReturnPoint READ breachReturnPoint WRITE setBreachReturnPoint NOTIFY breachReturnPointChanged) Q_PROPERTY(Fact* breachReturnAltitude READ breachReturnAltitude CONSTANT) - // Radius of the "paramCircularFence" which is called the "Geofence Failsafe" in PX4 and the "Circular Geofence" on ArduPilot - Q_PROPERTY(double paramCircularFence READ paramCircularFence NOTIFY paramCircularFenceChanged) + // Hack to expose PX4 circular fence controlled by GF_MAX_HOR_DIST + Q_PROPERTY(double paramCircularFence READ paramCircularFence NOTIFY paramCircularFenceChanged) /// Add a new inclusion polygon to the fence /// @param topLeft: Top left coordinate or map viewport @@ -114,18 +114,11 @@ private: Fact _breachReturnAltitudeFact; double _breachReturnDefaultAltitude = qQNaN(); bool _itemsRequested = false; - - Fact* _px4ParamCircularFenceFact = nullptr; - Fact* _apmParamCircularFenceRadiusFact = nullptr; - Fact* _apmParamCircularFenceEnabledFact = nullptr; - Fact* _apmParamCircularFenceTypeFact = nullptr; + Fact* _px4ParamCircularFenceFact = nullptr; static QMap _metaDataMap; static const char* _px4ParamCircularFence; - static const char* _apmParamCircularFenceRadius; - static const char* _apmParamCircularFenceEnabled; - static const char* _apmParamCircularFenceType; static const int _jsonCurrentVersion = 2; diff --git a/src/MissionManager/GeoFenceManager.cc b/src/MissionManager/GeoFenceManager.cc index 2042d2f..af63420 100644 --- a/src/MissionManager/GeoFenceManager.cc +++ b/src/MissionManager/GeoFenceManager.cc @@ -19,6 +19,9 @@ QGC_LOGGING_CATEGORY(GeoFenceManagerLog, "GeoFenceManagerLog") GeoFenceManager::GeoFenceManager(Vehicle* vehicle) : PlanManager (vehicle, MAV_MISSION_TYPE_FENCE) +#if defined(QGC_AIRMAP_ENABLED) + , _airspaceManager (qgcApp()->toolbox()->airspaceManager()) +#endif { connect(this, &PlanManager::inProgressChanged, this, &GeoFenceManager::inProgressChanged); connect(this, &PlanManager::error, this, &GeoFenceManager::error); diff --git a/src/MissionManager/GeoFenceManager.h b/src/MissionManager/GeoFenceManager.h index 3b67033..3270f23 100644 --- a/src/MissionManager/GeoFenceManager.h +++ b/src/MissionManager/GeoFenceManager.h @@ -12,6 +12,10 @@ #include #include +#if defined(QGC_AIRMAP_ENABLED) +#include "AirspaceManager.h" +#endif + #include "QGCLoggingCategory.h" #include "FactSystem.h" #include "PlanManager.h" @@ -83,4 +87,7 @@ private: bool _firstParamLoadComplete = false; QList _sendPolygons; QList _sendCircles; +#if defined(QGC_AIRMAP_ENABLED) + AirspaceManager* _airspaceManager = nullptr; +#endif }; diff --git a/src/MissionManager/MavCmdInfoCommon.json b/src/MissionManager/MavCmdInfoCommon.json index b01650f..2bf2c92 100644 --- a/src/MissionManager/MavCmdInfoCommon.json +++ b/src/MissionManager/MavCmdInfoCommon.json @@ -36,15 +36,13 @@ "label": "Hold", "units": "secs", "default": 0, - "decimalPlaces": 0, - "min": 0 + "decimalPlaces": 0 }, "param2": { "label": "Acceptance", "units": "m", "default": 0, - "decimalPlaces": 2, - "min": 0 + "decimalPlaces": 2 }, "param3": { "label": "Pass Radius", @@ -95,8 +93,7 @@ "param1": { "label": "Turns", "default": 1, - "decimalPlaces": 0, - "min": 0 + "decimalPlaces": 0 }, "param2": { "label": "Leave Loiter", @@ -132,8 +129,7 @@ "label": "Loiter Time", "units": "secs", "default": 30, - "decimalPlaces": 0, - "min": 0 + "decimalPlaces": 0 }, "param2": { "label": "Leave Loiter", @@ -298,8 +294,7 @@ "label": "Hold", "units": "secs", "default": 0, - "decimalPlaces": 0, - "min": 0 + "decimalPlaces": 0 } }, { "id": 83, "rawName": "MAV_CMD_NAV_ALTITUDE_WAIT", "friendlyName": "Altitude wait" }, @@ -369,34 +364,27 @@ "id": 93, "rawName": "MAV_CMD_NAV_DELAY", "friendlyName": "Delay until", - "description": "Delay until the specified time is reached.", + "description": "Delay unti the specified time is reached.", "param1": { "label": "Hold", "units": "secs", "default": 30, - "decimalPlaces": 0, - "min": -1 + "decimalPlaces": 0 }, "param2": { "label": "Hour (utc)", "default": 0, - "decimalPlaces": 0, - "min": -1, - "max": 23 + "decimalPlaces": 0 }, "param3": { "label": "Min (utc)", "default": 0, - "decimalPlaces": 0, - "min": -1, - "max": 59 + "decimalPlaces": 0 }, "param4": { "label": "Sec (utc)", "default": 0, - "decimalPlaces": 0, - "min": -1, - "max": 59 + "decimalPlaces": 0 } }, { @@ -410,8 +398,7 @@ "label": "Delay", "units": "secs", "default": 30, - "decimalPlaces": 0, - "min": 0 + "decimalPlaces": 0 } }, { @@ -439,8 +426,7 @@ "label": "Distance", "units": "m", "default": 10, - "decimalPlaces": 2, - "min": 0 + "decimalPlaces": 2 } }, { @@ -471,7 +457,7 @@ "label": "Offset", "enumStrings": "Relative,Absolute", "enumValues": "1,0", - "default": 0 + "default": 1 } }, { "id": 176, "rawName": "MAV_CMD_DO_SET_MODE", "friendlyName": "Set mode" }, @@ -507,14 +493,12 @@ "param1": { "label": "Item #", "default": 1, - "decimalPlaces": 0, - "min": 0 + "decimalPlaces": 0 }, "param2": { "label": "Repeat", "default": 10, - "decimalPlaces": 0, - "min": 0 + "decimalPlaces": 0 } }, { @@ -532,14 +516,12 @@ "param2": { "label": "Speed", "units": "m/s", - "default": 0, - "min": -2 + "default": 0 }, "param3": { "label": "Throttle", "units": "%", - "default": 0, - "min": -2 + "default": 0 }, "param4": { "label": "Offset", @@ -573,8 +555,7 @@ "param1": { "label": "Relay #", "default": 0, - "decimalPlaces": 0, - "min": 0 + "decimalPlaces": 0 }, "param2": { "label": "Value", @@ -589,22 +570,19 @@ "param1": { "label": "Relay #", "default": 0, - "decimalPlaces": 0, - "min": 0 + "decimalPlaces": 0 }, "param2": { "label": "Cycles", "default": 1, "units": "count", - "decimalPlaces": 0, - "min": 1 + "decimalPlaces": 0 }, "param3": { "label": "Time", "default": 10, "units": "secs", - "decimalPlaces": 0, - "min": 0 + "decimalPlaces": 0 } }, { @@ -616,14 +594,12 @@ "param1": { "label": "Servo", "default": 1, - "decimalPlaces": 0, - "min": 0 + "decimalPlaces": 0 }, "param2": { "label": "PWM", "default": 1500, - "decimalPlaces": 0, - "min": 0 + "decimalPlaces": 0 } }, { @@ -634,59 +610,24 @@ "param1": { "label": "Servo", "default": 1, - "decimalPlaces": 0, - "min": 0 + "decimalPlaces": 0 }, "param2": { "label": "PWM", "default": 1000, - "decimalPlaces": 0, - "min": 0 + "decimalPlaces": 0 }, "param3": { "label": "Cycles", "default": 1, "units": "count", - "decimalPlaces": 0, - "min": 1 + "decimalPlaces": 0 }, "param4": { "label": "Time", "default": 10, "units": "secs", - "decimalPlaces": 0, - "min": 0 - } - }, - { - "id": 187, - "rawName": "MAV_CMD_DO_SET_ACTUATOR", - "friendlyName": "Set actuator", - "description": "Set actuator to specified output value (range [-1, 1]).", - "friendlyEdit": true, - "param1": { - "label": "Actuator 1", - "default": null, - "nanUnchanged": true, - "decimalPlaces": 2 - }, - "param2": { - "label": "Actuator 2", - "default": null, - "nanUnchanged": true, - "decimalPlaces": 2 - }, - "param3": { - "label": "Actuator 3", - "default": null, - "nanUnchanged": true, - "decimalPlaces": 2 - }, - "param4": { - "label": "Actuator 4", - "default": null, - "nanUnchanged": true, - "decimalPlaces": 2 + "decimalPlaces": 0 } }, { "id": 185, "rawName": "MAV_CMD_DO_FLIGHTTERMINATION", "friendlyName": "Flight termination" }, @@ -783,14 +724,12 @@ "param2": { "label": "Mission Index", "default": 0, - "decimalPlaces": 0, - "min": 0 + "decimalPlaces": 0 }, "param3": { "label": "ROI Index", "default": 0, - "decimalPlaces": 0, - "min": 0 + "decimalPlaces": 0 } }, { @@ -940,51 +879,6 @@ "enumValues": "0,1,2,3,4" } }, - { - "id": 1000, - "rawName": "MAV_CMD_DO_GIMBAL_MANAGER_PITCHYAW", - "friendlyName": "Gimbal Manager PitchYaw" , - "description": "Control the gimbal during the mission", - "category": "Advanced", - "param1": { - "label": "Pitch", - "default": 0, - "units": "deg", - "decimalPlaces": 2 - }, - "param2": { - "label": "Yaw", - "default": 0, - "units": "deg", - "decimalPlaces": 2 - }, - "param3": { - "label": "Pitch rate", - "default": 0, - "units": "deg/s", - "decimalPlaces": 2 - }, - "param4": { - "label": "Yaw rate", - "default": 0, - "units": "deg/s", - "decimalPlaces": 2 - }, - "param5": { - "label": "Follow yaw", - "default": 0, - "decimalPlaces": 0, - "enumStrings": "Follow yaw, Lock yaw", - "enumValues": "0,16" - }, - "param7": { - "label": "Gimbal", - "default": 0, - "decimalPlaces": 0, - "enumStrings": "Primary,first gimbal,second gimbal", - "enumValues": "0,1,2" - } - }, { "id": 206, "rawName": "MAV_CMD_DO_SET_CAM_TRIGG_DIST", @@ -995,15 +889,13 @@ "label": "Distance", "default": 25, "units": "m", - "decimalPlaces": 2, - "min": 0 + "decimalPlaces": 2 }, "param2": { "label": "Shutter", "default": 0, "units": "msecs", - "decimalPlaces": 0, - "min": -1 + "decimalPlaces": 0 }, "param3": { "label": "Trigger", @@ -1065,8 +957,8 @@ { "id": 211, "rawName": "MAV_CMD_DO_GRIPPER", - "friendlyName": "Gripper Mechanism", - "description": "Control a gripper mechanism.", + "friendlyName": "Gripper", + "description": "Operate EPM gripper.", "specifiesCoordinate": false, "friendlyEdit": true, "category": "Advanced", @@ -1108,8 +1000,7 @@ "label": "Timeout", "default": 0, "units": "secs", - "decimalPlaces": 0, - "min": 0 + "decimalPlaces": 0 }, "param2": { "label": "Min Alt", @@ -1127,8 +1018,7 @@ "label": "H Limit", "default": 25, "units": "m", - "decimalPlaces": 2, - "min": 0 + "decimalPlaces": 2 } }, { "id": 241, "rawName": "MAV_CMD_PREFLIGHT_CALIBRATION", "friendlyName": "Calibration" }, @@ -1169,14 +1059,12 @@ "label": "Interval", "default": 0, "units": "secs", - "decimalPlaces": 0, - "min": 0 + "decimalPlaces": 0 }, "param3": { "label": "Photo count", "default": 1, - "decimalPlaces": 0, - "min": 0 + "decimalPlaces": 0 } }, { @@ -1198,8 +1086,7 @@ "label": "Status Frequency", "default": 0.2, "units": "Hz", - "decimalPlaces": 2, - "min": 0 + "decimalPlaces": 2 } }, { diff --git a/src/MissionManager/MissionCommandTreeTest.cc b/src/MissionManager/MissionCommandTreeTest.cc index 8ebeb5f..80bb378 100644 --- a/src/MissionManager/MissionCommandTreeTest.cc +++ b/src/MissionManager/MissionCommandTreeTest.cc @@ -203,12 +203,12 @@ void MissionCommandTreeTest::testAllTrees(void) QList vehicleList; firmwareList << MAV_AUTOPILOT_GENERIC << MAV_AUTOPILOT_PX4 << MAV_AUTOPILOT_ARDUPILOTMEGA; - vehicleList << MAV_TYPE_GENERIC << MAV_TYPE_QUADROTOR << MAV_TYPE_FIXED_WING << MAV_TYPE_GROUND_ROVER << MAV_TYPE_SUBMARINE << MAV_TYPE_VTOL_TAILSITTER_QUADROTOR; + vehicleList << MAV_TYPE_GENERIC << MAV_TYPE_QUADROTOR << MAV_TYPE_FIXED_WING << MAV_TYPE_GROUND_ROVER << MAV_TYPE_SUBMARINE << MAV_TYPE_VTOL_QUADROTOR; // This will cause all of the variants of collapsed trees to be built for(MAV_AUTOPILOT firmwareType: firmwareList) { for (MAV_TYPE vehicleType: vehicleList) { - if (firmwareType == MAV_AUTOPILOT_ARDUPILOTMEGA && vehicleType == MAV_TYPE_VTOL_TAILSITTER_QUADROTOR) { + if (firmwareType == MAV_AUTOPILOT_ARDUPILOTMEGA && vehicleType == MAV_TYPE_VTOL_QUADROTOR) { // VTOL in ArduPilot shows up as plane so we can test this pair continue; } diff --git a/src/MissionManager/MissionCommandUIInfo.cc b/src/MissionManager/MissionCommandUIInfo.cc index 3f1083b..391b822 100644 --- a/src/MissionManager/MissionCommandUIInfo.cc +++ b/src/MissionManager/MissionCommandUIInfo.cc @@ -24,8 +24,6 @@ const char* MissionCommandUIInfo::_friendlyNameJsonKey = "friendlyName" const char* MissionCommandUIInfo::_idJsonKey = "id"; const char* MissionCommandUIInfo::_labelJsonKey = "label"; const char* MissionCommandUIInfo::_mavCmdInfoJsonKey = "mavCmdInfo"; -const char* MissionCommandUIInfo::_maxJsonKey = "max"; -const char* MissionCommandUIInfo::_minJsonKey = "min"; const char* MissionCommandUIInfo::_param1JsonKey = "param1"; const char* MissionCommandUIInfo::_param2JsonKey = "param2"; const char* MissionCommandUIInfo::_param3JsonKey = "param3"; @@ -48,8 +46,6 @@ const char* MissionCommandUIInfo::_advancedCategory = "Advanced"; MissionCmdParamInfo::MissionCmdParamInfo(QObject* parent) : QObject(parent) - , _min (FactMetaData::minForType(FactMetaData::valueTypeDouble).toDouble()) - , _max (FactMetaData::maxForType(FactMetaData::valueTypeDouble).toDouble()) { } @@ -70,8 +66,6 @@ const MissionCmdParamInfo& MissionCmdParamInfo::operator=(const MissionCmdParamI _param = other._param; _units = other._units; _nanUnchanged = other._nanUnchanged; - _min = other._min; - _max = other._max; return *this; } @@ -376,9 +370,7 @@ bool MissionCommandUIInfo::loadJsonInfo(const QJsonObject& jsonObject, bool requ QJsonObject paramObject = jsonObject.value(paramKey).toObject(); QStringList allParamKeys; - allParamKeys << _defaultJsonKey << _decimalPlacesJsonKey << _enumStringsJsonKey << _enumValuesJsonKey - << _labelJsonKey << _unitsJsonKey << _nanUnchangedJsonKey - << _minJsonKey << _maxJsonKey; + allParamKeys << _defaultJsonKey << _decimalPlacesJsonKey << _enumStringsJsonKey << _enumValuesJsonKey << _labelJsonKey << _unitsJsonKey << _nanUnchangedJsonKey; // Look for unknown keys in param object for (const QString& key: paramObject.keys()) { @@ -413,14 +405,6 @@ bool MissionCommandUIInfo::loadJsonInfo(const QJsonObject& jsonObject, bool requ paramInfo->_nanUnchanged = paramObject.value(_nanUnchangedJsonKey).toBool(false); paramInfo->_enumStrings = paramObject.value(_enumStringsJsonKey).toString().split(",", Qt::SkipEmptyParts); - // The min and max values are defaulted correctly already, so only set them if a value is present in the JSON. - if (paramObject.value(_minJsonKey).isDouble()) { - paramInfo->_min = paramObject.value(_minJsonKey).toDouble(); - } - if (paramObject.value(_maxJsonKey).isDouble()) { - paramInfo->_max = paramObject.value(_maxJsonKey).toDouble(); - } - if (paramObject.contains(_defaultJsonKey)) { if (paramInfo->_nanUnchanged) { paramInfo->_defaultValue = JsonHelper::possibleNaNJsonValue(paramObject[_defaultJsonKey]); @@ -434,7 +418,6 @@ bool MissionCommandUIInfo::loadJsonInfo(const QJsonObject& jsonObject, bool requ } else { paramInfo->_defaultValue = paramInfo->_nanUnchanged ? std::numeric_limits::quiet_NaN() : 0; } - QStringList enumValues = paramObject.value(_enumValuesJsonKey).toString().split(",", Qt::SkipEmptyParts); for (const QString &enumValue: enumValues) { bool convertOk; @@ -462,9 +445,7 @@ bool MissionCommandUIInfo::loadJsonInfo(const QJsonObject& jsonObject, bool requ << paramInfo->_units << paramInfo->_enumStrings << paramInfo->_enumValues - << paramInfo->_nanUnchanged - << paramInfo->_min - << paramInfo->_max; + << paramInfo->_nanUnchanged; _paramInfoMap[i] = paramInfo; } diff --git a/src/MissionManager/MissionCommandUIInfo.h b/src/MissionManager/MissionCommandUIInfo.h index 0a09d2f..ac052e0 100644 --- a/src/MissionManager/MissionCommandUIInfo.h +++ b/src/MissionManager/MissionCommandUIInfo.h @@ -55,8 +55,6 @@ public: Q_PROPERTY(int param READ param CONSTANT) Q_PROPERTY(QString units READ units CONSTANT) Q_PROPERTY(bool nanUnchanged READ nanUnchanged CONSTANT) - Q_PROPERTY(double min READ min CONSTANT) - Q_PROPERTY(double max READ max CONSTANT) int decimalPlaces (void) const { return _decimalPlaces; } double defaultValue (void) const { return _defaultValue; } @@ -66,8 +64,6 @@ public: int param (void) const { return _param; } QString units (void) const { return _units; } bool nanUnchanged (void) const { return _nanUnchanged; } - double min (void) const { return _min; } - double max (void) const { return _max; } private: int _decimalPlaces; @@ -78,8 +74,6 @@ private: int _param; QString _units; bool _nanUnchanged; - double _min; - double _max; friend class MissionCommandTree; friend class MissionCommandUIInfo; @@ -191,8 +185,6 @@ private: static const char* _idJsonKey; static const char* _labelJsonKey; static const char* _mavCmdInfoJsonKey; - static const char* _maxJsonKey; - static const char* _minJsonKey; static const char* _param1JsonKey; static const char* _param2JsonKey; static const char* _param3JsonKey; diff --git a/src/MissionManager/MissionController.cc b/src/MissionManager/MissionController.cc index 4f482c0..cac624d 100644 --- a/src/MissionManager/MissionController.cc +++ b/src/MissionManager/MissionController.cc @@ -1269,6 +1269,7 @@ void MissionController::_recalcFlightPathSegments(void) bool signalSplitSegmentChanged = false; qCDebug(MissionControllerLog) << "_recalcFlightPathSegments homePositionValid" << homePositionValid; + qDebug() << "_recalcFlightPathSegments homePositionValid" << homePositionValid; FlightPathSegmentHashTable oldSegmentTable = _flightPathSegmentHashTable; @@ -1576,7 +1577,6 @@ void MissionController::_recalcMissionFlightStatus() case MAV_CMD_NAV_ROI: case MAV_CMD_DO_SET_ROI_LOCATION: case MAV_CMD_DO_SET_ROI_WPNEXT_OFFSET: - case MAV_CMD_DO_GIMBAL_MANAGER_PITCHYAW: _missionFlightStatus.gimbalYaw = qQNaN(); _missionFlightStatus.gimbalPitch = qQNaN(); break; diff --git a/src/MissionManager/PlanMasterController.cc b/src/MissionManager/PlanMasterController.cc index 4843286..f40cd9d 100644 --- a/src/MissionManager/PlanMasterController.cc +++ b/src/MissionManager/PlanMasterController.cc @@ -20,6 +20,9 @@ #include "StructureScanPlanCreator.h" #include "CorridorScanPlanCreator.h" #include "BlankPlanCreator.h" +#if defined(QGC_AIRMAP_ENABLED) +#include "AirspaceFlightPlanProvider.h" +#endif #include #include @@ -93,6 +96,14 @@ void PlanMasterController::start(void) connect(_multiVehicleMgr, &MultiVehicleManager::activeVehicleChanged, this, &PlanMasterController::_activeVehicleChanged); _updatePlanCreatorsList(); + +#if defined(QGC_AIRMAP_ENABLED) + //-- This assumes there is one single instance of PlanMasterController in edit mode. + if(!_flyView) { + // Wait for signal confirming AirMap client connection before starting flight planning + connect(qgcApp()->toolbox()->airspaceManager(), &AirspaceManager::connectStatusChanged, this, &PlanMasterController::_startFlightPlanning); + } +#endif } void PlanMasterController::startStaticActiveVehicle(Vehicle* vehicle, bool deleteWhenSendCompleted) @@ -305,6 +316,15 @@ void PlanMasterController::_sendRallyPointsComplete(void) } } +#if defined(QGC_AIRMAP_ENABLED) +void PlanMasterController::_startFlightPlanning(void) { + if (qgcApp()->toolbox()->airspaceManager()->connected()) { + qCDebug(PlanMasterControllerLog) << "PlanMasterController::_startFlightPlanning client connected, start flight planning"; + qgcApp()->toolbox()->airspaceManager()->flightPlan()->startFlightPlanning(this); + } +} +#endif + void PlanMasterController::sendToVehicle(void) { WeakLinkInterfacePtr weakLink = _managerVehicle->vehicleLinkManager()->primaryLink(); diff --git a/src/MissionManager/PlanMasterController.h b/src/MissionManager/PlanMasterController.h index e02e5d7..e24e6f7 100644 --- a/src/MissionManager/PlanMasterController.h +++ b/src/MissionManager/PlanMasterController.h @@ -129,6 +129,9 @@ private slots: void _sendGeoFenceComplete (void); void _sendRallyPointsComplete (void); void _updatePlanCreatorsList (void); +#if defined(QGC_AIRMAP_ENABLED) + void _startFlightPlanning (void); +#endif private: void _commonInit (void); diff --git a/src/MissionManager/QGCMapPolygonVisuals.qml b/src/MissionManager/QGCMapPolygonVisuals.qml index 95e4dd7..a19471a 100644 --- a/src/MissionManager/QGCMapPolygonVisuals.qml +++ b/src/MissionManager/QGCMapPolygonVisuals.qml @@ -266,13 +266,13 @@ Item { QGCMenuItem { text: qsTr("Edit position..." ) visible: _circleMode - onTriggered: editCenterPositionDialog.createObject(mainWindow).open() + onTriggered: mainWindow.showComponentDialog(editCenterPositionDialog, qsTr("Edit Center Position"), mainWindow.showDialogDefaultWidth, StandardButton.Close) } QGCMenuItem { text: qsTr("Edit position..." ) visible: !_circleMode && menu._editingVertexIndex >= 0 - onTriggered: editVertexPositionDialog.createObject(mainWindow).open() + onTriggered: mainWindow.showComponentDialog(editVertexPositionDialog, qsTr("Edit Vertex Position"), mainWindow.showDialogDefaultWidth, StandardButton.Close) } } @@ -458,7 +458,6 @@ Item { id: editCenterPositionDialog EditPositionDialog { - title: qsTr("Edit Center Position") coordinate: mapPolygon.center onCoordinateChanged: { // Prevent spamming signals on vertex changes by setting centerDrag = true when changing center position. @@ -474,8 +473,7 @@ Item { id: editVertexPositionDialog EditPositionDialog { - title: qsTr("Edit Vertex Position") - coordinate: mapPolygon.vertexCoordinate(menu._editingVertexIndex) + coordinate: mapPolygon.vertexCoordinate(menu._editingVertexIndex) onCoordinateChanged: { mapPolygon.adjustVertex(menu._editingVertexIndex, coordinate) mapPolygon.verifyClockwiseWinding() diff --git a/src/MissionManager/QGCMapPolylineVisuals.qml b/src/MissionManager/QGCMapPolylineVisuals.qml index deb5829..46c43b5 100644 --- a/src/MissionManager/QGCMapPolylineVisuals.qml +++ b/src/MissionManager/QGCMapPolylineVisuals.qml @@ -153,7 +153,7 @@ Item { QGCMenuItem { text: qsTr("Edit position..." ) - onTriggered: editPositionDialog.createObject(mainWindow, { coordinate: mapPolyline.path[menu._removeVertexIndex] }).open() + onTriggered: mainWindow.showComponentDialog(editPositionDialog, qsTr("Edit Position"), mainWindow.showDialogDefaultWidth, StandardButton.Cancel) } } @@ -161,7 +161,8 @@ Item { id: editPositionDialog EditPositionDialog { - onCoordinateChanged: mapPolyline.adjustVertex(menu._removeVertexIndex,coordinate) + Component.onCompleted: coordinate = mapPolyline.path[menu._removeVertexIndex] + onCoordinateChanged: mapPolyline.adjustVertex(menu._removeVertexIndex,coordinate) } } diff --git a/src/MissionManager/SimpleMissionItem.cc b/src/MissionManager/SimpleMissionItem.cc index eda4f34..17d8b1f 100644 --- a/src/MissionManager/SimpleMissionItem.cc +++ b/src/MissionManager/SimpleMissionItem.cc @@ -480,9 +480,6 @@ void SimpleMissionItem::_rebuildTextFieldFacts(void) paramFact->_setName(paramInfo->label()); paramMetaData->setDecimalPlaces(paramInfo->decimalPlaces()); paramMetaData->setRawUnits(paramInfo->units()); - paramMetaData->setRawDefaultValue(paramInfo->defaultValue()); - paramMetaData->setRawMin(paramInfo->min()); - paramMetaData->setRawMax(paramInfo->max()); paramFact->setMetaData(paramMetaData); _textFieldFacts.append(paramFact); } @@ -531,9 +528,6 @@ void SimpleMissionItem::_rebuildNaNFacts(void) paramFact->_setName(paramInfo->label()); paramMetaData->setDecimalPlaces(paramInfo->decimalPlaces()); paramMetaData->setRawUnits(paramInfo->units()); - paramMetaData->setRawDefaultValue(paramInfo->defaultValue()); - paramMetaData->setRawMin(paramInfo->min()); - paramMetaData->setRawMax(paramInfo->max()); paramFact->setMetaData(paramMetaData); _nanFacts.append(paramFact); } @@ -603,9 +597,6 @@ void SimpleMissionItem::_rebuildComboBoxFacts(void) paramMetaData->setDecimalPlaces(paramInfo->decimalPlaces()); paramMetaData->setEnumInfo(paramInfo->enumStrings(), paramInfo->enumValues()); paramMetaData->setRawUnits(paramInfo->units()); - paramMetaData->setRawDefaultValue(paramInfo->defaultValue()); - paramMetaData->setRawMin(paramInfo->min()); - paramMetaData->setRawMax(paramInfo->max()); paramFact->setMetaData(paramMetaData); _comboboxFacts.append(paramFact); } diff --git a/src/MissionManager/TransectStyleComplexItem.cc b/src/MissionManager/TransectStyleComplexItem.cc index b4d4bfd..af72bd5 100644 --- a/src/MissionManager/TransectStyleComplexItem.cc +++ b/src/MissionManager/TransectStyleComplexItem.cc @@ -422,14 +422,12 @@ void TransectStyleComplexItem::_rebuildTransects(void) return; case QGroundControlQmlGlobal::AltitudeModeRelative: case QGroundControlQmlGlobal::AltitudeModeAbsolute: - case QGroundControlQmlGlobal::AltitudeModeTerrainFrame: - // Terrain height not needed to calculate path, as TerrainFrame specifies a fixed altitude over terrain, doesn't need to know the actual terrain height - // so vehicle is responsible for having or not this altitude calculation, so we can build the flight path right away. + // Not following terrain so we can build the flight path now _buildFlightPathCoordInfoFromTransects(); break; case QGroundControlQmlGlobal::AltitudeModeCalcAboveTerrain: - // Query the terrain data. Once available flight path will be calculated, as on this mode QGC actually calculates the individual altitude for each waypoint - // having into account terrain data. + case QGroundControlQmlGlobal::AltitudeModeTerrainFrame: + // Query the terrain data. Once available flight path will be calculated _queryTransectsPathHeightInfo(); break; } diff --git a/src/PlanView/MissionItemEditor.qml b/src/PlanView/MissionItemEditor.qml index 00e1a54..e04210d 100644 --- a/src/PlanView/MissionItemEditor.qml +++ b/src/PlanView/MissionItemEditor.qml @@ -71,8 +71,8 @@ Rectangle { id: editPositionDialog EditPositionDialog { - coordinate: missionItem.isSurveyItem ? missionItem.centerCoordinate : missionItem.coordinate - onCoordinateChanged: missionItem.isSurveyItem ? missionItem.centerCoordinate = coordinate : missionItem.coordinate = coordinate + coordinate: missionItem.isSurveyItem ? missionItem.centerCoordinate : missionItem.coordinate + onCoordinateChanged: missionItem.isSurveyItem ? missionItem.centerCoordinate = coordinate : missionItem.coordinate = coordinate } } @@ -152,7 +152,7 @@ Rectangle { QGCMouseArea { fillItem: parent - onClicked: commandDialog.createObject(mainWindow).open() + onClicked: mainWindow.showComponentDialog(commandDialog, qsTr("Select Mission Command"), mainWindow.showDialogDefaultWidth, StandardButton.Cancel) } Component { @@ -220,7 +220,7 @@ Rectangle { QGCMenuItem { text: qsTr("Edit position...") visible: missionItem.specifiesCoordinate - onTriggered: editPositionDialog.createObject(mainWindow).open() + onTriggered: mainWindow.showComponentDialog(editPositionDialog, qsTr("Edit Position"), mainWindow.showDialogDefaultWidth, StandardButton.Close) } QGCMenuSeparator { diff --git a/src/PlanView/MissionSettingsEditor.qml b/src/PlanView/MissionSettingsEditor.qml index 5e8ae24..3535a0d 100644 --- a/src/PlanView/MissionSettingsEditor.qml +++ b/src/PlanView/MissionSettingsEditor.qml @@ -79,7 +79,7 @@ Rectangle { if (!_controllerVehicle.supportsTerrainFrame) { removeModes.push(QGroundControl.AltitudeModeTerrainFrame) } - altModeDialogComponent.createObject(mainWindow, { rgRemoveModes: removeModes, updateAltModeFn: updateFunction }).open() + mainWindow.showPopupDialogFromComponent(altModeDialogComponent, { rgRemoveModes: removeModes, updateAltModeFn: updateFunction }) } RowLayout { diff --git a/src/PlanView/PlanToolBarIndicators.qml b/src/PlanView/PlanToolBarIndicators.qml index 62224d5..ab07b93 100644 --- a/src/PlanView/PlanToolBarIndicators.qml +++ b/src/PlanView/PlanToolBarIndicators.qml @@ -158,7 +158,7 @@ Item { Item { width: 1; height: 1 } - QGCLabel { text: qsTr("Dist prev WP:"); font.pointSize: _dataFontSize; } + QGCLabel { text: qsTr("Distance:"); font.pointSize: _dataFontSize; } QGCLabel { text: _distanceText font.pointSize: _dataFontSize diff --git a/src/PlanView/PlanView.qml b/src/PlanView/PlanView.qml index 98ad6ff..8bc4920 100644 --- a/src/PlanView/PlanView.qml +++ b/src/PlanView/PlanView.qml @@ -24,6 +24,8 @@ import QGroundControl.FactControls 1.0 import QGroundControl.Palette 1.0 import QGroundControl.Controllers 1.0 import QGroundControl.ShapeFileHelper 1.0 +import QGroundControl.Airspace 1.0 +import QGroundControl.Airmap 1.0 Item { id: _root @@ -38,7 +40,7 @@ Item { readonly property var _defaultVehicleCoordinate: QtPositioning.coordinate(37.803784, -122.462276) readonly property bool _waypointsOnlyMode: QGroundControl.corePlugin.options.missionWaypointsOnly - property var _planMasterController: planMasterController + property bool _airspaceEnabled: QGroundControl.airmapSupported ? (QGroundControl.settingsManager.airMapSettings.enableAirMap.rawValue && QGroundControl.airspaceManager.connected): false property var _missionController: _planMasterController.missionController property var _geoFenceController: _planMasterController.geoFenceController property var _rallyPointController: _planMasterController.rallyPointController @@ -67,6 +69,16 @@ Item { return coordinate } + function updateAirspace(reset) { + if(_airspaceEnabled) { + var coordinateNW = editorMap.toCoordinate(Qt.point(0,0), false /* clipToViewPort */) + var coordinateSE = editorMap.toCoordinate(Qt.point(width,height), false /* clipToViewPort */) + if(coordinateNW.isValid && coordinateSE.isValid) { + QGroundControl.airspaceManager.setROI(coordinateNW, coordinateSE, true /*planView*/, reset) + } + } + } + property bool _firstMissionLoadComplete: false property bool _firstFenceLoadComplete: false property bool _firstRallyLoadComplete: false @@ -79,6 +91,19 @@ Item { planMasterController: _planMasterController } + on_AirspaceEnabledChanged: { + if(QGroundControl.airmapSupported) { + if(_airspaceEnabled) { + planControlColapsed = QGroundControl.airspaceManager.airspaceVisible + updateAirspace(true) + } else { + planControlColapsed = false + } + } else { + planControlColapsed = false + } + } + onVisibleChanged: { if(visible) { editorMap.zoomLevel = QGroundControl.flightMapZoom @@ -93,10 +118,18 @@ Item { target: _appSettings ? _appSettings.defaultMissionItemAltitude : null function onRawValueChanged() { if (_visualItems.count > 1) { - mainWindow.showMessageDialog(qsTr("Apply new altitude"), - qsTr("You have changed the default altitude for mission items. Would you like to apply that altitude to all the items in the current mission?"), - StandardButton.Yes | StandardButton.No, - function() { _missionController.applyDefaultMissionAltitude() }) + mainWindow.showComponentDialog(applyNewAltitude, qsTr("Apply new altitude"), mainWindow.showDialogDefaultWidth, StandardButton.Yes | StandardButton.No) + } + } + } + + Component { + id: applyNewAltitude + QGCViewMessage { + message: qsTr("You have changed the default altitude for mission items. Would you like to apply that altitude to all the items in the current mission?") + function accept() { + hideDialog() + _missionController.applyDefaultMissionAltitude() } } } @@ -126,7 +159,7 @@ Item { onClicked: { _planMasterController.showPlanFromManagerVehicle() _promptForPlanUsageShowing = false - close(); + hideDialog(); } } @@ -140,15 +173,45 @@ Item { _planMasterController.dirty = true } _promptForPlanUsageShowing = false - close() + hideDialog() } } } } } + + Component { + id: firmwareOrVehicleMismatchUploadDialogComponent + QGCViewMessage { + message: qsTr("This Plan was created for a different firmware or vehicle type than the firmware/vehicle type of vehicle you are uploading to. " + + "This can lead to errors or incorrect behavior. " + + "It is recommended to recreate the Plan for the correct firmware/vehicle type.\n\n" + + "Click 'Ok' to upload the Plan anyway.") + + function accept() { + _planMasterController.sendToVehicle() + hideDialog() + } + } + } + + Connections { + target: QGroundControl.airspaceManager + function onAirspaceVisibleChanged() { + planControlColapsed = QGroundControl.airspaceManager.airspaceVisible + } + } + + Component { + id: noItemForKML + QGCViewMessage { + message: qsTr("You need at least one item to create a KML.") + } + } + PlanMasterController { - id: planMasterController + id: _planMasterController flyView: false Component.onCompleted: { @@ -160,7 +223,7 @@ Item { onPromptForPlanUsageOnVehicleChange: { if (!_promptForPlanUsageShowing) { _promptForPlanUsageShowing = true - promptForPlanUsageOnVehicleChangePopupComponent.createObject(mainWindow).open() + mainWindow.showPopupDialogFromComponent(promptForPlanUsageOnVehicleChangePopupComponent) } } @@ -197,13 +260,7 @@ Item { mainWindow.showMessageDialog(qsTr("Send To Vehicle"), qsTr("Current mission must be paused prior to uploading a new Plan")) break case MissionController.SendToVehiclePreCheckStateFirwmareVehicleMismatch: - mainWindow.showMessageDialog(qsTr("Plan Upload"), - qsTr("This Plan was created for a different firmware or vehicle type than the firmware/vehicle type of vehicle you are uploading to. " + - "This can lead to errors or incorrect behavior. " + - "It is recommended to recreate the Plan for the correct firmware/vehicle type.\n\n" + - "Click 'Ok' to upload the Plan anyway."), - StandardButton.Ok | StandardButton.Cancel, - function() { _planMasterController.sendToVehicle() }) + mainWindow.showComponentDialog(firmwareOrVehicleMismatchUploadDialogComponent, qsTr("Plan Upload"), mainWindow.showDialogDefaultWidth, StandardButton.Ok | StandardButton.Cancel) break } } @@ -296,6 +353,8 @@ Item { } } + property int _moveDialogMissionItemIndex + QGCFileDialog { id: fileDialog folder: _appSettings ? _appSettings.missionSavePath : "" @@ -319,6 +378,38 @@ Item { } } + Component { + id: moveDialog + QGCViewDialog { + function accept() { + var toIndex = toCombo.currentIndex + if (toIndex === 0) { + toIndex = 1 + } + _missionController.moveMissionItem(_moveDialogMissionItemIndex, toIndex) + hideDialog() + } + Column { + anchors.left: parent.left + anchors.right: parent.right + spacing: ScreenTools.defaultFontPixelHeight + + QGCLabel { + anchors.left: parent.left + anchors.right: parent.right + wrapMode: Text.WordWrap + text: qsTr("Move the selected mission item to the be after following mission item:") + } + + QGCComboBox { + id: toCombo + model: _visualItems.count + currentIndex: _moveDialogMissionItemIndex + } + } + } + } + Item { id: panel anchors.fill: parent @@ -348,9 +439,11 @@ Item { onZoomLevelChanged: { QGroundControl.flightMapZoom = zoomLevel + updateAirspace(false) } onCenterChanged: { QGroundControl.flightMapPosition = center + updateAirspace(false) } MouseArea { @@ -490,6 +583,28 @@ Item { planView: true opacity: _editingLayer != _layerRallyPoints ? editorMap._nonInteractiveOpacity : 1 } + + // Airspace overlap support + MapItemView { + model: _airspaceEnabled && QGroundControl.airspaceManager.airspaceVisible ? QGroundControl.airspaceManager.airspaces.circles : [] + delegate: MapCircle { + center: object.center + radius: object.radius + color: object.color + border.color: object.lineColor + border.width: object.lineWidth + } + } + + MapItemView { + model: _airspaceEnabled && QGroundControl.airspaceManager.airspaceVisible ? QGroundControl.airspaceManager.airspaces.polygons : [] + delegate: MapPolygon { + path: object.polygon + color: object.color + border.color: object.lineColor + border.width: object.lineWidth + } + } } //----------------------------------------------------------- @@ -636,11 +751,67 @@ Item { anchors.right: parent.right anchors.top: parent.top //------------------------------------------------------- + // Airmap Airspace Control + AirspaceControl { + id: airspaceControl + width: parent.width + visible: _airspaceEnabled + planView: true + showColapse: true + } + //------------------------------------------------------- + // Mission Controls (Colapsed) + Rectangle { + width: parent.width + height: planControlColapsed ? colapsedRow.height + ScreenTools.defaultFontPixelHeight : 0 + color: qgcPal.missionItemEditor + radius: _radius + visible: planControlColapsed && _airspaceEnabled + Row { + id: colapsedRow + spacing: ScreenTools.defaultFontPixelWidth + anchors.left: parent.left + anchors.leftMargin: ScreenTools.defaultFontPixelWidth + anchors.verticalCenter: parent.verticalCenter + QGCColoredImage { + width: height + height: ScreenTools.defaultFontPixelWidth * 2.5 + sourceSize.height: height + source: "qrc:/res/waypoint.svg" + color: qgcPal.text + anchors.verticalCenter: parent.verticalCenter + } + QGCLabel { + text: qsTr("Plan") + color: qgcPal.text + anchors.verticalCenter: parent.verticalCenter + } + } + QGCColoredImage { + width: height + height: ScreenTools.defaultFontPixelWidth * 2.5 + sourceSize.height: height + source: QGroundControl.airmapSupported ? "qrc:/airmap/expand.svg" : "" + color: "white" + visible: QGroundControl.airmapSupported + anchors.right: parent.right + anchors.rightMargin: ScreenTools.defaultFontPixelWidth + anchors.verticalCenter: parent.verticalCenter + } + MouseArea { + anchors.fill: parent + enabled: QGroundControl.airmapSupported + onClicked: { + QGroundControl.airspaceManager.airspaceVisible = false + } + } + } + //------------------------------------------------------- // Mission Controls (Expanded) QGCTabBar { id: layerTabBar width: parent.width - visible: QGroundControl.corePlugin.options.enablePlanViewSelector + visible: (!planControlColapsed || !_airspaceEnabled) && QGroundControl.corePlugin.options.enablePlanViewSelector Component.onCompleted: currentIndex = 0 QGCTabButton { text: qsTr("Mission") @@ -682,7 +853,7 @@ Item { map: editorMap masterController: _planMasterController missionItem: object - width: missionItemEditorListView.width + width: parent.width readOnly: false onClicked: _missionController.setCurrentPlanViewSeqNum(object.sequenceNumber, false) onRemove: { @@ -730,19 +901,6 @@ Item { } } - QGCLabel { - // Elevation provider notice on top of terrain plot - readonly property string _licenseString: QGroundControl.elevationProviderNotice - - id: licenseLabel - visible: terrainStatus.visible && _licenseString !== "" - anchors.bottom: terrainStatus.top - anchors.horizontalCenter: terrainStatus.horizontalCenter - anchors.bottomMargin: ScreenTools.defaultFontPixelWidth * 0.5 - font.pointSize: ScreenTools.smallFontPointSize - text: qsTr("Powered by %1").arg(_licenseString) - } - TerrainStatus { id: terrainStatus anchors.margins: _toolsMargin @@ -777,33 +935,53 @@ Item { } } - function showLoadFromFileOverwritePrompt(title) { - mainWindow.showMessageDialog(title, - qsTr("You have unsaved/unsent changes. Loading from a file will lose these changes. Are you sure you want to load from a file?"), - StandardButton.Yes | StandardButton.Cancel, - function() { _planMasterController.loadFromSelectedFile() } ) - } - Component { - id: createPlanRemoveAllPromptDialog - - QGCSimpleMessageDialog { - title: qsTr("Create Plan") - text: qsTr("Are you sure you want to remove current plan and create a new plan? ") - buttons: StandardButton.Yes | StandardButton.No - - property var mapCenter - property var planCreator - - onAccepted: planCreator.createPlan(mapCenter) + id: syncLoadFromVehicleOverwrite + QGCViewMessage { + id: syncLoadFromVehicleCheck + message: qsTr("You have unsaved/unsent changes. Loading from the Vehicle will lose these changes. Are you sure you want to load from the Vehicle?") + function accept() { + hideDialog() + _planMasterController.loadFromVehicle() + } } } - function clearButtonClicked() { - mainWindow.showMessageDialog(qsTr("Clear"), - qsTr("Are you sure you want to remove all mission items and clear the mission from the vehicle?"), - StandardButton.Yes | StandardButton.Cancel, - function() { _planMasterController.removeAllFromVehicle(); _missionController.setCurrentPlanViewSeqNum(0, true) }) + Component { + id: syncLoadFromFileOverwrite + QGCViewMessage { + id: syncLoadFromVehicleCheck + message: qsTr("You have unsaved/unsent changes. Loading from a file will lose these changes. Are you sure you want to load from a file?") + function accept() { + hideDialog() + _planMasterController.loadFromSelectedFile() + } + } + } + + property var createPlanRemoveAllPromptDialogMapCenter + property var createPlanRemoveAllPromptDialogPlanCreator + Component { + id: createPlanRemoveAllPromptDialog + QGCViewMessage { + message: qsTr("Are you sure you want to remove current plan and create a new plan? ") + function accept() { + createPlanRemoveAllPromptDialogPlanCreator.createPlan(createPlanRemoveAllPromptDialogMapCenter) + hideDialog() + } + } + } + + Component { + id: clearVehicleMissionDialog + QGCViewMessage { + message: qsTr("Are you sure you want to remove all mission items and clear the mission from the vehicle?") + function accept() { + _planMasterController.removeAllFromVehicle() + _missionController.setCurrentPlanViewSeqNum(0, true) + hideDialog() + } + } } //- ToolStrip DropPanel Components @@ -841,17 +1019,6 @@ Item { } // Column } - function downloadClicked(title) { - if (_planMasterController.dirty) { - mainWindow.showMessageDialog(title, - qsTr("You have unsaved/unsent changes. Loading from the Vehicle will lose these changes. Are you sure you want to load from the Vehicle?"), - StandardButton.Yes | StandardButton.Cancel, - function() { _planMasterController.loadFromVehicle() }) - } else { - _planMasterController.loadFromVehicle() - } - } - Component { id: syncDropPanel @@ -859,7 +1026,7 @@ Item { id: columnHolder spacing: _margin - property string _overwriteText: qsTr("Plan overwrite") + property string _overwriteText: (_editingLayer == _layerMission) ? qsTr("Mission overwrite") : ((_editingLayer == _layerGeoFence) ? qsTr("GeoFence overwrite") : qsTr("Rally Points overwrite")) QGCLabel { id: unsavedChangedLabel @@ -924,7 +1091,9 @@ Item { preventStealing: true onClicked: { if (_planMasterController.containsItems) { - createPlanRemoveAllPromptDialog.createObject(mainWindow, { mapCenter: _mapCenter(), planCreator: object }).open() + createPlanRemoveAllPromptDialogMapCenter = _mapCenter() + createPlanRemoveAllPromptDialogPlanCreator = object + mainWindow.showComponentDialog(createPlanRemoveAllPromptDialog, qsTr("Create Plan"), mainWindow.showDialogDefaultWidth, StandardButton.Yes | StandardButton.No) } else { object.createPlan(_mapCenter()) } @@ -952,6 +1121,17 @@ Item { columnSpacing: ScreenTools.defaultFontPixelWidth visible: storageSection.visible + /*QGCButton { + text: qsTr("New...") + Layout.fillWidth: true + onClicked: { + dropPanel.hide() + if (_planMasterController.containsItems) { + mainWindow.showComponentDialog(removeAllPromptDialog, qsTr("New Plan"), mainWindow.showDialogDefaultWidth, StandardButton.Yes | StandardButton.No) + } + } + }*/ + QGCButton { text: qsTr("Open...") Layout.fillWidth: true @@ -959,7 +1139,7 @@ Item { onClicked: { dropPanel.hide() if (_planMasterController.dirty) { - showLoadFromFileOverwritePrompt(columnHolder._overwriteText) + mainWindow.showComponentDialog(syncLoadFromFileOverwrite, columnHolder._overwriteText, mainWindow.showDialogDefaultWidth, StandardButton.Yes | StandardButton.Cancel) } else { _planMasterController.loadFromSelectedFile() } @@ -998,7 +1178,7 @@ Item { onClicked: { // First point does not count if (_visualItems.count < 2) { - mainWindow.showMessageDialog(qsTr("KML"), qsTr("You need at least one item to create a KML.")) + mainWindow.showComponentDialog(noItemForKML, qsTr("KML"), mainWindow.showDialogDefaultWidth, StandardButton.Cancel) return } dropPanel.hide() @@ -1034,10 +1214,13 @@ Item { Layout.fillWidth: true enabled: !_planMasterController.offline && !_planMasterController.syncInProgress visible: !QGroundControl.corePlugin.options.disableVehicleConnection - onClicked: { dropPanel.hide() - downloadClicked(columnHolder._overwriteText) + if (_planMasterController.dirty) { + mainWindow.showComponentDialog(syncLoadFromVehicleOverwrite, columnHolder._overwriteText, mainWindow.showDialogDefaultWidth, StandardButton.Yes | StandardButton.Cancel) + } else { + _planMasterController.loadFromVehicle() + } } } @@ -1049,7 +1232,7 @@ Item { visible: !QGroundControl.corePlugin.options.disableVehicleConnection onClicked: { dropPanel.hide() - clearButtonClicked() + mainWindow.showComponentDialog(clearVehicleMissionDialog, text, mainWindow.showDialogDefaultWidth, StandardButton.Yes | StandardButton.Cancel) } } } diff --git a/src/PlanView/SimpleItemEditor.qml b/src/PlanView/SimpleItemEditor.qml index 24e711b..9d97067 100644 --- a/src/PlanView/SimpleItemEditor.qml +++ b/src/PlanView/SimpleItemEditor.qml @@ -145,7 +145,7 @@ Rectangle { removeModes.push(QGroundControl.AltitudeModeAbsolute) } removeModes.push(QGroundControl.AltitudeModeMixed) - altModeDialogComponent.createObject(mainWindow, { rgRemoveModes: removeModes, updateAltModeFn: updateFunction }).open() + mainWindow.showPopupDialogFromComponent(altModeDialogComponent, { rgRemoveModes: removeModes, updateAltModeFn: updateFunction }) } } diff --git a/src/PlanView/StructureScanEditor.qml b/src/PlanView/StructureScanEditor.qml index 913a8e6..7d6fa1a 100644 --- a/src/PlanView/StructureScanEditor.qml +++ b/src/PlanView/StructureScanEditor.qml @@ -49,30 +49,51 @@ Rectangle { QGCPalette { id: qgcPal; colorGroupEnabled: true } - ColumnLayout { + Column { id: editorColumn anchors.margins: _margin anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right - QGCLabel { - id: wizardLabel + ColumnLayout { + id: wizardColumn + anchors.left: parent.left + anchors.right: parent.right + spacing: _margin + visible: !missionItem.structurePolygon.isValid || missionItem.wizardMode + + QGCLabel { Layout.fillWidth: true wrapMode: Text.WordWrap - horizontalAlignment: Text.AlignHCenter text: qsTr("Use the Polygon Tools to create the polygon which outlines the structure.") - visible: !missionItem.structurePolygon.isValid || missionItem.wizardMode } - ColumnLayout { - Layout.fillWidth: true + /* + Trial of new "done" model so leaving for now in case it comes back + QGCButton { + text: qsTr("Done With Polygon") + Layout.fillWidth: true + enabled: missionItem.structurePolygon.isValid && !missionItem.structurePolygon.traceMode + onClicked: { + missionItem.wizardMode = false + // Trial of no auto select next item + //editorRoot.selectNextNotReadyItem() + } + } + */ + } + + Column { + anchors.left: parent.left + anchors.right: parent.right spacing: _margin - visible: !wizardLabel.visible + visible: !wizardColumn.visible QGCTabBar { id: tabBar - Layout.fillWidth: true + anchors.left: parent.left + anchors.right: parent.right Component.onCompleted: currentIndex = 0 @@ -80,20 +101,23 @@ Rectangle { QGCTabButton { text: qsTr("Camera") } } - ColumnLayout { - Layout.fillWidth: true + Column { + anchors.left: parent.left + anchors.right: parent.right spacing: _margin visible: tabBar.currentIndex == 0 QGCLabel { - Layout.fillWidth: true + anchors.left: parent.left + anchors.right: parent.right text: qsTr("Note: Polygon respresents structure surface not vehicle flight path.") wrapMode: Text.WordWrap font.pointSize: ScreenTools.smallFontPointSize } QGCLabel { - Layout.fillWidth: true + anchors.left: parent.left + anchors.right: parent.right text: qsTr("WARNING: Photo interval is below minimum interval (%1 secs) supported by camera.").arg(_cameraMinTriggerInterval.toFixed(1)) wrapMode: Text.WordWrap color: qgcPal.warningText @@ -101,7 +125,6 @@ Rectangle { } CameraCalcGrid { - Layout.fillWidth: true cameraCalc: missionItem.cameraCalc vehicleFlightIsFrontal: false distanceToSurfaceLabel: qsTr("Scan Distance") @@ -111,17 +134,20 @@ Rectangle { SectionHeader { id: scanHeader - Layout.fillWidth: true + anchors.left: parent.left + anchors.right: parent.right text: qsTr("Scan") } - ColumnLayout { - Layout.fillWidth: true + Column { + anchors.left: parent.left + anchors.right: parent.right spacing: _margin visible: scanHeader.checked GridLayout { - Layout.fillWidth: true + anchors.left: parent.left + anchors.right: parent.right columnSpacing: _margin rowSpacing: _margin columns: 2 @@ -180,7 +206,8 @@ Rectangle { SectionHeader { id: statsHeader - Layout.fillWidth: true + anchors.left: parent.left + anchors.right: parent.right text: qsTr("Statistics") } @@ -212,13 +239,13 @@ Rectangle { } } // Grid Column - ColumnLayout { - Layout.fillWidth: true + Column { + anchors.left: parent.left + anchors.right: parent.right spacing: _margin visible: tabBar.currentIndex == 1 CameraCalcCamera { - Layout.fillWidth: true cameraCalc: missionItem.cameraCalc } } diff --git a/src/PlanView/TerrainStatus.qml b/src/PlanView/TerrainStatus.qml index fe3418d..51f1109 100644 --- a/src/PlanView/TerrainStatus.qml +++ b/src/PlanView/TerrainStatus.qml @@ -50,6 +50,7 @@ Rectangle { QGCFlickable { id: terrainProfileFlickable + //anchors.margins: _margins anchors.top: parent.top anchors.bottom: parent.bottom anchors.leftMargin: titleLabel.contentHeight diff --git a/src/PlanView/TransectStyleComplexItemEditor.qml b/src/PlanView/TransectStyleComplexItemEditor.qml index acc385d..1361fa9 100644 --- a/src/PlanView/TransectStyleComplexItemEditor.qml +++ b/src/PlanView/TransectStyleComplexItemEditor.qml @@ -184,19 +184,21 @@ Rectangle { Layout.fillWidth: true text: qsTr("Delete Preset") enabled: _missionItem.presetNames.length != 0 - onClicked: deletePresetDialog.createObject(mainWindow, { presetName: presetCombo.textAt(presetCombo.currentIndex) }).open() + onClicked: mainWindow.showPopupDialogFromComponent(deletePresetDialog, { presetName: presetCombo.textAt(presetCombo.currentIndex) }) Component { id: deletePresetDialog - QGCSimpleMessageDialog { + QGCPopupDialog { title: qsTr("Delete Preset") - text: qsTr("Are you sure you want to delete '%1' preset?").arg(presetName) buttons: StandardButton.Yes | StandardButton.No - property string presetName + QGCLabel { text: qsTr("Are you sure you want to delete '%1' preset?").arg(dialogProperties.presetName) } - onAccepted: { _missionItem.deletePreset(presetName) } + function accept() { + _missionItem.deletePreset(dialogProperties.presetName) + hideDialog() + } } } } @@ -208,7 +210,7 @@ Rectangle { Layout.alignment: Qt.AlignCenter Layout.fillWidth: true text: qsTr("Save Settings As New Preset") - onClicked: savePresetDialog.createObject(mainWindow).open() + onClicked: mainWindow.showPopupDialogFromComponent(savePresetDialog) } SectionHeader { @@ -247,11 +249,10 @@ Rectangle { title: qsTr("Save Preset") buttons: StandardButton.Save | StandardButton.Cancel - onAccepted: { + function accept() { if (presetNameField.text != "") { _missionItem.savePreset(presetNameField.text.trim()) - } else { - preventClose = true + hideDialog() } } @@ -280,13 +281,13 @@ Rectangle { function validateText(text) { if (text.trim() === "") { nameError.text = qsTr("Preset name cannot be blank.") - popupDialog.acceptButtonEnabled = false + popupDialog.disableAcceptButton() } else if (text.includes("/")) { nameError.text = qsTr("Preset name cannot include the \"/\" character.") - popupDialog.acceptButtonEnabled = false + popupDialog.disableAcceptButton() } else { nameError.text = "" - popupDialog.acceptButtonEnabled = true + popupDialog.enableAcceptButton() } } } diff --git a/src/PlanView/TransectStyleComplexItemTerrainFollow.qml b/src/PlanView/TransectStyleComplexItemTerrainFollow.qml index 7dde52f..0ed90b9 100644 --- a/src/PlanView/TransectStyleComplexItemTerrainFollow.qml +++ b/src/PlanView/TransectStyleComplexItemTerrainFollow.qml @@ -28,7 +28,7 @@ ColumnLayout { if (!QGroundControl.corePlugin.options.showMissionAbsoluteAltitude || !_missionItem.cameraCalc.isManualCamera) { removeModes.push(QGroundControl.AltitudeModeAbsolute) } - altModeDialogComponent.createObject(mainWindow, { rgRemoveModes: removeModes, updateAltModeFn: updateFunction }).open() + mainWindow.showPopupDialogFromComponent(altModeDialogComponent, { rgRemoveModes: removeModes, updateAltModeFn: updateFunction }) } Component { id: altModeDialogComponent; AltModeDialog { } } diff --git a/src/PositionManager/PositionManager.cpp b/src/PositionManager/PositionManager.cpp index 78fbd8f..7cbf719 100644 --- a/src/PositionManager/PositionManager.cpp +++ b/src/PositionManager/PositionManager.cpp @@ -153,17 +153,6 @@ void QGCPositionManager::setPositionSource(QGCPositionManager::QGCPositionSource if (_currentSource != nullptr) { _currentSource->stopUpdates(); disconnect(_currentSource); - - // Reset all values so we dont get stuck on old values - _geoPositionInfo = QGeoPositionInfo(); - _gcsPosition = QGeoCoordinate(); - _gcsHeading = qQNaN(); - _gcsPositionHorizontalAccuracy = std::numeric_limits::infinity(); - - emit gcsPositionChanged(_gcsPosition); - emit gcsHeadingChanged(_gcsHeading); - emit positionInfoUpdated(_geoPositionInfo); - emit gcsPositionHorizontalAccuracyChanged(); } if (qgcApp()->runningUnitTests()) { @@ -181,7 +170,7 @@ void QGCPositionManager::setPositionSource(QGCPositionManager::QGCPositionSource _currentSource = _nmeaSource; break; case QGCPositionManager::InternalGPS: - default: + default: _currentSource = _defaultSource; break; } diff --git a/src/QGCApplication.cc b/src/QGCApplication.cc index 77c8b83..4e8088b 100644 --- a/src/QGCApplication.cc +++ b/src/QGCApplication.cc @@ -102,9 +102,6 @@ #include "QGCMAVLink.h" #include "VehicleLinkManager.h" #include "Autotune.h" -#include "RemoteIDManager.h" -#include "CustomAction.h" -#include "CustomActionManager.h" #if defined(QGC_ENABLE_PAIRING) #include "PairingManager.h" @@ -466,7 +463,6 @@ void QGCApplication::_initCommon() qmlRegisterUncreatableType (kQGCVehicle, 1, 0, "LinkInterface", kRefOnly); qmlRegisterUncreatableType (kQGCVehicle, 1, 0, "VehicleLinkManager", kRefOnly); qmlRegisterUncreatableType (kQGCVehicle, 1, 0, "Autotune", kRefOnly); - qmlRegisterUncreatableType (kQGCVehicle, 1, 0, "RemoteIDManager", kRefOnly); qmlRegisterUncreatableType (kQGCControllers, 1, 0, "MissionController", kRefOnly); qmlRegisterUncreatableType (kQGCControllers, 1, 0, "GeoFenceController", kRefOnly); @@ -515,8 +511,6 @@ void QGCApplication::_initCommon() qmlRegisterType (kQGCControllers, 1, 0, "SyslinkComponentController"); qmlRegisterType (kQGCControllers, 1, 0, "EditPositionDialogController"); qmlRegisterType (kQGCControllers, 1, 0, "RCToParamDialogController"); - qmlRegisterType (kQGCControllers, 1, 0, "CustomAction"); - qmlRegisterType (kQGCControllers, 1, 0, "CustomActionManager"); qmlRegisterType ("QGroundControl.Controls", 1, 0, "TerrainProfile"); qmlRegisterType ("QGroundControl.Controls", 1, 0, "ToolStripAction"); @@ -755,7 +749,7 @@ void QGCApplication::showAppMessage(const QString& message, const QString& title if (rootQmlObject) { QVariant varReturn; QVariant varMessage = QVariant::fromValue(message); - QMetaObject::invokeMethod(_rootQmlObject(), "_showMessageDialog", Q_RETURN_ARG(QVariant, varReturn), Q_ARG(QVariant, dialogTitle), Q_ARG(QVariant, varMessage)); + QMetaObject::invokeMethod(_rootQmlObject(), "showMessageDialog", Q_RETURN_ARG(QVariant, varReturn), Q_ARG(QVariant, dialogTitle), Q_ARG(QVariant, varMessage)); } else if (runningUnitTests()) { // Unit tests can run without UI qDebug() << "QGCApplication::showAppMessage unittest title:message" << dialogTitle << message; @@ -825,6 +819,7 @@ bool QGCApplication::isInternetAvailable() void QGCApplication::_checkForNewVersion() { +#ifndef __mobile__ if (!_runningUnitTests) { if (_parseVersionText(applicationVersion(), _majorVersion, _minorVersion, _buildVersion)) { QString versionCheckFile = toolbox()->corePlugin()->stableVersionCheckFileUrl(); @@ -835,10 +830,15 @@ void QGCApplication::_checkForNewVersion() } } } +#endif } void QGCApplication::_qgcCurrentStableVersionDownloadComplete(QString /*remoteFile*/, QString localFile, QString errorMsg) { +#ifdef __mobile__ + Q_UNUSED(localFile) + Q_UNUSED(errorMsg) +#else if (errorMsg.isEmpty()) { QFile versionFile(localFile); if (versionFile.open(QIODevice::ReadOnly)) { @@ -861,6 +861,7 @@ void QGCApplication::_qgcCurrentStableVersionDownloadComplete(QString /*remoteFi } sender()->deleteLater(); +#endif } bool QGCApplication::_parseVersionText(const QString& versionString, int& majorVersion, int& minorVersion, int& buildVersion) diff --git a/src/QGCCachedFileDownload.cc b/src/QGCCachedFileDownload.cc deleted file mode 100644 index 2dc1c63..0000000 --- a/src/QGCCachedFileDownload.cc +++ /dev/null @@ -1,71 +0,0 @@ -/**************************************************************************** - * - * (c) 2022 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - - -#include "QGCCachedFileDownload.h" - -QGCCachedFileDownload::QGCCachedFileDownload(QObject* parent, const QString& cacheDirectory) - : QObject(parent), _fileDownload(new QGCFileDownload(this)), _diskCache(new QNetworkDiskCache(this)) -{ - _diskCache->setCacheDirectory(cacheDirectory); - _fileDownload->setCache(_diskCache); - - connect(_fileDownload, &QGCFileDownload::downloadProgress, this, &QGCCachedFileDownload::downloadProgress); - connect(_fileDownload, &QGCFileDownload::downloadComplete, this, &QGCCachedFileDownload::onDownloadCompleted); -} - -bool QGCCachedFileDownload::download(const QString& url, int maxCacheAgeSec) -{ - _downloadFromNetwork = false; - // Check cache - QNetworkCacheMetaData metadata = _diskCache->metaData(url); - if (metadata.isValid() && metadata.attributes().contains(QNetworkRequest::Attribute::User)) { - - // We want the following behavior: - // - Use the cached file if not older than maxCacheAgeSec - // - Otherwise try to download the file, but still use the cached file if there's no connection - - QDateTime creationTime = metadata.attributes().find(QNetworkRequest::Attribute::User)->toDateTime(); - bool expired = creationTime.addSecs(maxCacheAgeSec) < QDateTime::currentDateTime(); - if (expired) { - // Force network download, as Qt would still use the cache otherwise (w/o checking the remote) - auto attributes = QVector{qMakePair(QNetworkRequest::CacheLoadControlAttribute, QVariant{QNetworkRequest::AlwaysNetwork})}; - _downloadFromNetwork = true; - return _fileDownload->download(url, attributes); - } - - auto attributes = QVector{qMakePair(QNetworkRequest::CacheLoadControlAttribute, QVariant{QNetworkRequest::PreferCache})}; - return _fileDownload->download(url, attributes); - - } else { - return _fileDownload->download(url); - } -} - -void QGCCachedFileDownload::onDownloadCompleted(QString remoteFile, QString localFile, QString errorMsg) -{ - // Set cache creation time if not set already (the Qt docs mention there's a creation time, but I could not find any API) - QNetworkCacheMetaData metadata = _diskCache->metaData(remoteFile); - if (metadata.isValid() && !metadata.attributes().contains(QNetworkRequest::Attribute::User)) { - QNetworkCacheMetaData::AttributesMap attributes = metadata.attributes(); - attributes.insert(QNetworkRequest::Attribute::User, QDateTime::currentDateTime()); - metadata.setAttributes(attributes); - _diskCache->updateMetaData(metadata); - } - - // If we forced network download, but it failed, try again with the cache - if (_downloadFromNetwork && !errorMsg.isEmpty()) { - _downloadFromNetwork = false; - if (!_fileDownload->download(remoteFile)) { - emit downloadComplete(remoteFile, localFile, errorMsg); - } - } else { - emit downloadComplete(remoteFile, localFile, errorMsg); - } -} diff --git a/src/QGCCachedFileDownload.h b/src/QGCCachedFileDownload.h deleted file mode 100644 index f47ba73..0000000 --- a/src/QGCCachedFileDownload.h +++ /dev/null @@ -1,39 +0,0 @@ -/**************************************************************************** - * - * (c) 2022 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -#pragma once - -#include "QGCFileDownload.h" - -#include - -class QGCCachedFileDownload : public QObject -{ - Q_OBJECT - -public: - QGCCachedFileDownload(QObject* parent, const QString& cacheDirectory); - - /// Download the specified remote file. - /// @param url File to download - /// @param maxCacheAgeSec Maximum age of cached item in seconds - /// @return true: Asynchronous download has started, false: Download initialization failed - bool download(const QString& url, int maxCacheAgeSec); - -signals: - void downloadProgress(qint64 curr, qint64 total); - void downloadComplete(QString remoteFile, QString localFile, QString errorMsg); - -private: - void onDownloadCompleted(QString remoteFile, QString localFile, QString errorMsg); - - QGCFileDownload* _fileDownload; - QNetworkDiskCache* _diskCache; - bool _downloadFromNetwork{false}; -}; diff --git a/src/QGCFileDownload.cc b/src/QGCFileDownload.cc index e67da07..a818e36 100644 --- a/src/QGCFileDownload.cc +++ b/src/QGCFileDownload.cc @@ -20,10 +20,9 @@ QGCFileDownload::QGCFileDownload(QObject* parent) } -bool QGCFileDownload::download(const QString& remoteFile, const QVector>& requestAttributes, bool redirect) +bool QGCFileDownload::download(const QString& remoteFile, bool redirect) { if (!redirect) { - _requestAttributes = requestAttributes; _originalRemoteFile = remoteFile; } @@ -46,10 +45,6 @@ bool QGCFileDownload::download(const QString& remoteFile, const QVectorattribute(QNetworkRequest::RedirectionTargetAttribute); if (!redirectionTarget.isNull()) { QUrl redirectUrl = reply->url().resolved(redirectionTarget.toUrl()); - download(redirectUrl.toString(), _requestAttributes, true /* redirect */); + download(redirectUrl.toString(), true /* redirect */); reply->deleteLater(); return; } @@ -150,19 +143,3 @@ void QGCFileDownload::_downloadError(QNetworkReply::NetworkError code) emit downloadComplete(_originalRemoteFile, QString(), errorMsg); } - -void QGCFileDownload::setIgnoreSSLErrorsIfNeeded(QNetworkReply& networkReply) -{ - // Some systems (like Ubuntu 22.04) only ship with OpenSSL 3.x, however Qt 5.15.2 links against OpenSSL 1.x. - // This results in unresolved symbols for EVP_PKEY_base_id and SSL_get_peer_certificate. - // To still get a connection we have to ignore certificate verification (connection is still encrypted but open to MITM attacks) - // See https://bugreports.qt.io/browse/QTBUG-115146 - const bool sslLibraryBuildIs1x = (QSslSocket::sslLibraryBuildVersionNumber() & 0xf0000000) == 0x10000000; - const bool sslLibraryIs3x = (QSslSocket::sslLibraryVersionNumber() & 0xf0000000) == 0x30000000; - if (sslLibraryBuildIs1x && sslLibraryIs3x) { - qWarning() << "Ignoring ssl certificates due to OpenSSL version mismatch"; - QList errorsThatCanBeIgnored; - errorsThatCanBeIgnored << QSslError(QSslError::NoPeerCertificate); - networkReply.ignoreSslErrors(errorsThatCanBeIgnored); - } -} diff --git a/src/QGCFileDownload.h b/src/QGCFileDownload.h index 3c9932a..62d04a9 100644 --- a/src/QGCFileDownload.h +++ b/src/QGCFileDownload.h @@ -20,12 +20,9 @@ public: /// Download the specified remote file. /// @param remoteFile File to download. Can be http address or file system path. - /// @param requestAttributes Optional request attributes to set /// @param redirect true: call is internal due to redirect /// @return true: Asynchronous download has started, false: Download initialization failed - bool download(const QString& remoteFile, const QVector>& requestAttributes={}, bool redirect = false); - - static void setIgnoreSSLErrorsIfNeeded(QNetworkReply& networkReply); + bool download(const QString& remoteFile, bool redirect = false); signals: void downloadProgress(qint64 curr, qint64 total); @@ -36,5 +33,4 @@ private: void _downloadError(QNetworkReply::NetworkError code); QString _originalRemoteFile; - QVector> _requestAttributes; }; diff --git a/src/QGCLoggingCategory.cc b/src/QGCLoggingCategory.cc index 791de78..54d2cad 100644 --- a/src/QGCLoggingCategory.cc +++ b/src/QGCLoggingCategory.cc @@ -29,8 +29,6 @@ QGC_LOGGING_CATEGORY(GuidedActionsControllerLog, "GuidedActionsControllerLog" QGC_LOGGING_CATEGORY(ADSBVehicleManagerLog, "ADSBVehicleManagerLog") QGC_LOGGING_CATEGORY(LocalizationLog, "LocalizationLog") QGC_LOGGING_CATEGORY(VideoAllLog, kVideoAllLogCategory) -QGC_LOGGING_CATEGORY(JoystickLog, "JoystickLog") - QGCLoggingCategoryRegister* _instance = nullptr; const char* QGCLoggingCategoryRegister::_filterRulesSettingsGroup = "LoggingFilters"; diff --git a/src/QGCLoggingCategory.h b/src/QGCLoggingCategory.h index e4d1de3..7b54911 100644 --- a/src/QGCLoggingCategory.h +++ b/src/QGCLoggingCategory.h @@ -24,7 +24,6 @@ Q_DECLARE_LOGGING_CATEGORY(GuidedActionsControllerLog) Q_DECLARE_LOGGING_CATEGORY(ADSBVehicleManagerLog) Q_DECLARE_LOGGING_CATEGORY(LocalizationLog) Q_DECLARE_LOGGING_CATEGORY(VideoAllLog) // turns on all individual QGC video logs -Q_DECLARE_LOGGING_CATEGORY(JoystickLog) /// @def QGC_LOGGING_CATEGORY /// This is a QGC specific replacement for Q_LOGGING_CATEGORY. It will register the category name into a diff --git a/src/QGCToolbox.cc b/src/QGCToolbox.cc index 7fede01..cb6b3a2 100644 --- a/src/QGCToolbox.cc +++ b/src/QGCToolbox.cc @@ -34,6 +34,11 @@ #if defined(QGC_ENABLE_PAIRING) #include "PairingManager.h" #endif +#if defined(QGC_AIRMAP_ENABLED) +#include "AirMapManager.h" +#else +#include "AirspaceManager.h" +#endif #if defined(QGC_GST_TAISYNC_ENABLED) #include "TaisyncManager.h" #endif @@ -72,6 +77,14 @@ QGCToolbox::QGCToolbox(QGCApplication* app) _adsbVehicleManager = new ADSBVehicleManager (app, this); #if defined(QGC_ENABLE_PAIRING) _pairingManager = new PairingManager (app, this); +#endif + //-- Airmap Manager + //-- This should be "pluggable" so an arbitrary AirSpace manager can be used + //-- For now, we instantiate the one and only AirMap provider +#if defined(QGC_AIRMAP_ENABLED) + _airspaceManager = new AirMapManager (app, this); +#else + _airspaceManager = new AirspaceManager (app, this); #endif #if defined(QGC_GST_TAISYNC_ENABLED) _taisyncManager = new TaisyncManager (app, this); @@ -105,6 +118,7 @@ void QGCToolbox::setChildToolboxes(void) _qgcPositionManager->setToolbox(this); _videoManager->setToolbox(this); _mavlinkLogManager->setToolbox(this); + _airspaceManager->setToolbox(this); _adsbVehicleManager->setToolbox(this); #if defined(QGC_GST_TAISYNC_ENABLED) _taisyncManager->setToolbox(this); diff --git a/src/QGCToolbox.h b/src/QGCToolbox.h index 44b87fe..3e49701 100644 --- a/src/QGCToolbox.h +++ b/src/QGCToolbox.h @@ -32,6 +32,7 @@ class VideoManager; class MAVLinkLogManager; class QGCCorePlugin; class SettingsManager; +class AirspaceManager; class ADSBVehicleManager; #if defined(QGC_ENABLE_PAIRING) class PairingManager; @@ -66,6 +67,7 @@ public: MAVLinkLogManager* mavlinkLogManager () { return _mavlinkLogManager; } QGCCorePlugin* corePlugin () { return _corePlugin; } SettingsManager* settingsManager () { return _settingsManager; } + AirspaceManager* airspaceManager () { return _airspaceManager; } ADSBVehicleManager* adsbVehicleManager () { return _adsbVehicleManager; } #if defined(QGC_ENABLE_PAIRING) PairingManager* pairingManager () { return _pairingManager; } @@ -105,6 +107,7 @@ private: MAVLinkLogManager* _mavlinkLogManager = nullptr; QGCCorePlugin* _corePlugin = nullptr; SettingsManager* _settingsManager = nullptr; + AirspaceManager* _airspaceManager = nullptr; ADSBVehicleManager* _adsbVehicleManager = nullptr; #if defined(QGC_ENABLE_PAIRING) PairingManager* _pairingManager = nullptr; diff --git a/src/QmlControls/AltModeDialog.qml b/src/QmlControls/AltModeDialog.qml index 079457f..489641b 100644 --- a/src/QmlControls/AltModeDialog.qml +++ b/src/QmlControls/AltModeDialog.qml @@ -20,20 +20,16 @@ QGCPopupDialog { title: qsTr("Select Altitude Mode") buttons: StandardButton.Close - property var rgRemoveModes - property var updateAltModeFn - property var currentAltMode - Component.onCompleted: { // Check for custom build override on AMSL usage - if (!QGroundControl.corePlugin.options.showMissionAbsoluteAltitude && currentAltMode != QGroundControl.AltitudeModeAbsolute) { - rgRemoveModes.push(QGroundControl.AltitudeModeAbsolute) + if (!QGroundControl.corePlugin.options.showMissionAbsoluteAltitude && dialogProperties.currentAltMode != QGroundControl.AltitudeModeAbsolute) { + dialogProperties.rgRemoveModes.push(QGroundControl.AltitudeModeAbsolute) } // Remove modes specified by consumer - for (var i=0; i - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -#include - -#include "MAVLinkProtocol.h" -#include "Vehicle.h" - -class CustomAction: public QObject -{ - Q_OBJECT - - Q_PROPERTY(QString label READ label CONSTANT) - - -public: - CustomAction() { CustomAction("", MAV_CMD(0)); } // this is required for QML reflection - CustomAction( - QString label, - MAV_CMD mavCmd, - MAV_COMPONENT compId = MAV_COMP_ID_AUTOPILOT1, - float param1 = 0.0f, - float param2 = 0.0f, - float param3 = 0.0f, - float param4 = 0.0f, - float param5 = 0.0f, - float param6 = 0.0f, - float param7 = 0.0f - ): - _label(label), - _mavCmd(mavCmd), - _compId(compId), - _params{ param1, param2, param3, param4, param5, param6, param7 } - {}; - - Q_INVOKABLE void sendTo(Vehicle* vehicle) { - if (vehicle) { - const bool showError = true; - vehicle->sendMavCommand(_compId, _mavCmd, showError, _params[0], _params[1], _params[2], _params[3], _params[4], _params[5], _params[6]); - } - }; - - -private: - QString label() const { return _label; } - - QString _label; - MAV_CMD _mavCmd; - MAV_COMPONENT _compId; - float _params[7]; - -}; diff --git a/src/QmlControls/CustomActionManager.cc b/src/QmlControls/CustomActionManager.cc deleted file mode 100644 index bbf6074..0000000 --- a/src/QmlControls/CustomActionManager.cc +++ /dev/null @@ -1,101 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2023 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -#include - -#include "CustomActionManager.h" -#include "CustomAction.h" -#include "JsonHelper.h" -#include "QGCApplication.h" -#include "SettingsManager.h" - -CustomActionManager::CustomActionManager(void) { - auto flyViewSettings = qgcApp()->toolbox()->settingsManager()->flyViewSettings(); - Fact* customActionsFact = flyViewSettings->customActionDefinitions(); - - connect(customActionsFact, &Fact::valueChanged, this, &CustomActionManager::_loadFromJson); - - // On construction, we only load the Custom Actions if we have a path - // defined, to prevent spurious warnings. - if (!customActionsFact->rawValue().toString().isEmpty()) { - _loadFromJson(customActionsFact->rawValue()); - } -} - -void CustomActionManager::_loadFromJson(QVariant fact) { - QString path = fact.toString(); - - const char* kQgcFileType = "CustomActions"; - const char* kActionListKey = "actions"; - - _actions.clearAndDeleteContents(); - - QString errorString; - int version; - QJsonObject jsonObject = JsonHelper::openInternalQGCJsonFile(path, kQgcFileType, 1, 1, version, errorString); - if (!errorString.isEmpty()) { - qCWarning(GuidedActionsControllerLog) << "Custom Actions Internal Error: " << errorString; - emit actionsChanged(); - return; - } - - QList keyInfoList = { - { kActionListKey, QJsonValue::Array, /* required= */ true }, - }; - if (!JsonHelper::validateKeys(jsonObject, keyInfoList, errorString)) { - qCWarning(GuidedActionsControllerLog) << "Custom Actions JSON document incorrect format:" << errorString; - emit actionsChanged(); - return; - } - - QJsonArray actionList = jsonObject[kActionListKey].toArray(); - for (auto actionJson: actionList) { - if (!actionJson.isObject()) { - qCWarning(GuidedActionsControllerLog) << "Custom Actions JsonValue not an object: " << actionJson; - continue; - } - - auto actionObj = actionJson.toObject(); - - QList actionKeyInfoList = { - { "label", QJsonValue::String, /* required= */ true }, - { "mavCmd", QJsonValue::Double, /* required= */ true }, - - { "compId", QJsonValue::Double, /* required= */ false }, - { "param1", QJsonValue::Double, /* required= */ false }, - { "param2", QJsonValue::Double, /* required= */ false }, - { "param3", QJsonValue::Double, /* required= */ false }, - { "param4", QJsonValue::Double, /* required= */ false }, - { "param5", QJsonValue::Double, /* required= */ false }, - { "param6", QJsonValue::Double, /* required= */ false }, - { "param7", QJsonValue::Double, /* required= */ false }, - }; - if (!JsonHelper::validateKeys(actionObj, actionKeyInfoList, errorString)) { - qCWarning(GuidedActionsControllerLog) << "Custom Actions JSON document incorrect format:" << errorString; - continue; - } - - auto label = actionObj["label"].toString(); - auto mavCmd = (MAV_CMD)actionObj["mavCmd"].toInt(); - auto compId = (MAV_COMPONENT)actionObj["compId"].toInt(MAV_COMP_ID_AUTOPILOT1); - auto param1 = actionObj["param1"].toDouble(0.0); - auto param2 = actionObj["param2"].toDouble(0.0); - auto param3 = actionObj["param3"].toDouble(0.0); - auto param4 = actionObj["param4"].toDouble(0.0); - auto param5 = actionObj["param5"].toDouble(0.0); - auto param6 = actionObj["param6"].toDouble(0.0); - auto param7 = actionObj["param7"].toDouble(0.0); - - CustomAction* action = new CustomAction(label, mavCmd, compId, param1, param2, param3, param4, param5, param6, param7); - QQmlEngine::setObjectOwnership(action, QQmlEngine::CppOwnership); - _actions.append(action); - } - - emit actionsChanged(); -} diff --git a/src/QmlControls/CustomActionManager.h b/src/QmlControls/CustomActionManager.h deleted file mode 100644 index e7f8956..0000000 --- a/src/QmlControls/CustomActionManager.h +++ /dev/null @@ -1,37 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2023 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -#include -#include - - -class CustomActionManager : public QObject -{ - Q_OBJECT - - Q_PROPERTY(QmlObjectListModel* actions READ actions NOTIFY actionsChanged) - Q_PROPERTY(bool hasActions READ hasActions NOTIFY actionsChanged) - -public: - CustomActionManager(void); - - QmlObjectListModel* actions(void) { return &_actions; } - bool hasActions(void) { return _actions.count() > 0; } - -signals: - void actionsChanged(); - -private slots: - void _loadFromJson(QVariant path); - -private: - QmlObjectListModel _actions; - bool _hasActions; - -}; diff --git a/src/QmlControls/CustomActions.json b/src/QmlControls/CustomActions.json deleted file mode 100644 index 76f0f60..0000000 --- a/src/QmlControls/CustomActions.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "version": 1, - "fileType": "CustomActions", - "actions": [ - { - "label": "Image Start Capture", - "mavCmd": 2000, - "compId": 1, - "param1": 0, - "param2": 0, - "param3": 0, - "param4": 0, - "param5": 0, - "param6": 0, - "param7": 0 - }, - { - "label": "Image Stop Capture", - "mavCmd": 2001 - } - ] -} diff --git a/src/QmlControls/EditPositionDialog.qml b/src/QmlControls/EditPositionDialog.qml index 16f3623..c02aa70 100644 --- a/src/QmlControls/EditPositionDialog.qml +++ b/src/QmlControls/EditPositionDialog.qml @@ -10,7 +10,6 @@ import QtQuick 2.3 import QtQuick.Controls 1.2 import QtQuick.Layouts 1.2 -import QtQuick.Dialogs 1.2 import QGroundControl 1.0 import QGroundControl.Palette 1.0 @@ -19,11 +18,7 @@ import QGroundControl.FactControls 1.0 import QGroundControl.ScreenTools 1.0 import QGroundControl.Controllers 1.0 -QGCPopupDialog { - id: root - title: qsTr("Edit Position") - buttons: mainWindow.showDialogDefaultWidth, StandardButton.Close - +QGCViewDialog { property alias coordinate: controller.coordinate property real _margin: ScreenTools.defaultFontPixelWidth / 2 @@ -35,121 +30,127 @@ QGCPopupDialog { Component.onCompleted: initValues() } - Column { - id: column - width: 40 * ScreenTools.defaultFontPixelWidth - spacing: ScreenTools.defaultFontPixelHeight + QGCFlickable { + anchors.fill: parent + contentHeight: column.height - GridLayout { + Column { + id: column anchors.left: parent.left anchors.right: parent.right - columnSpacing: _margin - rowSpacing: _margin - columns: 2 + spacing: ScreenTools.defaultFontPixelHeight - QGCLabel { - text: qsTr("Latitude") - } - FactTextField { - fact: controller.latitude - Layout.fillWidth: true - } + GridLayout { + anchors.left: parent.left + anchors.right: parent.right + columnSpacing: _margin + rowSpacing: _margin + columns: 2 - QGCLabel { - text: qsTr("Longitude") - } - FactTextField { - fact: controller.longitude - Layout.fillWidth: true - } + QGCLabel { + text: qsTr("Latitude") + } + FactTextField { + fact: controller.latitude + Layout.fillWidth: true + } - QGCButton { - text: qsTr("Set Geographic") - Layout.alignment: Qt.AlignRight - Layout.columnSpan: 2 - onClicked: { - controller.setFromGeo() - root.close() + QGCLabel { + text: qsTr("Longitude") + } + FactTextField { + fact: controller.longitude + Layout.fillWidth: true + } + + QGCButton { + text: qsTr("Set Geographic") + Layout.alignment: Qt.AlignRight + Layout.columnSpan: 2 + onClicked: { + controller.setFromGeo() + reject() + } + } + + Item { width: 1; height: ScreenTools.defaultFontPixelHeight; Layout.columnSpan: 2} + + QGCLabel { + text: qsTr("Zone") + } + FactTextField { + fact: controller.zone + Layout.fillWidth: true + } + + QGCLabel { + text: qsTr("Hemisphere") + } + FactComboBox { + fact: controller.hemisphere + indexModel: false + Layout.fillWidth: true + } + + QGCLabel { + text: qsTr("Easting") + } + FactTextField { + fact: controller.easting + Layout.fillWidth: true + } + + QGCLabel { + text: qsTr("Northing") + } + FactTextField { + fact: controller.northing + Layout.fillWidth: true + } + + QGCButton { + text: qsTr("Set UTM") + Layout.alignment: Qt.AlignRight + Layout.columnSpan: 2 + onClicked: { + controller.setFromUTM() + reject() + } + } + + Item { width: 1; height: ScreenTools.defaultFontPixelHeight; Layout.columnSpan: 2} + + QGCLabel { + text: qsTr("MGRS") + } + FactTextField { + fact: controller.mgrs + Layout.fillWidth: true + } + + QGCButton { + text: qsTr("Set MGRS") + Layout.alignment: Qt.AlignRight + Layout.columnSpan: 2 + onClicked: { + controller.setFromMGRS() + reject() + } + } + + Item { width: 1; height: ScreenTools.defaultFontPixelHeight; Layout.columnSpan: 2} + + QGCButton { + text: qsTr("Set From Vehicle Position") + visible: QGroundControl.multiVehicleManager.activeVehicle && QGroundControl.multiVehicleManager.activeVehicle.coordinate.isValid + Layout.alignment: Qt.AlignRight + Layout.columnSpan: 2 + onClicked: { + controller.setFromVehicle() + reject() + } } } - - Item { width: 1; height: ScreenTools.defaultFontPixelHeight; Layout.columnSpan: 2} - - QGCLabel { - text: qsTr("Zone") - } - FactTextField { - fact: controller.zone - Layout.fillWidth: true - } - - QGCLabel { - text: qsTr("Hemisphere") - } - FactComboBox { - fact: controller.hemisphere - indexModel: false - Layout.fillWidth: true - } - - QGCLabel { - text: qsTr("Easting") - } - FactTextField { - fact: controller.easting - Layout.fillWidth: true - } - - QGCLabel { - text: qsTr("Northing") - } - FactTextField { - fact: controller.northing - Layout.fillWidth: true - } - - QGCButton { - text: qsTr("Set UTM") - Layout.alignment: Qt.AlignRight - Layout.columnSpan: 2 - onClicked: { - controller.setFromUTM() - root.close() - } - } - - Item { width: 1; height: ScreenTools.defaultFontPixelHeight; Layout.columnSpan: 2} - - QGCLabel { - text: qsTr("MGRS") - } - FactTextField { - fact: controller.mgrs - Layout.fillWidth: true - } - - QGCButton { - text: qsTr("Set MGRS") - Layout.alignment: Qt.AlignRight - Layout.columnSpan: 2 - onClicked: { - controller.setFromMGRS() - root.close() - } - } - - Item { width: 1; height: ScreenTools.defaultFontPixelHeight; Layout.columnSpan: 2} - - QGCButton { - text: qsTr("Set From Vehicle Position") - visible: QGroundControl.multiVehicleManager.activeVehicle && QGroundControl.multiVehicleManager.activeVehicle.coordinate.isValid - Layout.alignment: Qt.AlignRight - Layout.columnSpan: 2 - onClicked: { - controller.setFromVehicle() - root.close() - } - } - } - } -} + } // Column + } // QGCFlickable +} // QGCViewDialog diff --git a/src/QmlControls/HorizontalFactValueGrid.qml b/src/QmlControls/HorizontalFactValueGrid.qml index 93b825c..310b71b 100644 --- a/src/QmlControls/HorizontalFactValueGrid.qml +++ b/src/QmlControls/HorizontalFactValueGrid.qml @@ -20,6 +20,10 @@ import QGroundControl.Palette 1.0 import QGroundControl.FlightMap 1.0 import QGroundControl 1.0 +// Note: This control will spit out qWarnings like this: "QGridLayoutEngine::addItem: Cell (0, 1) already taken" +// This is due to Qt bug https://bugreports.qt.io/browse/QTBUG-65121 +// If this becomes a problem I'll implement our own grid layout control + T.HorizontalFactValueGrid { id: _root Layout.preferredWidth: topLayout.width @@ -76,7 +80,7 @@ T.HorizontalFactValueGrid { function recalcWidth() { var newMaxWidth = 0 for (var i=0; iname().contains(re) && - !fact->shortDescription().contains(re) && - !fact->longDescription().contains(re)) { - matched = false; - } - } else { - if (!fact->name().contains(searchItem, Qt::CaseInsensitive) && - !fact->shortDescription().contains(searchItem, Qt::CaseInsensitive) && - !fact->longDescription().contains(searchItem, Qt::CaseInsensitive)) { - matched = false; - } + if (!fact->name().contains(searchItem, Qt::CaseInsensitive) && + !fact->shortDescription().contains(searchItem, Qt::CaseInsensitive) && + !fact->longDescription().contains(searchItem, Qt::CaseInsensitive)) { + matched = false; } } } diff --git a/src/QmlControls/ParameterEditorDialog.qml b/src/QmlControls/ParameterEditorDialog.qml index f0bdf70..137eebe 100644 --- a/src/QmlControls/ParameterEditorDialog.qml +++ b/src/QmlControls/ParameterEditorDialog.qml @@ -8,8 +8,8 @@ ****************************************************************************/ import QtQuick 2.3 -import QtQuick.Controls 2.15 -import QtQuick.Layouts 1.15 +import QtQuick.Controls 1.2 +import QtQuick.Layouts 1.2 import QtQuick.Dialogs 1.3 import QGroundControl 1.0 @@ -20,10 +20,9 @@ import QGroundControl.FactSystem 1.0 import QGroundControl.FactControls 1.0 import QGroundControl.ScreenTools 1.0 -QGCPopupDialog { - id: root - title: qsTr("Parameter Editor") - buttons: StandardButton.Cancel | StandardButton.Save +QGCViewDialog { + id: root + focus: true property Fact fact property bool showRCToParam: false @@ -38,39 +37,40 @@ QGCPopupDialog { property bool _editingParameter: fact.componentId != 0 property bool _allowForceSave: QGroundControl.corePlugin.showAdvancedUI || !_editingParameter property bool _allowDefaultReset: fact.defaultValueAvailable && (QGroundControl.corePlugin.showAdvancedUI || !_editingParameter) - property bool _showCombo: fact.enumStrings.length !== 0 && fact.bitmaskStrings.length === 0 && !validate ParameterEditorController { id: controller; } QGCPalette { id: qgcPal; colorGroupEnabled: true } - onAccepted: { + function accept() { if (bitmaskColumn.visible && !manualEntry.checked) { fact.value = bitmaskValue(); fact.valueChanged(fact.value) valueChanged() + hideDialog(); } else if (factCombo.visible && !manualEntry.checked) { fact.enumIndex = factCombo.currentIndex valueChanged() + hideDialog() } else { var errorString = fact.validate(valueField.text, forceSave.checked) if (errorString === "") { fact.value = valueField.text fact.valueChanged(fact.value) valueChanged() + hideDialog() } else { validationError.text = errorString if (_allowForceSave) { forceSave.visible = true } - preventClose = true } } } function reject() { fact.valueChanged(fact.value) - close() + hideDialog(); } function bitmaskValue() { @@ -93,41 +93,63 @@ QGCPopupDialog { } } - ColumnLayout { - width: editRow.width - spacing: globals.defaultTextHeight + QGCFlickable { + id: flickable + anchors.fill: parent + contentHeight: _column.y + _column.height + flickableDirection: Flickable.VerticalFlick - QGCLabel { - id: validationError - Layout.fillWidth: true - wrapMode: Text.WordWrap - color: qgcPal.warningText - visible: text !== "" - } + Column { + id: _column + spacing: globals.defaultTextHeight + anchors.left: parent.left + anchors.right: parent.right - RowLayout { - id: editRow - spacing: ScreenTools.defaultFontPixelWidth + QGCLabel { + id: validationError + width: parent.width + wrapMode: Text.WordWrap + color: qgcPal.warningText + } - QGCTextField { - id: valueField - width: _editFieldWidth - text: validate ? validateValue : fact.valueString - unitsLabel: fact.units - showUnits: fact.units != "" - focus: setFocus && visible - inputMethodHints: (fact.typeIsString || ScreenTools.isiOS) ? // iOS numeric keyboard has no done button, we can't use it - Qt.ImhNone : - Qt.ImhFormattedNumbersOnly // Forces use of virtual numeric keyboard - visible: !_showCombo || validate || manualEntry.checked + RowLayout { + spacing: ScreenTools.defaultFontPixelWidth + anchors.left: parent.left + anchors.right: parent.right + + QGCTextField { + id: valueField + text: validate ? validateValue : fact.valueString + visible: fact.enumStrings.length === 0 || validate || manualEntry.checked + unitsLabel: fact.units + showUnits: fact.units != "" + Layout.fillWidth: true + focus: setFocus + inputMethodHints: (fact.typeIsString || ScreenTools.isiOS) ? + Qt.ImhNone : // iOS numeric keyboard has no done button, we can't use it + Qt.ImhFormattedNumbersOnly // Forces use of virtual numeric keyboard + } + + QGCButton { + visible: _allowDefaultReset + text: qsTr("Reset to default") + + onClicked: { + fact.value = fact.defaultValue + fact.valueChanged(fact.value) + hideDialog() + } + } } QGCComboBox { - id: factCombo - width: _editFieldWidth - model: fact.enumStrings - visible: _showCombo - focus: setFocus && visible + id: factCombo + anchors.left: parent.left + anchors.right: parent.right + visible: _showCombo + model: fact.enumStrings + + property bool _showCombo: fact.enumStrings.length !== 0 && fact.bitmaskStrings.length === 0 && !validate Component.onCompleted: { // We can't bind directly to fact.enumIndex since that would add an unknown value @@ -144,125 +166,134 @@ QGCPopupDialog { } } - QGCButton { - visible: _allowDefaultReset - text: qsTr("Reset To Default") + Column { + id: bitmaskColumn + spacing: ScreenTools.defaultFontPixelHeight / 2 + visible: fact.bitmaskStrings.length > 0 - onClicked: { - fact.value = fact.defaultValue - fact.valueChanged(fact.value) - close() - } - } - } + Repeater { + id: bitmaskRepeater + model: fact.bitmaskStrings - Column { - id: bitmaskColumn - spacing: ScreenTools.defaultFontPixelHeight / 2 - visible: fact.bitmaskStrings.length > 0 + delegate : QGCCheckBox { + text : modelData + checked : fact.value & fact.bitmaskValues[index] - Repeater { - id: bitmaskRepeater - model: fact.bitmaskStrings - - delegate : QGCCheckBox { - text : modelData - checked : fact.value & fact.bitmaskValues[index] - - onClicked: { - valueField.text = bitmaskValue() + onClicked: { + valueField.text = bitmaskValue() + } } } } - } - - QGCLabel { - Layout.fillWidth: true - wrapMode: Text.WordWrap - visible: !longDescriptionLabel.visible - text: fact.shortDescription - } - - QGCLabel { - id: longDescriptionLabel - Layout.fillWidth: true - wrapMode: Text.WordWrap - visible: fact.longDescription != "" - text: fact.longDescription - } - - Row { - spacing: ScreenTools.defaultFontPixelWidth QGCLabel { - id: minValueDisplay - text: qsTr("Min: ") + fact.minString - visible: !fact.minIsDefaultForType + width: parent.width + wrapMode: Text.WordWrap + visible: !longDescriptionLabel.visible + text: fact.shortDescription } QGCLabel { - text: qsTr("Max: ") + fact.maxString - visible: !fact.maxIsDefaultForType + id: longDescriptionLabel + width: parent.width + wrapMode: Text.WordWrap + visible: fact.longDescription != "" + text: fact.longDescription + } + + Row { + spacing: ScreenTools.defaultFontPixelWidth + + QGCLabel { + id: minValueDisplay + text: qsTr("Min: ") + fact.minString + visible: !fact.minIsDefaultForType + } + + QGCLabel { + text: qsTr("Max: ") + fact.maxString + visible: !fact.maxIsDefaultForType + } + + QGCLabel { + text: qsTr("Default: ") + fact.defaultValueString + visible: _allowDefaultReset + } } QGCLabel { - text: qsTr("Default: ") + fact.defaultValueString - visible: _allowDefaultReset + text: qsTr("Parameter name: ") + fact.name + visible: fact.componentId > 0 // > 0 means it's a parameter fact } - } - QGCLabel { - text: qsTr("Parameter name: ") + fact.name - visible: fact.componentId > 0 // > 0 means it's a parameter fact - } - - QGCLabel { - visible: fact.vehicleRebootRequired - text: qsTr("Vehicle reboot required after change") - } - - QGCLabel { - visible: fact.qgcRebootRequired - text: qsTr("Application restart required after change") - } - - QGCLabel { - Layout.fillWidth: true - wrapMode: Text.WordWrap - text: qsTr("Warning: Modifying values while vehicle is in flight can lead to vehicle instability and possible vehicle loss. ") + - qsTr("Make sure you know what you are doing and double-check your values before Save!") - visible: fact.componentId != -1 - } - - QGCCheckBox { - id: forceSave - visible: false - text: qsTr("Force save (dangerous!)") - } - - QGCCheckBox { - id: _advanced - text: qsTr("Advanced settings") - visible: showRCToParam || factCombo.visible || bitmaskColumn.visible - } - - // Checkbox to allow manual entry of enumerated or bitmask parameters - QGCCheckBox { - id: manualEntry - visible: _advanced.checked && (factCombo.visible || bitmaskColumn.visible) - text: qsTr("Manual Entry") - - onClicked: { - valueField.text = fact.valueString + QGCLabel { + visible: fact.vehicleRebootRequired + text: qsTr("Vehicle reboot required after change") } - } - QGCButton { - text: qsTr("Set RC to Param") - visible: _advanced.checked && !validate && showRCToParam - onClicked: rcToParamDialog.createObject(mainWindow).open() - } - } // Column + QGCLabel { + visible: fact.qgcRebootRequired + text: qsTr("Application restart required after change") + } + + QGCLabel { + width: parent.width + wrapMode: Text.WordWrap + text: qsTr("Warning: Modifying values while vehicle is in flight can lead to vehicle instability and possible vehicle loss. ") + + qsTr("Make sure you know what you are doing and double-check your values before Save!") + visible: fact.componentId != -1 + } + + QGCCheckBox { + id: forceSave + visible: false + text: qsTr("Force save (dangerous!)") + } + + Row { + width: parent.width + spacing: ScreenTools.defaultFontPixelWidth / 2 + visible: showRCToParam || factCombo.visible || bitmaskColumn.visible + + Rectangle { + height: 1 + width: ScreenTools.defaultFontPixelWidth * 5 + color: qgcPal.text + anchors.verticalCenter: _advanced.verticalCenter + } + + QGCCheckBox { + id: _advanced + text: qsTr("Advanced settings") + } + + Rectangle { + height: 1 + width: ScreenTools.defaultFontPixelWidth * 5 + color: qgcPal.text + anchors.verticalCenter: _advanced.verticalCenter + } + } + + // Checkbox to allow manual entry of enumerated or bitmask parameters + QGCCheckBox { + id: manualEntry + visible: _advanced.checked && (factCombo.visible || bitmaskColumn.visible) + text: qsTr("Manual Entry") + + onClicked: { + valueField.text = fact.valueString + } + } + + QGCButton { + text: qsTr("Set RC to Param") + width: _editFieldWidth + visible: _advanced.checked && !validate && showRCToParam + onClicked: mainWindow.showPopupDialogFromComponent(rcToParamDialog) + } + } // Column + } Component { id: rcToParamDialog @@ -271,4 +302,4 @@ QGCPopupDialog { tuningFact: fact } } -} +} // QGCViewDialog diff --git a/src/QmlControls/QGCColumnButton.qml b/src/QmlControls/QGCColumnButton.qml deleted file mode 100644 index 02721fb..0000000 --- a/src/QmlControls/QGCColumnButton.qml +++ /dev/null @@ -1,63 +0,0 @@ -import QtQuick 2.5 -import QtQuick.Controls 2.12 -import QtQuick.Controls.Styles 1.4 -import QtQuick.Layouts 1.2 - -import QGroundControl.Palette 1.0 -import QGroundControl.ScreenTools 1.0 - -QGCButton { - id: control //This is a button rework from DonLakeFlyer's QGCButton that allows to contain a text and an Icon with a column look and the same capabilites - - background: Rectangle { - id: backRect - width: control.width - height: control.height - radius: backRadius - border.width: showBorder ? 1 : 0 - border.color: qgcPal.buttonText - color: _showHighlight ? - qgcPal.buttonHighlight : - (primary ? qgcPal.primaryButton : qgcPal.button) - } - - contentItem: Item { - id: contItem - implicitWidth: Math.max(textLabel.implicitWidth , icon.implicitWidth ) * 1.1 - implicitHeight: iconSource === "" ? textLabel.implicitHeight : textLabel.implicitHeight * 2.5 - ColumnLayout { - anchors.fill: parent - QGCColoredImage { - id: icon - Layout.fillWidth: true - Layout.fillHeight: true - Layout.maximumHeight: parent.height - textLabelContainer.height - Layout.alignment: control.text !== "" ? Qt.AlignTop : Qt.AlignHCenter | Qt.AlignVCenter - source: control.iconSource - color: qgcPal.text - fillMode: Image.PreserveAspectFit - sourceSize.height: height - sourceSize.width: width - visible: control.iconSource !== "" ? true : false - } - - Item { - id: textLabelContainer - Layout.alignment: icon.visible ? Qt.AlignBottom | Qt.AlignHCenter : Qt.AlignCenter - visible: control.text !== "" ? true : false - Layout.preferredWidth: parent.width - Layout.preferredHeight: textLabel.baselineOffset - QGCLabel { - id: textLabel - text: control.text - font.family: ScreenTools.normalFontFamily - font.pointSize: control.pointSize - color: _showHighlight ? qgcPal.buttonHighlightText : (primary ? qgcPal.primaryButtonText : qgcPal.buttonText) - anchors.baseline: iconSource !== "" ? parent.bottom : undefined - anchors.centerIn: iconSource === "" ? parent : undefined - anchors.horizontalCenter: parent.horizontalCenter - } - } - } - } -} diff --git a/src/QmlControls/QGCComboBox.qml b/src/QmlControls/QGCComboBox.qml index b51b3f9..f02d8cd 100644 --- a/src/QmlControls/QGCComboBox.qml +++ b/src/QmlControls/QGCComboBox.qml @@ -27,7 +27,6 @@ T.ComboBox { contentItem.implicitWidth + leftPadding + rightPadding + padding) implicitHeight: Math.max(background ? background.implicitHeight : 0, Math.max(contentItem.implicitHeight, indicator ? indicator.implicitHeight : 0) + topPadding + bottomPadding) - baselineOffset: contentItem.y + text.baselineOffset leftPadding: padding + (!control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width + spacing) rightPadding: padding + (control.mirrored || !indicator || !indicator.visible ? 0 : indicator.width) diff --git a/src/QmlControls/QGCFileDialog.qml b/src/QmlControls/QGCFileDialog.qml index a4c185e..98ccc7b 100644 --- a/src/QmlControls/QGCFileDialog.qml +++ b/src/QmlControls/QGCFileDialog.qml @@ -27,7 +27,7 @@ Item { function openForLoad() { _openForLoad = true if (_mobileDlg && folder.length !== 0) { - mobileFileOpenDialogComponent.createObject(mainWindow).open() + mainWindow.showComponentDialog(mobileFileOpenDialog, title, mainWindow.showDialogDefaultWidth, StandardButton.Cancel) } else { fullFileDialog.open() } @@ -36,7 +36,7 @@ Item { function openForSave() { _openForLoad = false if (_mobileDlg && folder.length !== 0) { - mobileFileSaveDialogComponent.createObject(mainWindow).open() + mainWindow.showComponentDialog(mobileFileSaveDialog, title, mainWindow.showDialogDefaultWidth, StandardButton.Cancel | StandardButton.Ok) } else { fullFileDialog.open() } @@ -107,158 +107,168 @@ Item { } Component { - id: mobileFileOpenDialogComponent + id: mobileFileOpenDialog - QGCPopupDialog { - id: mobileFileOpenDialog - title: _root.title - buttons: StandardButton.Cancel + QGCViewDialog { + QGCFlickable { + anchors.fill: parent + contentHeight: fileOpenColumn.height - Column { - id: fileOpenColumn - width: 40 * ScreenTools.defaultFontPixelWidth - spacing: ScreenTools.defaultFontPixelHeight / 2 + Column { + id: fileOpenColumn + anchors.left: parent.left + anchors.right: parent.right + spacing: ScreenTools.defaultFontPixelHeight / 2 - QGCLabel { text: qsTr("Path: %1").arg(_mobileShortPath) } + QGCLabel { text: qsTr("Path: %1").arg(_mobileShortPath) } - Repeater { - id: fileRepeater - model: controller.getFiles(folder, _rgExtensions) + Repeater { + id: fileRepeater + model: controller.getFiles(folder, _rgExtensions) - FileButton { - id: fileButton - anchors.left: parent.left - anchors.right: parent.right - text: modelData + FileButton { + id: fileButton + anchors.left: parent.left + anchors.right: parent.right + text: modelData - onClicked: { - mobileFileOpenDialog.close() - _root.acceptedForLoad(controller.fullyQualifiedFilename(folder, modelData)) - } + onClicked: { + hideDialog() + _root.acceptedForLoad(controller.fullyQualifiedFilename(folder, modelData)) + } - onHamburgerClicked: { - highlight = true - hamburgerMenu.fileToDelete = controller.fullyQualifiedFilename(folder, modelData) - hamburgerMenu.popup() - } + onHamburgerClicked: { + highlight = true + hamburgerMenu.fileToDelete = controller.fullyQualifiedFilename(folder, modelData) + hamburgerMenu.popup() + } - QGCMenu { - id: hamburgerMenu + QGCMenu { + id: hamburgerMenu - property string fileToDelete + property string fileToDelete - onAboutToHide: fileButton.highlight = false + onAboutToHide: fileButton.highlight = false - QGCMenuItem { - text: qsTr("Delete") - onTriggered: { - controller.deleteFile(hamburgerMenu.fileToDelete) - fileRepeater.model = controller.getFiles(folder, _rgExtensions) + QGCMenuItem { + text: qsTr("Delete") + onTriggered: { + controller.deleteFile(hamburgerMenu.fileToDelete) + fileRepeater.model = controller.getFiles(folder, _rgExtensions) + } } } } } - } - QGCLabel { - text: qsTr("No files") - visible: fileRepeater.model.length === 0 + QGCLabel { + text: qsTr("No files") + visible: fileRepeater.model.length === 0 + } } } } } Component { - id: mobileFileSaveDialogComponent + id: mobileFileSaveDialog - QGCPopupDialog { - id: mobileFileSaveDialog - title: _root.title - buttons: StandardButton.Cancel | StandardButton.Ok - - onAccepted: { + QGCViewDialog { + function accept() { if (filenameTextField.text == "") { - mobileFileSaveDialog.preventClose = true return } if (!replaceMessage.visible) { if (controller.fileExists(controller.fullyQualifiedFilename(folder, filenameTextField.text, _rgExtensions))) { replaceMessage.visible = true - mobileFileSaveDialog.preventClose = true return } } _root.acceptedForSave(controller.fullyQualifiedFilename(folder, filenameTextField.text, _rgExtensions)) + hideDialog() } - Column { - id: fileSaveColumn - width: 40 * ScreenTools.defaultFontPixelWidth - spacing: ScreenTools.defaultFontPixelHeight / 2 + QGCFlickable { + anchors.fill: parent + contentHeight: fileSaveColumn.height - RowLayout { + Column { + id: fileSaveColumn anchors.left: parent.left anchors.right: parent.right - spacing: ScreenTools.defaultFontPixelWidth + spacing: ScreenTools.defaultFontPixelHeight / 2 - QGCLabel { text: qsTr("New file name:") } - - QGCTextField { - id: filenameTextField - Layout.fillWidth: true - onTextChanged: replaceMessage.visible = false - } - } - - QGCLabel { - id: replaceMessage - anchors.left: parent.left - anchors.right: parent.right - wrapMode: Text.WordWrap - text: qsTr("The file %1 exists. Click Save again to replace it.").arg(filenameTextField.text) - visible: false - color: qgcPal.warningText - } - - SectionHeader { - anchors.left: parent.left - anchors.right: parent.right - text: qsTr("Save to existing file:") - } - - Repeater { - id: fileRepeater - model: controller.getFiles(folder, [ _rgExtensions ]) - - FileButton { - id: fileButton + RowLayout { anchors.left: parent.left anchors.right: parent.right - text: modelData + spacing: ScreenTools.defaultFontPixelWidth - onClicked: { - mobileFileSaveDialog.close() - _root.acceptedForSave(controller.fullyQualifiedFilename(folder, modelData)) + QGCLabel { text: qsTr("New file name:") } + + QGCTextField { + id: filenameTextField + Layout.fillWidth: true + onTextChanged: replaceMessage.visible = false } + } - onHamburgerClicked: { - highlight = true - hamburgerMenu.fileToDelete = controller.fullyQualifiedFilename(folder, modelData) - hamburgerMenu.popup() - } + QGCLabel { + anchors.left: parent.left + anchors.right: parent.right + wrapMode: Text.WordWrap + text: qsTr("File names must end with .%1 file extension. If missing it will be added.").arg(fileExtension) + } - QGCMenu { - id: hamburgerMenu + QGCLabel { + id: replaceMessage + anchors.left: parent.left + anchors.right: parent.right + wrapMode: Text.WordWrap + text: qsTr("The file %1 exists. Click Save again to replace it.").arg(filenameTextField.text) + visible: false + color: qgcPal.warningText + } - property string fileToDelete + SectionHeader { + anchors.left: parent.left + anchors.right: parent.right + text: qsTr("Save to existing file:") + } - onAboutToHide: fileButton.highlight = false + Repeater { + id: fileRepeater + model: controller.getFiles(folder, [ fileExtension ]) - QGCMenuItem { - text: qsTr("Delete") - onTriggered: { - controller.deleteFile(hamburgerMenu.fileToDelete) - fileRepeater.model = controller.getFiles(folder, [ _rgExtensions ]) + FileButton { + id: fileButton + anchors.left: parent.left + anchors.right: parent.right + text: modelData + + onClicked: { + hideDialog() + _root.acceptedForSave(controller.fullyQualifiedFilename(folder, modelData)) + } + + onHamburgerClicked: { + highlight = true + hamburgerMenu.fileToDelete = controller.fullyQualifiedFilename(folder, modelData) + hamburgerMenu.popup() + } + + QGCMenu { + id: hamburgerMenu + + property string fileToDelete + + onAboutToHide: fileButton.highlight = false + + QGCMenuItem { + text: qsTr("Delete") + onTriggered: { + controller.deleteFile(hamburgerMenu.fileToDelete) + fileRepeater.model = controller.getFiles(folder, [ fileExtension ]) + } } } } diff --git a/src/QmlControls/QGCFlickable.qml b/src/QmlControls/QGCFlickable.qml index 8bf130e..3fbb869 100644 --- a/src/QmlControls/QGCFlickable.qml +++ b/src/QmlControls/QGCFlickable.qml @@ -1,14 +1,12 @@ import QtQuick 2.3 -import QGroundControl.Palette 1.0 -import QGroundControl.ScreenTools 1.0 +import QGroundControl.Palette 1.0 /// QGC version of Flickable control that shows horizontal/vertial scroll indicators Flickable { - id: root - boundsBehavior: Flickable.StopAtBounds - clip: true - maximumFlickVelocity: (ScreenTools.realPixelDensity * 25.4) * 8 // About two inches per second + id: root + boundsBehavior: Flickable.StopAtBounds + clip: true property color indicatorColor: qgcPal.text diff --git a/src/QmlControls/QGCMouseArea.qml b/src/QmlControls/QGCMouseArea.qml index 9218c5d..e1a9f2c 100644 --- a/src/QmlControls/QGCMouseArea.qml +++ b/src/QmlControls/QGCMouseArea.qml @@ -26,7 +26,7 @@ MouseArea { Rectangle { anchors.fill: parent border.color: "red" - border.width: QGroundControl.corePlugin.showTouchAreas ? 3 : 0 + border.width: QGroundControl.corePlugin.showTouchAreas ? 1 : 0 color: "transparent" } } diff --git a/src/QmlControls/QGCPipOverlay.qml b/src/QmlControls/QGCPipOverlay.qml index c8eaaa5..7308822 100644 --- a/src/QmlControls/QGCPipOverlay.qml +++ b/src/QmlControls/QGCPipOverlay.qml @@ -70,7 +70,6 @@ Item { item1.pipState.state = item1.pipState.fullState _fullItem = item1 _pipOrWindowItem = null - item1.visible = true } _setPipIsExpanded(QGroundControl.loadBoolGlobalSetting(_pipExpandedSettingsKey, true)) } diff --git a/src/QmlControls/QGCPopupDialog.qml b/src/QmlControls/QGCPopupDialog.qml index 51235f5..71c60ba 100644 --- a/src/QmlControls/QGCPopupDialog.qml +++ b/src/QmlControls/QGCPopupDialog.qml @@ -7,286 +7,43 @@ * ****************************************************************************/ -import QtQuick 2.12 -import QtQuick.Controls 2.4 -import QtQuick.Layouts 1.12 -import QtQuick.Dialogs 1.3 - -import QGroundControl 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.Palette 1.0 -import QGroundControl.ScreenTools 1.0 - -// Provides the standard dialog mechanism for QGC. Works 99% like Qml Dialog. -// -// Example usage: -// Component { -// id: dialogComponent -// -// QGCPopupDialog { -// ... -// } -// } -// -// onFoo: dialogComponent.createObject(mainWindow).open() -// -// Notes: -// * QGCPopupDialog should be created from a component to limit the memory usage of the dialog -// to only when it is displayed. -// * Parent for createObject should always be mainWindow. -// Differences from standard Qml Dialog: -// * The QGCPopupDialog object will automatically be destroyed when it closed. You can override this -// behaviour by setting destroyOnClose to false if it was not created dynamically. -// * Dialog will automatically close after accepted/rejected signal processing. You can prevent this by setting -// preventClose = true prior to returning from your signal handlers. -Popup { - id: _root - parent: Overlay.overlay - anchors.centerIn: parent - width: mainColumnLayout.width + (padding * 2) - height: mainColumnLayout.y + mainColumnLayout.height + padding - padding: 2 - modal: true - focus: true +import QtQuick 2.12 +import QtQuick.Dialogs 1.3 +Item { property string title - property var buttons: StandardButton.Ok - property bool acceptAllowed: acceptButton.visible - property bool rejectAllowed: rejectButton.visible - property alias acceptButtonEnabled: acceptButton.enabled - property alias rejectButtonEnabled: rejectButton.enabled - property var dialogProperties - property bool destroyOnClose: true - property bool preventClose: false + property var buttons: StandardButton.Ok - signal accepted - signal rejected + width: childrenRect.width + height: childrenRect.height - property var _pal: QGroundControl.globalPalette - property real _frameSize: ScreenTools.defaultFontPixelWidth - property real _contentMargin: ScreenTools.defaultFontPixelHeight / 2 - property real _popupDoubleInset: ScreenTools.defaultFontPixelHeight * 2 - property real _maxContentWidth: parent.width - _popupDoubleInset - property real _maxContentHeight: parent.height - titleRowLayout.height - _popupDoubleInset + signal hideDialog + signal enableAcceptButton + signal disableAcceptButton + signal enableRejectButton + signal disableRejectButton - background: Item { - Rectangle { - anchors.left: parent.left - anchors.top: parent.top - width: _frameSize - height: _frameSize - color: _pal.text - visible: enabled - } - - Rectangle { - anchors.right: parent.right - anchors.top: parent.top - width: _frameSize - height: _frameSize - color: _pal.text - visible: enabled - } - - Rectangle { - anchors.left: parent.left - anchors.bottom: parent.bottom - width: _frameSize - height: _frameSize - color: _pal.text - visible: enabled - } - - Rectangle { - anchors.right: parent.right - anchors.bottom: parent.bottom - width: _frameSize - height: _frameSize - color: _pal.text - visible: enabled - } - - Rectangle { - anchors.margins: _root.padding - anchors.fill: parent - color: _pal.window + Keys.onReleased: { + if (event.key === Qt.Key_Escape) { + reject() + event.accepted = true + } else if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) { + accept() + event.accepted = true } } - Component.onCompleted: { - // The last child item will be the true dialog content. - // Re-Parent it to the right place in the ui hierarchy. - contentChildren[contentChildren.length - 1].parent = dialogContentParent - } - - onAboutToShow: setupDialogButtons(buttons) - onClosed: { - Qt.inputMethod.hide() - if (destroyOnClose) { - _root.destroy() - } - } - - function _accept() { + function accept() { if (acceptAllowed) { - accepted() - if (preventClose) { - preventClose = false - } else { - close() - } + Qt.inputMethod.hide() + hideDialog() } } - function _reject() { + function reject() { if (rejectAllowed) { - rejected() - if (preventClose) { - preventClose = false - } else { - close() - } - } - } - - QGCPalette { id: qgcPal; colorGroupEnabled: parent.enabled } - - function setupDialogButtons(buttons) { - acceptButton.visible = false - rejectButton.visible = false - // Accept role buttons - if (buttons & StandardButton.Ok) { - acceptButton.text = qsTr("Ok") - acceptButton.visible = true - } else if (buttons & StandardButton.Open) { - acceptButton.text = qsTr("Open") - acceptButton.visible = true - } else if (buttons & StandardButton.Save) { - acceptButton.text = qsTr("Save") - acceptButton.visible = true - } else if (buttons & StandardButton.Apply) { - acceptButton.text = qsTr("Apply") - acceptButton.visible = true - } else if (buttons & StandardButton.Open) { - acceptButton.text = qsTr("Open") - acceptButton.visible = true - } else if (buttons & StandardButton.SaveAll) { - acceptButton.text = qsTr("Save All") - acceptButton.visible = true - } else if (buttons & StandardButton.Yes) { - acceptButton.text = qsTr("Yes") - acceptButton.visible = true - } else if (buttons & StandardButton.YesToAll) { - acceptButton.text = qsTr("Yes to All") - acceptButton.visible = true - } else if (buttons & StandardButton.Retry) { - acceptButton.text = qsTr("Retry") - acceptButton.visible = true - } else if (buttons & StandardButton.Reset) { - acceptButton.text = qsTr("Reset") - acceptButton.visible = true - } else if (buttons & StandardButton.RestoreToDefaults) { - acceptButton.text = qsTr("Restore to Defaults") - acceptButton.visible = true - } else if (buttons & StandardButton.Ignore) { - acceptButton.text = qsTr("Ignore") - acceptButton.visible = true - } - - // Reject role buttons - if (buttons & StandardButton.Cancel) { - rejectButton.text = qsTr("Cancel") - rejectButton.visible = true - } else if (buttons & StandardButton.Close) { - rejectButton.text = qsTr("Close") - rejectButton.visible = true - } else if (buttons & StandardButton.No) { - rejectButton.text = qsTr("No") - rejectButton.visible = true - } else if (buttons & StandardButton.NoToAll) { - rejectButton.text = qsTr("No to All") - rejectButton.visible = true - } else if (buttons & StandardButton.Abort) { - rejectButton.text = qsTr("Abort") - rejectButton.visible = true - } - - if (rejectButton.visible) { - closePolicy = Popup.NoAutoClose | Popup.CloseOnEscape - } else { - closePolicy = Popup.NoAutoClose - } - } - - function disableAcceptButton() { - acceptButton.enabled = false - } - - Rectangle { - width: titleRowLayout.width - height: titleRowLayout.height - color: qgcPal.windowShade - } - - ColumnLayout { - id: mainColumnLayout - spacing: _contentMargin - - RowLayout { - id: titleRowLayout - Layout.fillWidth: true - - QGCLabel { - Layout.leftMargin: ScreenTools.defaultFontPixelWidth - Layout.fillWidth: true - text: _root.title - font.pointSize: ScreenTools.mediumFontPointSize - verticalAlignment: Text.AlignVCenter - } - - QGCButton { - id: rejectButton - onClicked: _reject() - } - - QGCButton { - id: acceptButton - primary: true - onClicked: _accept() - } - } - - QGCFlickable { - id: mainFlickable - Layout.preferredWidth: Math.min(Math.max(marginItem.width, mainColumnLayout.width), _maxContentWidth) - Layout.preferredHeight: Math.min(marginItem.height, _maxContentHeight) - contentWidth: marginItem.width - contentHeight: marginItem.height - - Item { - id: marginItem - width: dialogContentParent.width + (_contentMargin * 2) - height: dialogContentParent.height + _contentMargin - - Item { - id: dialogContentParent - x: _contentMargin - width: childrenRect.width - height: childrenRect.height - focus: true - - Keys.onReleased: { - if (event.key === Qt.Key_Escape) { - _reject() - event.accepted = true - } else if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) { - _accept() - event.accepted = true - } - } - - } - } + Qt.inputMethod.hide() + hideDialog() } } } diff --git a/src/QmlControls/QGCPopupDialogContainer.qml b/src/QmlControls/QGCPopupDialogContainer.qml new file mode 100644 index 0000000..7e2281f --- /dev/null +++ b/src/QmlControls/QGCPopupDialogContainer.qml @@ -0,0 +1,232 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +import QtQuick 2.12 +import QtQuick.Controls 2.4 +import QtQuick.Layouts 1.12 +import QtQuick.Dialogs 1.3 + +import QGroundControl 1.0 +import QGroundControl.Controls 1.0 +import QGroundControl.Palette 1.0 +import QGroundControl.ScreenTools 1.0 + +Popup { + property var dialogComponent + property string dialogSource + property var dialogProperties + + id: _root + anchors.centerIn: parent + width: mainColumnLayout.width + (padding * 2) + height: mainColumnLayout.y + mainColumnLayout.height + padding + padding: 2 + modal: true + focus: true + + property var _pal: QGroundControl.globalPalette + property real _frameSize: ScreenTools.defaultFontPixelWidth + property string _dialogTitle + property real _contentMargin: ScreenTools.defaultFontPixelHeight / 2 + property real _popupDoubleInset: ScreenTools.defaultFontPixelHeight * 2 + property real _maxContentWidth: parent.width - _popupDoubleInset + property real _maxContentHeight: parent.height - titleRowLayout.height - _popupDoubleInset + + background: Item { + Rectangle { + anchors.left: parent.left + anchors.top: parent.top + width: _frameSize + height: _frameSize + color: _pal.text + visible: enabled + } + + Rectangle { + anchors.right: parent.right + anchors.top: parent.top + width: _frameSize + height: _frameSize + color: _pal.text + visible: enabled + } + + Rectangle { + anchors.left: parent.left + anchors.bottom: parent.bottom + width: _frameSize + height: _frameSize + color: _pal.text + visible: enabled + } + + Rectangle { + anchors.right: parent.right + anchors.bottom: parent.bottom + width: _frameSize + height: _frameSize + color: _pal.text + visible: enabled + } + + Rectangle { + anchors.margins: _root.padding + anchors.fill: parent + color: _pal.window + } + } + + Component.onCompleted: { + _dialogTitle = dialogComponentLoader.item.title + setupDialogButtons(dialogComponentLoader.item.buttons) + } + + QGCPalette { id: qgcPal; colorGroupEnabled: parent.enabled } + + function setupDialogButtons(buttons) { + acceptButton.visible = false + rejectButton.visible = false + // Accept role buttons + if (buttons & StandardButton.Ok) { + acceptButton.text = qsTr("Ok") + acceptButton.visible = true + } else if (buttons & StandardButton.Open) { + acceptButton.text = qsTr("Open") + acceptButton.visible = true + } else if (buttons & StandardButton.Save) { + acceptButton.text = qsTr("Save") + acceptButton.visible = true + } else if (buttons & StandardButton.Apply) { + acceptButton.text = qsTr("Apply") + acceptButton.visible = true + } else if (buttons & StandardButton.Open) { + acceptButton.text = qsTr("Open") + acceptButton.visible = true + } else if (buttons & StandardButton.SaveAll) { + acceptButton.text = qsTr("Save All") + acceptButton.visible = true + } else if (buttons & StandardButton.Yes) { + acceptButton.text = qsTr("Yes") + acceptButton.visible = true + } else if (buttons & StandardButton.YesToAll) { + acceptButton.text = qsTr("Yes to All") + acceptButton.visible = true + } else if (buttons & StandardButton.Retry) { + acceptButton.text = qsTr("Retry") + acceptButton.visible = true + } else if (buttons & StandardButton.Reset) { + acceptButton.text = qsTr("Reset") + acceptButton.visible = true + } else if (buttons & StandardButton.RestoreToDefaults) { + acceptButton.text = qsTr("Restore to Defaults") + acceptButton.visible = true + } else if (buttons & StandardButton.Ignore) { + acceptButton.text = qsTr("Ignore") + acceptButton.visible = true + } + + // Reject role buttons + if (buttons & StandardButton.Cancel) { + rejectButton.text = qsTr("Cancel") + rejectButton.visible = true + } else if (buttons & StandardButton.Close) { + rejectButton.text = qsTr("Close") + rejectButton.visible = true + } else if (buttons & StandardButton.No) { + rejectButton.text = qsTr("No") + rejectButton.visible = true + } else if (buttons & StandardButton.NoToAll) { + rejectButton.text = qsTr("No to All") + rejectButton.visible = true + } else if (buttons & StandardButton.Abort) { + rejectButton.text = qsTr("Abort") + rejectButton.visible = true + } + + if (rejectButton.visible) { + closePolicy = Popup.NoAutoClose | Popup.CloseOnEscape + } else { + closePolicy = Popup.NoAutoClose + } + } + + function disableAcceptButton() { + acceptButton.enabled = false + } + + Connections { + target: dialogComponentLoader.item + onHideDialog: close() + onEnableAcceptButton: acceptButton.enabled = true + onEnableRejectButton: rejectButton.enabled = true + onDisableAcceptButton: acceptButton.enabled = false + onDisableRejectButton: rejectButton.enabled = false + } + + Rectangle { + width: titleRowLayout.width + height: titleRowLayout.height + color: qgcPal.windowShade + } + + ColumnLayout { + id: mainColumnLayout + spacing: _contentMargin + + RowLayout { + id: titleRowLayout + Layout.fillWidth: true + + QGCLabel { + Layout.leftMargin: ScreenTools.defaultFontPixelWidth + Layout.fillWidth: true + text: _dialogTitle + font.pointSize: ScreenTools.mediumFontPointSize + verticalAlignment: Text.AlignVCenter + } + + QGCButton { + id: rejectButton + onClicked: dialogComponentLoader.item.reject() + } + + QGCButton { + id: acceptButton + primary: true + onClicked: dialogComponentLoader.item.accept() + } + } + + QGCFlickable { + id: mainFlickable + Layout.preferredWidth: Math.min(marginItem.width, _maxContentWidth) + Layout.preferredHeight: Math.min(marginItem.height, _maxContentHeight) + contentWidth: marginItem.width + contentHeight: marginItem.height + + Item { + id: marginItem + width: dialogComponentLoader.width + (_contentMargin * 2) + height: dialogComponentLoader.height + _contentMargin + + Loader { + id: dialogComponentLoader + x: _contentMargin + source: dialogSource + sourceComponent: dialogComponent + focus: true + + property var dialogProperties: _root.dialogProperties + property bool acceptAllowed: acceptButton.visible + property bool rejectAllowed: rejectButton.visible + } + } + } + } +} diff --git a/src/QmlControls/QGCSimpleMessageDialog.qml b/src/QmlControls/QGCSimpleMessageDialog.qml deleted file mode 100644 index 460dc32..0000000 --- a/src/QmlControls/QGCSimpleMessageDialog.qml +++ /dev/null @@ -1,33 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2020 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -import QtQuick 2.15 -import QtQuick.Layouts 1.15 - -import QGroundControl.Controls 1.0 -import QGroundControl.ScreenTools 1.0 - -QGCPopupDialog { - property alias text: label.text - property var acceptFunction: null // Mainly used by MainRootWindow.showMessage to specify accept function in call - - onAccepted: { - if (acceptFunction) { - acceptFunction() - } - } - - ColumnLayout { - QGCLabel { - id: label - Layout.maximumWidth: mainWindow.width / (ScreenTools.isMobile ? 2 : 3) - wrapMode: Text.WordWrap - } - } -} diff --git a/src/QmlControls/QGCTextField.qml b/src/QmlControls/QGCTextField.qml index 89934a1..317ffd8 100644 --- a/src/QmlControls/QGCTextField.qml +++ b/src/QmlControls/QGCTextField.qml @@ -12,15 +12,11 @@ TextField { implicitHeight: ScreenTools.implicitTextFieldHeight activeFocusOnPress: true antialiasing: true - inputMethodHints: numericValuesOnly && !ScreenTools.isiOS ? - Qt.ImhFormattedNumbersOnly: // Forces use of virtual numeric keyboard instead of full keyboard - Qt.ImhNone // iOS numeric keyboard has no done button, we can't use it. property bool showUnits: false property bool showHelp: false property string unitsLabel: "" property string extraUnitsLabel: "" - property bool numericValuesOnly: false // true: Used as hint for mobile devices to show numeric only keyboard signal helpClicked diff --git a/src/QmlControls/QGCToolBarButton.qml b/src/QmlControls/QGCToolBarButton.qml index c7903be..16380a9 100644 --- a/src/QmlControls/QGCToolBarButton.qml +++ b/src/QmlControls/QGCToolBarButton.qml @@ -10,7 +10,6 @@ import QtQuick 2.3 import QtQuick.Controls 2.4 -import QGroundControl 1.0 import QGroundControl.Controls 1.0 import QGroundControl.Palette 1.0 import QGroundControl.ScreenTools 1.0 @@ -32,10 +31,8 @@ Button { onCheckedChanged: checkable = false background: Rectangle { - anchors.fill: parent - color: button.checked ? qgcPal.buttonHighlight : Qt.rgba(0,0,0,0) - border.color: "red" - border.width: QGroundControl.corePlugin.showTouchAreas ? 3 : 0 + anchors.fill: parent + color: button.checked ? qgcPal.buttonHighlight : Qt.rgba(0,0,0,0) } contentItem: Row { diff --git a/src/QmlControls/QGCViewDialog.qml b/src/QmlControls/QGCViewDialog.qml new file mode 100644 index 0000000..b2878aa --- /dev/null +++ b/src/QmlControls/QGCViewDialog.qml @@ -0,0 +1,46 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +import QtQuick 2.3 +import QtQuick.Controls 1.2 +import QtQuick.Dialogs 1.3 + +import QGroundControl.Controls 1.0 +import QGroundControl.Palette 1.0 +import QGroundControl.FactSystem 1.0 +import QGroundControl.FactControls 1.0 +import QGroundControl.ScreenTools 1.0 + +Item { + property var buttons: StandardButton.NoButton + + signal hideDialog + + Keys.onReleased: { + if (event.key === Qt.Key_Escape) { + reject() + event.accepted = true + } else if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) { + accept() + event.accepted = true + } + } + + function accept() { + if (acceptAllowed) { + hideDialog() + } + } + + function reject() { + if (rejectAllowed) { + hideDialog() + } + } +} diff --git a/src/QmlControls/QGCViewDialogContainer.qml b/src/QmlControls/QGCViewDialogContainer.qml new file mode 100644 index 0000000..7b64d44 --- /dev/null +++ b/src/QmlControls/QGCViewDialogContainer.qml @@ -0,0 +1,177 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +import QtQuick 2.11 +import QtQuick.Controls 2.4 +import QtQuick.Dialogs 1.3 + +import QGroundControl.Controls 1.0 +import QGroundControl.Palette 1.0 +import QGroundControl.ScreenTools 1.0 + +Drawer { + edge: Qt.RightEdge + interactive: false + + property var dialogComponent + property string dialogTitle + property var dialogButtons: StandardButton.NoButton + + property real _defaultTextHeight: _textMeasure.contentHeight + property real _defaultTextWidth: _textMeasure.contentWidth + + function setupDialogButtons(buttons) { + _acceptButton.visible = false + _rejectButton.visible = false + // Accept role buttons + if (buttons & StandardButton.Ok) { + _acceptButton.text = qsTr("Ok") + _acceptButton.visible = true + } else if (buttons & StandardButton.Open) { + _acceptButton.text = qsTr("Open") + _acceptButton.visible = true + } else if (buttons & StandardButton.Save) { + _acceptButton.text = qsTr("Save") + _acceptButton.visible = true + } else if (buttons & StandardButton.Apply) { + _acceptButton.text = qsTr("Apply") + _acceptButton.visible = true + } else if (buttons & StandardButton.Open) { + _acceptButton.text = qsTr("Open") + _acceptButton.visible = true + } else if (buttons & StandardButton.SaveAll) { + _acceptButton.text = qsTr("Save All") + _acceptButton.visible = true + } else if (buttons & StandardButton.Yes) { + _acceptButton.text = qsTr("Yes") + _acceptButton.visible = true + } else if (buttons & StandardButton.YesToAll) { + _acceptButton.text = qsTr("Yes to All") + _acceptButton.visible = true + } else if (buttons & StandardButton.Retry) { + _acceptButton.text = qsTr("Retry") + _acceptButton.visible = true + } else if (buttons & StandardButton.Reset) { + _acceptButton.text = qsTr("Reset") + _acceptButton.visible = true + } else if (buttons & StandardButton.RestoreToDefaults) { + _acceptButton.text = qsTr("Restore to Defaults") + _acceptButton.visible = true + } else if (buttons & StandardButton.Ignore) { + _acceptButton.text = qsTr("Ignore") + _acceptButton.visible = true + } + + // Reject role buttons + if (buttons & StandardButton.Cancel) { + _rejectButton.text = qsTr("Cancel") + _rejectButton.visible = true + } else if (buttons & StandardButton.Close) { + _rejectButton.text = qsTr("Close") + _rejectButton.visible = true + } else if (buttons & StandardButton.No) { + _rejectButton.text = qsTr("No") + _rejectButton.visible = true + } else if (buttons & StandardButton.NoToAll) { + _rejectButton.text = qsTr("No to All") + _rejectButton.visible = true + } else if (buttons & StandardButton.Abort) { + _rejectButton.text = qsTr("Abort") + _rejectButton.visible = true + } + + if (buttons & StandardButton.Cancel || buttons & StandardButton.Close || buttons & StandardButton.Discard || buttons & StandardButton.Abort || buttons & StandardButton.Ignore) { + closePolicy = Popup.NoAutoClose; + interactive = false; + } else { + closePolicy = Popup.CloseOnEscape | Popup.CloseOnPressOutside; + interactive = true; + } + } + + Connections { + target: _dialogComponentLoader.item + onHideDialog: { + Qt.inputMethod.hide() + close() + } + } + + Connections { + target: toolDrawer + onVisibleChanged: { + if(toolDrawer.visible === true) { + // Do nothing + return + } + else { + // Close DialogContainer + Qt.inputMethod.hide() + close() + } + } + } + + Component.onCompleted: setupDialogButtons(dialogButtons) + + QGCLabel { id: _textMeasure; text: "X"; visible: false } + + background: Rectangle { + color: qgcPal.windowShadeDark + } + + // This is the main dialog panel + Item { + id: _dialogPanel + anchors.fill: parent + Rectangle { + id: _header + width: parent.width + height: _acceptButton.visible ? _acceptButton.height : _rejectButton.height + color: qgcPal.windowShade + QGCLabel { + x: _defaultTextWidth + text: dialogTitle + height: parent.height + verticalAlignment: Text.AlignVCenter + } + QGCButton { + id: _rejectButton + anchors.right: _acceptButton.visible ? _acceptButton.left : parent.right + anchors.bottom: parent.bottom + onClicked: _dialogComponentLoader.item.reject() + } + QGCButton { + id: _acceptButton + anchors.right: parent.right + anchors.bottom: parent.bottom + primary: true + onClicked: _dialogComponentLoader.item.accept() + } + } + Item { + id: _spacer + width: 10 + height: 10 + anchors.top: _header.bottom + } + Loader { + id: _dialogComponentLoader + anchors.margins: 5 + anchors.left: parent.left + anchors.right: parent.right + anchors.top: _spacer.bottom + anchors.bottom: parent.bottom + sourceComponent: dialogComponent + focus: true + property bool acceptAllowed: _acceptButton.visible + property bool rejectAllowed: _rejectButton.visible + } + } +} diff --git a/src/QmlControls/QGCViewMessage.qml b/src/QmlControls/QGCViewMessage.qml new file mode 100644 index 0000000..9e1f69d --- /dev/null +++ b/src/QmlControls/QGCViewMessage.qml @@ -0,0 +1,35 @@ +/**************************************************************************** + * + * (c) 2009-2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + + +/// @file +/// @author Don Gagne + +import QtQuick 2.3 +import QtQuick.Controls 1.2 + +import QGroundControl.Controls 1.0 +import QGroundControl.Palette 1.0 + +QGCViewDialog { + property string message + + QGCFlickable { + anchors.fill: parent + contentHeight: label.contentHeight + + QGCLabel { + id: label + anchors.left: parent.left + anchors.right: parent.right + wrapMode: Text.WordWrap + text: message + } + } +} diff --git a/src/QmlControls/QGroundControl/Airmap/qmldir b/src/QmlControls/QGroundControl/Airmap/qmldir new file mode 100644 index 0000000..b125667 --- /dev/null +++ b/src/QmlControls/QGroundControl/Airmap/qmldir @@ -0,0 +1,10 @@ +Module QGroundControl.Airmap + +AirspaceControl 1.0 AirspaceControl.qml +AirspaceRegulation 1.0 AirspaceRegulation.qml +AirspaceWeather 1.0 AirspaceWeather.qml +ComplianceRules 1.0 ComplianceRules.qml +FlightFeature 1.0 FlightFeature.qml +RuleSelector 1.0 RuleSelector.qml +FlightBrief 1.0 FlightBrief.qml +FlightDetails 1.0 FlightDetails.qml \ No newline at end of file diff --git a/src/QmlControls/QGroundControl/Controls/qmldir b/src/QmlControls/QGroundControl/Controls/qmldir index 0ac432d..557be24 100644 --- a/src/QmlControls/QGroundControl/Controls/qmldir +++ b/src/QmlControls/QGroundControl/Controls/qmldir @@ -33,7 +33,6 @@ JoystickThumbPad 1.0 JoystickThumbPad.qml KMLOrSHPFileDialog 1.0 KMLOrSHPFileDialog.qml LogReplayStatusBar 1.0 LogReplayStatusBar.qml MainStatusIndicator 1.0 MainStatusIndicator.qml -FlightModeMenuIndicator 1.0 FlightModeMenuIndicator.qml MainToolBar 1.0 MainToolBar.qml MainWindowSavedState 1.0 MainWindowSavedState.qml MAVLinkMessageButton 1.0 MAVLinkMessageButton.qml @@ -42,7 +41,6 @@ MissionItemEditor 1.0 MissionItemEditor.qml MissionItemIndexLabel 1.0 MissionItemIndexLabel.qml MissionItemMapVisual 1.0 MissionItemMapVisual.qml MissionItemStatus 1.0 MissionItemStatus.qml -MockLinkOptionsDlg 1.0 MockLinkOptionsDlg.qml ModeSwitchDisplay 1.0 ModeSwitchDisplay.qml MultiRotorMotorDisplay 1.0 MultiRotorMotorDisplay.qml OfflineMapButton 1.0 OfflineMapButton.qml @@ -55,7 +53,6 @@ PreFlightCheckButton 1.0 PreFlightCheckButton.qml PreFlightCheckGroup 1.0 PreFlightCheckGroup.qml PreFlightCheckModel 1.0 PreFlightCheckModel.qml QGCButton 1.0 QGCButton.qml -QGCColumnButton 1.0 QGCColumnButton.qml AutotuneUI 1.0 AutotuneUI.qml QGCCheckBox 1.0 QGCCheckBox.qml QGCColoredImage 1.0 QGCColoredImage.qml @@ -80,8 +77,8 @@ QGCOptionsComboBox 1.0 QGCOptionsComboBox.qml QGCPipOverlay 1.0 QGCPipOverlay.qml QGCPipState 1.0 QGCPipState.qml QGCPopupDialog 1.0 QGCPopupDialog.qml +QGCPopupDialogContainer 1.0 QGCPopupDialogContainer.qml QGCRadioButton 1.0 QGCRadioButton.qml -QGCSimpleMessageDialog 1.0 QGCSimpleMessageDialog.qml QGCSlider 1.0 QGCSlider.qml QGCSwitch 1.0 QGCSwitch.qml QGCTabBar 1.0 QGCTabBar.qml @@ -89,6 +86,9 @@ QGCTabButton 1.0 QGCTabButton.qml QGCTextField 1.0 QGCTextField.qml QGCToolBarButton 1.0 QGCToolBarButton.qml QGCToolInsets 1.0 QGCToolInsets.qml +QGCViewDialog 1.0 QGCViewDialog.qml +QGCViewDialogContainer 1.0 QGCViewDialogContainer.qml +QGCViewMessage 1.0 QGCViewMessage.qml RallyPointEditorHeader 1.0 RallyPointEditorHeader.qml RallyPointItemEditor 1.0 RallyPointItemEditor.qml RallyPointMapVisuals 1.0 RallyPointMapVisuals.qml diff --git a/src/QmlControls/QGroundControl/FlightDisplay/qmldir b/src/QmlControls/QGroundControl/FlightDisplay/qmldir index f27005c..f44dd8c 100644 --- a/src/QmlControls/QGroundControl/FlightDisplay/qmldir +++ b/src/QmlControls/QGroundControl/FlightDisplay/qmldir @@ -1,6 +1,7 @@ Module QGroundControl.FlightDisplay FlightDisplayViewWidgets 1.0 FlightDisplayViewWidgets.qml +FlyViewAirspaceIndicator 1.0 FlyViewAirspaceIndicator.qml FlyView 1.0 FlyView.qml FlyViewCustomLayer 1.0 FlyViewCustomLayer.qml FlyViewInstrumentPanel 1.0 FlyViewInstrumentPanel.qml @@ -11,7 +12,6 @@ FlyViewToolStrip 1.0 FlyViewToolStrip.qml FlyViewToolStripActionList 1.0 FlyViewToolStripActionList.qml FlyViewVideo 1.0 FlyViewVideo.qml FlyViewWidgetLayer 1.0 FlyViewWidgetLayer.qml -FlyViewInsetViewer 1.0 FlyViewInsetViewer.qml GuidedActionActionList 1.0 GuidedActionActionList.qml GuidedActionConfirm 1.0 GuidedActionConfirm.qml GuidedActionsController 1.0 GuidedActionsController.qml @@ -19,9 +19,8 @@ GuidedActionLand 1.0 GuidedActionLand.qml GuidedActionList 1.0 GuidedActionList.qml GuidedActionPause 1.0 GuidedActionPause.qml GuidedActionRTL 1.0 GuidedActionRTL.qml -GuidedValueSlider 1.0 GuidedValueSlider.qml +GuidedAltitudeSlider 1.0 GuidedAltitudeSlider.qml GuidedActionTakeoff 1.0 GuidedActionTakeoff.qml -GuidedActionGripper 1.0 GuidedActionGripper.qml GuidedToolStripAction 1.0 GuidedToolStripAction.qml MultiVehicleList 1.0 MultiVehicleList.qml PreFlightBatteryCheck 1.0 PreFlightBatteryCheck.qml @@ -37,4 +36,3 @@ VehicleWarnings 1.0 VehicleWarnings.qml ObstacleDistanceOverlay 1.0 ObstacleDistanceOverlay.qml ObstacleDistanceOverlayMap 1.0 ObstacleDistanceOverlayMap.qml ObstacleDistanceOverlayVideo 1.0 ObstacleDistanceOverlayVideo.qml -GripperMenu 1.0 GripperMenu.qml diff --git a/src/QmlControls/QGroundControlQmlGlobal.cc b/src/QmlControls/QGroundControlQmlGlobal.cc index 2a32c71..fb2019c 100644 --- a/src/QmlControls/QGroundControlQmlGlobal.cc +++ b/src/QmlControls/QGroundControlQmlGlobal.cc @@ -36,26 +36,6 @@ QGroundControlQmlGlobal::QGroundControlQmlGlobal(QGCApplication* app, QGCToolbox _coord.setLatitude(settings.value(_flightMapPositionLatitudeSettingsKey, _coord.latitude()).toDouble()); _coord.setLongitude(settings.value(_flightMapPositionLongitudeSettingsKey, _coord.longitude()).toDouble()); _zoom = settings.value(_flightMapZoomSettingsKey, _zoom).toDouble(); - _flightMapPositionSettledTimer.setSingleShot(true); - _flightMapPositionSettledTimer.setInterval(1000); - connect(&_flightMapPositionSettledTimer, &QTimer::timeout, [](){ - // When they settle, save flightMapPosition and Zoom to the config file - QSettings settings; - settings.beginGroup(_flightMapPositionSettingsGroup); - settings.setValue(_flightMapPositionLatitudeSettingsKey, _coord.latitude()); - settings.setValue(_flightMapPositionLongitudeSettingsKey, _coord.longitude()); - settings.setValue(_flightMapZoomSettingsKey, _zoom); - }); - connect(this, &QGroundControlQmlGlobal::flightMapPositionChanged, this, [this](QGeoCoordinate){ - if (!_flightMapPositionSettledTimer.isActive()) { - _flightMapPositionSettledTimer.start(); - } - }); - connect(this, &QGroundControlQmlGlobal::flightMapZoomChanged, this, [this](double){ - if (!_flightMapPositionSettledTimer.isActive()) { - _flightMapPositionSettledTimer.start(); - } - }); } QGroundControlQmlGlobal::~QGroundControlQmlGlobal() @@ -77,6 +57,7 @@ void QGroundControlQmlGlobal::setToolbox(QGCToolbox* toolbox) _firmwarePluginManager = toolbox->firmwarePluginManager(); _settingsManager = toolbox->settingsManager(); _gpsRtkFactGroup = qgcApp()->gpsRtkFactGroup(); + _airspaceManager = toolbox->airspaceManager(); _adsbVehicleManager = toolbox->adsbVehicleManager(); _globalPalette = new QGCPalette(this); #if defined(QGC_ENABLE_PAIRING) @@ -247,6 +228,10 @@ void QGroundControlQmlGlobal::setFlightMapPosition(QGeoCoordinate& coordinate) if (coordinate != flightMapPosition()) { _coord.setLatitude(coordinate.latitude()); _coord.setLongitude(coordinate.longitude()); + QSettings settings; + settings.beginGroup(_flightMapPositionSettingsGroup); + settings.setValue(_flightMapPositionLatitudeSettingsKey, _coord.latitude()); + settings.setValue(_flightMapPositionLongitudeSettingsKey, _coord.longitude()); emit flightMapPositionChanged(coordinate); } } @@ -255,6 +240,9 @@ void QGroundControlQmlGlobal::setFlightMapZoom(double zoom) { if (zoom != flightMapZoom()) { _zoom = zoom; + QSettings settings; + settings.beginGroup(_flightMapPositionSettingsGroup); + settings.setValue(_flightMapZoomSettingsKey, _zoom); emit flightMapZoomChanged(zoom); } } diff --git a/src/QmlControls/QGroundControlQmlGlobal.h b/src/QmlControls/QGroundControlQmlGlobal.h index 1a54275..0961bab 100644 --- a/src/QmlControls/QGroundControlQmlGlobal.h +++ b/src/QmlControls/QGroundControlQmlGlobal.h @@ -15,6 +15,7 @@ #include "SimulatedPosition.h" #include "QGCLoggingCategory.h" #include "AppSettings.h" +#include "AirspaceManager.h" #include "ADSBVehicleManager.h" #include "QGCPalette.h" #include "QmlUnitsConversion.h" @@ -65,10 +66,12 @@ public: Q_PROPERTY(VideoManager* videoManager READ videoManager CONSTANT) Q_PROPERTY(MAVLinkLogManager* mavlinkLogManager READ mavlinkLogManager CONSTANT) Q_PROPERTY(SettingsManager* settingsManager READ settingsManager CONSTANT) + Q_PROPERTY(AirspaceManager* airspaceManager READ airspaceManager CONSTANT) Q_PROPERTY(ADSBVehicleManager* adsbVehicleManager READ adsbVehicleManager CONSTANT) Q_PROPERTY(QGCCorePlugin* corePlugin READ corePlugin CONSTANT) Q_PROPERTY(MissionCommandTree* missionCommandTree READ missionCommandTree CONSTANT) Q_PROPERTY(FactGroup* gpsRtk READ gpsRtkFactGroup CONSTANT) + Q_PROPERTY(bool airmapSupported READ airmapSupported CONSTANT) Q_PROPERTY(TaisyncManager* taisyncManager READ taisyncManager CONSTANT) Q_PROPERTY(bool taisyncSupported READ taisyncSupported CONSTANT) Q_PROPERTY(MicrohardManager* microhardManager READ microhardManager CONSTANT) @@ -106,12 +109,6 @@ public: Q_PROPERTY(bool hasMAVLinkInspector READ hasMAVLinkInspector CONSTANT) - //------------------------------------------------------------------------- - // Elevation Provider - Q_PROPERTY(QString elevationProviderName READ elevationProviderName CONSTANT) - Q_PROPERTY(QString elevationProviderNotice READ elevationProviderNotice CONSTANT) - - #if defined(QGC_ENABLE_PAIRING) Q_PROPERTY(PairingManager* pairingManager READ pairingManager CONSTANT) #endif @@ -162,6 +159,7 @@ public: QGCCorePlugin* corePlugin () { return _corePlugin; } SettingsManager* settingsManager () { return _settingsManager; } FactGroup* gpsRtkFactGroup () { return _gpsRtkFactGroup; } + AirspaceManager* airspaceManager () { return _airspaceManager; } ADSBVehicleManager* adsbVehicleManager () { return _adsbVehicleManager; } QmlUnitsConversion* unitsConversion () { return &_unitsConversion; } #if defined(QGC_ENABLE_PAIRING) @@ -209,9 +207,6 @@ public: bool hasMAVLinkInspector () { return true; } #endif - QString elevationProviderName () { return UrlFactory::kCopernicusElevationProviderKey; } - QString elevationProviderNotice () { return UrlFactory::kCopernicusElevationProviderNotice; } - bool singleFirmwareSupport (); bool singleVehicleSupport (); bool px4ProFirmwareSupported (); @@ -230,6 +225,12 @@ public: QString qgcVersion (void) const; +#if defined(QGC_AIRMAP_ENABLED) + bool airmapSupported() { return true; } +#else + bool airmapSupported() { return false; } +#endif + // Overrides from QGCTool virtual void setToolbox(QGCToolbox* toolbox); @@ -254,6 +255,7 @@ private: FirmwarePluginManager* _firmwarePluginManager = nullptr; SettingsManager* _settingsManager = nullptr; FactGroup* _gpsRtkFactGroup = nullptr; + AirspaceManager* _airspaceManager = nullptr; TaisyncManager* _taisyncManager = nullptr; MicrohardManager* _microhardManager = nullptr; ADSBVehicleManager* _adsbVehicleManager = nullptr; @@ -273,5 +275,4 @@ private: static QGeoCoordinate _coord; static double _zoom; - QTimer _flightMapPositionSettledTimer; }; diff --git a/src/QmlControls/QmlObjectListModel.cc b/src/QmlControls/QmlObjectListModel.cc index fc9eff0..a9222c6 100644 --- a/src/QmlControls/QmlObjectListModel.cc +++ b/src/QmlControls/QmlObjectListModel.cc @@ -220,9 +220,9 @@ void QmlObjectListModel::insert(int i, QList objects) QObject::connect(object, SIGNAL(dirtyChanged(bool)), this, SLOT(_childDirtyChanged(bool))); } } + j++; _objectList.insert(j, object); - j++; } insertRows(i, objects.count()); diff --git a/src/QmlControls/QmlUnitsConversion.h b/src/QmlControls/QmlUnitsConversion.h index 769018f..267503d 100644 --- a/src/QmlControls/QmlUnitsConversion.h +++ b/src/QmlControls/QmlUnitsConversion.h @@ -59,12 +59,6 @@ public: QString appSettingsAreaUnitsString(void) const { return FactMetaData::appSettingsAreaUnitsString(); } - /// Converts from meters/second to the user specified speed unit - Q_INVOKABLE QVariant metersSecondToAppSettingsSpeedUnits(const QVariant& metersSecond) const { return FactMetaData::metersSecondToAppSettingsSpeedUnits(metersSecond); } - - /// Converts from user specified speed unit to meters/second - Q_INVOKABLE QVariant appSettingsSpeedUnitsToMetersSecond(const QVariant& speed) const { return FactMetaData::appSettingsSpeedUnitsToMetersSecond(speed); } - /// Returns the string for speed units which has configued by user QString appSettingsSpeedUnitsString() { return FactMetaData::appSettingsSpeedUnitsString(); } diff --git a/src/QmlControls/RCToParamDialog.qml b/src/QmlControls/RCToParamDialog.qml index 0e833c5..f7d6a18 100644 --- a/src/QmlControls/RCToParamDialog.qml +++ b/src/QmlControls/RCToParamDialog.qml @@ -20,12 +20,15 @@ import QGroundControl.FactControls 1.0 import QGroundControl.Controllers 1.0 QGCPopupDialog { + property alias tuningFact: controller.tuningFact + title: qsTr("RC To Param") buttons: StandardButton.Cancel | StandardButton.Ok - property alias tuningFact: controller.tuningFact - - onAccepted: QGroundControl.multiVehicleManager.activeVehicle.sendParamMapRC(tuningFact.name, scale.text, centerValue.text, tuningID.currentIndex, minValue.text, maxValue.text) + function accept() { + QGroundControl.multiVehicleManager.activeVehicle.sendParamMapRC(tuningFact.name, scale.text, centerValue.text, tuningID.currentIndex, minValue.text, maxValue.text); + hideDialog() + } RCToParamDialogController { id: controller diff --git a/src/QmlControls/SliderSwitch.qml b/src/QmlControls/SliderSwitch.qml index f06575e..112223a 100644 --- a/src/QmlControls/SliderSwitch.qml +++ b/src/QmlControls/SliderSwitch.qml @@ -1,11 +1,11 @@ -import QtQuick 2.15 -import QtQuick.Controls 2.15 +import QtQuick 2.3 +import QtQuick.Controls 1.2 import QGroundControl.ScreenTools 1.0 import QGroundControl.Palette 1.0 /// The SliderSwitch control implements a sliding switch control similar to the power off -/// control on an iPhone. It supports holding the space bar to slide the switch. +/// control on an iPhone. Rectangle { id: _root implicitWidth: label.contentWidth + (_diameter * 2.5) + (_border * 4) @@ -18,46 +18,15 @@ Rectangle { property string confirmText ///< Text for slider property alias fontPointSize: label.font.pointSize ///< Point size for text - property real _border: 4 - property real _diameter: height - (_border * 2) - property real _dragStartX: _border - property real _dragStopX: _root.width - (_diameter + _border) - property bool _waitingForLastAutoRepeat: false - - Keys.onSpacePressed: { - if (visible && event.modifiers === Qt.NoModifier && event.isAutoRepeat && !sliderDragArea.drag.active) { - event.accepted = true - if (_waitingForLastAutoRepeat) { - resetSpaceBarSliding() - accept() - } else { - sliderAnimation.start() - spaceBarTimout.restart() - } - } - } - - function resetSpaceBarSliding() { - _waitingForLastAutoRepeat = false - spaceBarTimout.stop() - slider.reset() - } - - Timer { - id: spaceBarTimout - interval: 200 - repeat: false - onTriggered: _root.resetSpaceBarSliding() - } + property real _border: 4 + property real _diameter: height - (_border * 2) QGCPalette { id: qgcPal; colorGroupEnabled: true } QGCLabel { id: label - x: _diameter + _border - width: parent.width - x + anchors.horizontalCenter: parent.horizontalCenter anchors.verticalCenter: parent.verticalCenter - horizontalAlignment: Text.AlignHCenter text: confirmText color: qgcPal.buttonText } @@ -84,19 +53,6 @@ Rectangle { source: "/res/ArrowRight.svg" } - PropertyAnimation on x { - id: sliderAnimation - duration: 1500 - from: _dragStartX - to: _dragStopX - running: false - onFinished: _waitingForLastAutoRepeat = true - } - - function reset() { - slider.x = _border - sliderAnimation.stop() - } } QGCMouseArea { @@ -105,18 +61,20 @@ Rectangle { fillItem: slider drag.target: slider drag.axis: Drag.XAxis - drag.minimumX: _dragStartX - drag.maximumX: _dragStopX + drag.minimumX: _border + drag.maximumX: _maxXDrag preventStealing: true - property bool dragActive: drag.active + property real _maxXDrag: _root.width - (_diameter + _border) + property bool dragActive: drag.active + property real _dragOffset: 1 onDragActiveChanged: { if (!sliderDragArea.drag.active) { - if (slider.x > _dragStopX - _border) { + if (slider.x > _maxXDrag - _border) { _root.accept() } - slider.reset() + slider.x = _border } } } diff --git a/src/QmlControls/ToolStrip.qml b/src/QmlControls/ToolStrip.qml index ad5602c..da90839 100644 --- a/src/QmlControls/ToolStrip.qml +++ b/src/QmlControls/ToolStrip.qml @@ -52,7 +52,7 @@ Rectangle { anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right - height: parent.height - anchors.margins * 2 + height: parent.height contentHeight: toolStripColumn.height flickableDirection: Flickable.VerticalFlick clip: true diff --git a/src/QtLocationPlugin/ElevationMapProvider.cpp b/src/QtLocationPlugin/ElevationMapProvider.cpp index 851f162..c362464 100644 --- a/src/QtLocationPlugin/ElevationMapProvider.cpp +++ b/src/QtLocationPlugin/ElevationMapProvider.cpp @@ -6,40 +6,32 @@ #include "QGCMapEngine.h" #include "TerrainTile.h" -/* -License for the COPERNICUS dataset hosted on https://terrain-ce.suite.auterion.com/: - -© DLR e.V. 2010-2014 and © Airbus Defence and Space GmbH 2014-2018 provided under COPERNICUS -by the European Union and ESA; all rights reserved. - -*/ - ElevationProvider::ElevationProvider(const QString& imageFormat, quint32 averageSize, QGeoMapType::MapStyle mapType, QObject* parent) - : MapProvider(QStringLiteral("https://terrain-ce.suite.auterion.com/"), imageFormat, averageSize, mapType, parent) {} + : MapProvider(QStringLiteral("https://api.airmap.com/"), imageFormat, averageSize, mapType, parent) {} //----------------------------------------------------------------------------- -int CopernicusElevationProvider::long2tileX(const double lon, const int z) const { +int AirmapElevationProvider::long2tileX(const double lon, const int z) const { Q_UNUSED(z) return static_cast(floor((lon + 180.0) / TerrainTile::tileSizeDegrees)); } //----------------------------------------------------------------------------- -int CopernicusElevationProvider::lat2tileY(const double lat, const int z) const { +int AirmapElevationProvider::lat2tileY(const double lat, const int z) const { Q_UNUSED(z) return static_cast(floor((lat + 90.0) / TerrainTile::tileSizeDegrees)); } -QString CopernicusElevationProvider::_getURL(const int x, const int y, const int zoom, QNetworkAccessManager* networkManager) { +QString AirmapElevationProvider::_getURL(const int x, const int y, const int zoom, QNetworkAccessManager* networkManager) { Q_UNUSED(networkManager) Q_UNUSED(zoom) - return QString("https://terrain-ce.suite.auterion.com/api/v1/carpet?points=%1,%2,%3,%4") + return QString("https://api.airmap.com/elevation/v1/ele/carpet?points=%1,%2,%3,%4") .arg(static_cast(y) * TerrainTile::tileSizeDegrees - 90.0) .arg(static_cast(x) * TerrainTile::tileSizeDegrees - 180.0) .arg(static_cast(y + 1) * TerrainTile::tileSizeDegrees - 90.0) .arg(static_cast(x + 1) * TerrainTile::tileSizeDegrees - 180.0); } -QGCTileSet CopernicusElevationProvider::getTileCount(const int zoom, const double topleftLon, +QGCTileSet AirmapElevationProvider::getTileCount(const int zoom, const double topleftLon, const double topleftLat, const double bottomRightLon, const double bottomRightLat) const { QGCTileSet set; diff --git a/src/QtLocationPlugin/ElevationMapProvider.h b/src/QtLocationPlugin/ElevationMapProvider.h index 8420569..ce2cbea 100644 --- a/src/QtLocationPlugin/ElevationMapProvider.h +++ b/src/QtLocationPlugin/ElevationMapProvider.h @@ -24,10 +24,10 @@ class ElevationProvider : public MapProvider { // ----------------------------------------------------------- // Airmap Elevation -class CopernicusElevationProvider : public ElevationProvider { +class AirmapElevationProvider : public ElevationProvider { Q_OBJECT public: - CopernicusElevationProvider(QObject* parent = nullptr) + AirmapElevationProvider(QObject* parent = nullptr) : ElevationProvider(QStringLiteral("bin"), AVERAGE_AIRMAP_ELEV_SIZE, QGeoMapType::StreetMap, parent) {} @@ -42,3 +42,4 @@ class CopernicusElevationProvider : public ElevationProvider { protected: QString _getURL(const int x, const int y, const int zoom, QNetworkAccessManager* networkManager) override; }; + diff --git a/src/QtLocationPlugin/GenericMapProvider.cpp b/src/QtLocationPlugin/GenericMapProvider.cpp index f0e9928..14557e0 100644 --- a/src/QtLocationPlugin/GenericMapProvider.cpp +++ b/src/QtLocationPlugin/GenericMapProvider.cpp @@ -65,14 +65,6 @@ QString StatkartMapProvider::_getURL(const int x, const int y, const int zoom, Q return StatkartMapUrl.arg(zoom).arg(x).arg(y); } -static const QString StatkartBaseMapUrl = QStringLiteral("http://opencache.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=norgeskart_bakgrunn&zoom=%1&x=%2&y=%3"); - -QString StatkartBaseMapProvider::_getURL(const int x, const int y, const int zoom, QNetworkAccessManager* networkManager) { - Q_UNUSED(networkManager) - return StatkartBaseMapUrl.arg(zoom).arg(x).arg(y); -} - - static const QString EniroMapUrl = QStringLiteral("http://map.eniro.com/geowebcache/service/tms1.0.0/map/%1/%2/%3.png"); QString EniroMapProvider::_getURL(const int x, const int y, const int zoom, QNetworkAccessManager* networkManager) { diff --git a/src/QtLocationPlugin/GenericMapProvider.h b/src/QtLocationPlugin/GenericMapProvider.h index 2dfbe1d..4472508 100644 --- a/src/QtLocationPlugin/GenericMapProvider.h +++ b/src/QtLocationPlugin/GenericMapProvider.h @@ -80,21 +80,12 @@ class CustomURLMapProvider : public MapProvider { QString _getURL(const int x, const int y, const int zoom, QNetworkAccessManager* networkManager) override; }; + class StatkartMapProvider : public MapProvider { Q_OBJECT public: StatkartMapProvider(QObject* parent = nullptr) - : MapProvider(QStringLiteral("https://norgeskart.no/"), QStringLiteral("png"), - AVERAGE_TILE_SIZE, QGeoMapType::StreetMap, parent) {} - - QString _getURL(const int x, const int y, const int zoom, QNetworkAccessManager* networkManager) override; -}; - -class StatkartBaseMapProvider : public MapProvider { - Q_OBJECT - public: - StatkartBaseMapProvider(QObject* parent = nullptr) - : MapProvider(QStringLiteral("https://norgeskart.no/"), QStringLiteral("png"), + : MapProvider(QStringLiteral("https://www.norgeskart.no/"), QStringLiteral("png"), AVERAGE_TILE_SIZE, QGeoMapType::StreetMap, parent) {} QString _getURL(const int x, const int y, const int zoom, QNetworkAccessManager* networkManager) override; diff --git a/src/QtLocationPlugin/QGCMapEngine.cpp b/src/QtLocationPlugin/QGCMapEngine.cpp index 6f29fc6..15774db 100644 --- a/src/QtLocationPlugin/QGCMapEngine.cpp +++ b/src/QtLocationPlugin/QGCMapEngine.cpp @@ -200,7 +200,7 @@ QGCMapEngine::addTask(QGCMapTask* task) //----------------------------------------------------------------------------- void -QGCMapEngine::cacheTile(const QString& type, int x, int y, int z, const QByteArray& image, const QString &format, qulonglong set) +QGCMapEngine::cacheTile(QString type, int x, int y, int z, const QByteArray& image, const QString &format, qulonglong set) { QString hash = getTileHash(type, x, y, z); cacheTile(type, hash, image, format, set); @@ -208,7 +208,7 @@ QGCMapEngine::cacheTile(const QString& type, int x, int y, int z, const QByteArr //----------------------------------------------------------------------------- void -QGCMapEngine::cacheTile(const QString& type, const QString& hash, const QByteArray& image, const QString& format, qulonglong set) +QGCMapEngine::cacheTile(QString type, const QString& hash, const QByteArray& image, const QString& format, qulonglong set) { AppSettings* appSettings = qgcApp()->toolbox()->settingsManager()->appSettings(); //-- If we are allowed to persist data, save tile to cache @@ -220,7 +220,7 @@ QGCMapEngine::cacheTile(const QString& type, const QString& hash, const QByteArr //----------------------------------------------------------------------------- QString -QGCMapEngine::getTileHash(const QString& type, int x, int y, int z) +QGCMapEngine::getTileHash(QString type, int x, int y, int z) { return QString::asprintf("%010d%08d%08d%03d", getQGCMapEngine()->urlFactory()->getIdFromType(type), x, y, z); } @@ -235,7 +235,7 @@ QGCMapEngine::hashToType(const QString& hash) //----------------------------------------------------------------------------- QGCFetchTileTask* -QGCMapEngine::createFetchTileTask(const QString& type, int x, int y, int z) +QGCMapEngine::createFetchTileTask(QString type, int x, int y, int z) { QString hash = getTileHash(type, x, y, z); QGCFetchTileTask* task = new QGCFetchTileTask(hash); @@ -244,7 +244,7 @@ QGCMapEngine::createFetchTileTask(const QString& type, int x, int y, int z) //----------------------------------------------------------------------------- QGCTileSet -QGCMapEngine::getTileCount(int zoom, double topleftLon, double topleftLat, double bottomRightLon, double bottomRightLat, const QString& mapType) +QGCMapEngine::getTileCount(int zoom, double topleftLon, double topleftLat, double bottomRightLon, double bottomRightLat, QString mapType) { if(zoom < 1) zoom = 1; if(zoom > MAX_MAP_ZOOM) zoom = MAX_MAP_ZOOM; @@ -368,7 +368,7 @@ QGCMapEngine::_pruned() //----------------------------------------------------------------------------- int -QGCMapEngine::concurrentDownloads(const QString& type) +QGCMapEngine::concurrentDownloads(QString type) { Q_UNUSED(type); // TODO : We may want different values depending on diff --git a/src/QtLocationPlugin/QGCMapEngine.h b/src/QtLocationPlugin/QGCMapEngine.h index 5f8bce7..4f4668d 100644 --- a/src/QtLocationPlugin/QGCMapEngine.h +++ b/src/QtLocationPlugin/QGCMapEngine.h @@ -36,13 +36,13 @@ public: void init (); void addTask (QGCMapTask *task); - void cacheTile (const QString& type, int x, int y, int z, const QByteArray& image, const QString& format, qulonglong set = UINT64_MAX); - void cacheTile (const QString& type, const QString& hash, const QByteArray& image, const QString& format, qulonglong set = UINT64_MAX); - QGCFetchTileTask* createFetchTileTask (const QString& type, int x, int y, int z); + void cacheTile (QString type, int x, int y, int z, const QByteArray& image, const QString& format, qulonglong set = UINT64_MAX); + void cacheTile (QString type, const QString& hash, const QByteArray& image, const QString& format, qulonglong set = UINT64_MAX); + QGCFetchTileTask* createFetchTileTask (QString type, int x, int y, int z); QStringList getMapNameList (); const QString userAgent () { return _userAgent; } void setUserAgent (const QString& ua) { _userAgent = ua; } - QString hashToType (const QString& hash); + QString hashToType (const QString& hash); quint32 getMaxDiskCache (); void setMaxDiskCache (quint32 size); quint32 getMaxMemCache (); @@ -56,13 +56,13 @@ public: UrlFactory* urlFactory () { return _urlFactory; } //-- Tile Math - static QGCTileSet getTileCount (int zoom, double topleftLon, double topleftLat, double bottomRightLon, double bottomRightLat, const QString& mapType); - static QString getTileHash (const QString& type, int x, int y, int z); - static QString getTypeFromName (const QString& name); + static QGCTileSet getTileCount (int zoom, double topleftLon, double topleftLat, double bottomRightLon, double bottomRightLat, QString mapType); + static QString getTileHash (QString type, int x, int y, int z); + static QString getTypeFromName (const QString &name); static QString bigSizeToString (quint64 size); static QString storageFreeSizeToString(quint64 size_MB); static QString numberToString (quint64 number); - static int concurrentDownloads (const QString& type); + static int concurrentDownloads (QString type); private slots: void _updateTotals (quint32 totaltiles, quint64 totalsize, quint32 defaulttiles, quint64 defaultsize); diff --git a/src/QtLocationPlugin/QGCMapEngineData.h b/src/QtLocationPlugin/QGCMapEngineData.h index 14fe489..64cdbc1 100644 --- a/src/QtLocationPlugin/QGCMapEngineData.h +++ b/src/QtLocationPlugin/QGCMapEngineData.h @@ -76,7 +76,7 @@ class QGCCacheTile : public QObject { Q_OBJECT public: - QGCCacheTile (const QString& hash, const QByteArray& img, const QString& format, const QString& type, qulonglong set = UINT64_MAX) + QGCCacheTile (const QString hash, const QByteArray img, const QString format, QString type, qulonglong set = UINT64_MAX) : _set(set) , _hash(hash) , _img(img) diff --git a/src/QtLocationPlugin/QGCMapTileSet.cpp b/src/QtLocationPlugin/QGCMapTileSet.cpp index 5888cad..e8ad05d 100644 --- a/src/QtLocationPlugin/QGCMapTileSet.cpp +++ b/src/QtLocationPlugin/QGCMapTileSet.cpp @@ -19,7 +19,6 @@ #include "QGCMapEngine.h" #include "QGCMapTileSet.h" #include "QGCMapEngineManager.h" -#include "QGCFileDownload.h" #include "TerrainTile.h" #include @@ -250,7 +249,6 @@ void QGCCachedTileSet::_prepareDownload() #endif QNetworkReply* reply = _networkManager->get(request); reply->setParent(0); - QGCFileDownload::setIgnoreSSLErrorsIfNeeded(*reply); connect(reply, &QNetworkReply::finished, this, &QGCCachedTileSet::_networkReplyFinished); connect(reply, &QNetworkReply::errorOccurred, this, &QGCCachedTileSet::_networkReplyError); _replies.insert(tile->hash(), reply); @@ -289,7 +287,7 @@ QGCCachedTileSet::_networkReplyFinished() qCDebug(QGCCachedTileSetLog) << "Tile fetched" << hash; QByteArray image = reply->readAll(); QString type = getQGCMapEngine()->hashToType(hash); - if (type == UrlFactory::kCopernicusElevationProviderKey) { + if (type == "Airmap Elevation" ) { image = TerrainTile::serializeFromAirMapJson(image); } QString format = getQGCMapEngine()->urlFactory()->getImageFormat(type, image); diff --git a/src/QtLocationPlugin/QGCMapUrlEngine.cpp b/src/QtLocationPlugin/QGCMapUrlEngine.cpp index b41002f..8461dc1 100644 --- a/src/QtLocationPlugin/QGCMapUrlEngine.cpp +++ b/src/QtLocationPlugin/QGCMapUrlEngine.cpp @@ -32,9 +32,6 @@ QGC_LOGGING_CATEGORY(QGCMapUrlEngineLog, "QGCMapUrlEngineLog") #include #include -const char* UrlFactory::kCopernicusElevationProviderKey = "Copernicus Elevation"; -const char* UrlFactory::kCopernicusElevationProviderNotice = "© Airbus Defence and Space GmbH"; - //----------------------------------------------------------------------------- UrlFactory::UrlFactory() : _timeout(5 * 1000) { @@ -45,7 +42,7 @@ UrlFactory::UrlFactory() : _timeout(5 * 1000) { _providersTable["Google Satellite"] = new GoogleSatelliteMapProvider(this); _providersTable["Google Terrain"] = new GoogleTerrainMapProvider(this); _providersTable["Google Hybrid"] = new GoogleHybridMapProvider(this); - _providersTable["Google Labels"] = new GoogleLabelsMapProvider(this); + _providersTable["Google Labels"] = new GoogleTerrainMapProvider(this); #endif _providersTable["Bing Road"] = new BingRoadMapProvider(this); @@ -53,7 +50,6 @@ UrlFactory::UrlFactory() : _timeout(5 * 1000) { _providersTable["Bing Hybrid"] = new BingHybridMapProvider(this); _providersTable["Statkart Topo"] = new StatkartMapProvider(this); - _providersTable["Statkart Basemap"] = new StatkartBaseMapProvider(this); _providersTable["Eniro Topo"] = new EniroMapProvider(this); @@ -74,20 +70,20 @@ UrlFactory::UrlFactory() : _timeout(5 * 1000) { //_providersTable["MapQuest Map"] = new MapQuestMapMapProvider(this); //_providersTable["MapQuest Sat"] = new MapQuestSatMapProvider(this); - + _providersTable["VWorld Street Map"] = new VWorldStreetMapProvider(this); _providersTable["VWorld Satellite Map"] = new VWorldSatMapProvider(this); - _providersTable[kCopernicusElevationProviderKey] = new CopernicusElevationProvider(this); + _providersTable["Airmap Elevation"] = new AirmapElevationProvider(this); _providersTable["Japan-GSI Contour"] = new JapanStdMapProvider(this); _providersTable["Japan-GSI Seamless"] = new JapanSeamlessMapProvider(this); _providersTable["Japan-GSI Anaglyph"] = new JapanAnaglyphMapProvider(this); _providersTable["Japan-GSI Slope"] = new JapanSlopeMapProvider(this); _providersTable["Japan-GSI Relief"] = new JapanReliefMapProvider(this); - + _providersTable["LINZ Basemap"] = new LINZBasemapMapProvider(this); - + _providersTable["CustomURL Custom"] = new CustomURLMapProvider(this); } @@ -109,7 +105,7 @@ QString UrlFactory::getImageFormat(int id, const QByteArray& image) { } //----------------------------------------------------------------------------- -QString UrlFactory::getImageFormat(const QString& type, const QByteArray& image) { +QString UrlFactory::getImageFormat(QString type, const QByteArray& image) { if (_providersTable.find(type) != _providersTable.end()) { return _providersTable[type]->getImageFormat(image); } else { @@ -130,7 +126,7 @@ QNetworkRequest UrlFactory::getTileURL(int id, int x, int y, int zoom, } //----------------------------------------------------------------------------- -QNetworkRequest UrlFactory::getTileURL(const QString& type, int x, int y, int zoom, +QNetworkRequest UrlFactory::getTileURL(QString type, int x, int y, int zoom, QNetworkAccessManager* networkManager) { if (_providersTable.find(type) != _providersTable.end()) { return _providersTable[type]->getTileURL(x, y, zoom, networkManager); @@ -140,10 +136,10 @@ QNetworkRequest UrlFactory::getTileURL(const QString& type, int x, int y, int zo } //----------------------------------------------------------------------------- -quint32 UrlFactory::averageSizeForType(const QString& type) { +quint32 UrlFactory::averageSizeForType(QString type) { if (_providersTable.find(type) != _providersTable.end()) { return _providersTable[type]->getAverageSize(); - } + } qCDebug(QGCMapUrlEngineLog) << "UrlFactory::averageSizeForType " << type << " Not registered"; @@ -156,9 +152,13 @@ quint32 UrlFactory::averageSizeForType(const QString& type) { } QString UrlFactory::getTypeFromId(int id) { - for (auto it = _providersTable.constBegin(); it != _providersTable.constEnd(); ++it) { - if ((int)(qHash(it.key()) >> 1) == id) { - return it.key(); + + QHashIterator i(_providersTable); + + while (i.hasNext()) { + i.next(); + if ((int)(qHash(i.key())>>1) == id) { + return i.key(); } } qCDebug(QGCMapUrlEngineLog) << "getTypeFromId : id not found" << id; @@ -176,26 +176,21 @@ MapProvider* UrlFactory::getMapProviderFromId(int id) return nullptr; } -//----------------------------------------------------------------------------- // Todo : qHash produce a uint bigger than max(int) // There is still a low probability for this to // generate similar hash for different types -int -UrlFactory::getIdFromType(const QString& type) -{ - return (int)(qHash(type)>>1); -} +int UrlFactory::getIdFromType(QString type) { return (int)(qHash(type)>>1); } //----------------------------------------------------------------------------- int -UrlFactory::long2tileX(const QString& mapType, double lon, int z) +UrlFactory::long2tileX(QString mapType, double lon, int z) { return _providersTable[mapType]->long2tileX(lon, z); } //----------------------------------------------------------------------------- int -UrlFactory::lat2tileY(const QString& mapType, double lat, int z) +UrlFactory::lat2tileY(QString mapType, double lat, int z) { return _providersTable[mapType]->lat2tileY(lat, z); } @@ -203,7 +198,7 @@ UrlFactory::lat2tileY(const QString& mapType, double lat, int z) //----------------------------------------------------------------------------- QGCTileSet -UrlFactory::getTileCount(int zoom, double topleftLon, double topleftLat, double bottomRightLon, double bottomRightLat, const QString& mapType) +UrlFactory::getTileCount(int zoom, double topleftLon, double topleftLat, double bottomRightLon, double bottomRightLat, QString mapType) { return _providersTable[mapType]->getTileCount(zoom, topleftLon, topleftLat, bottomRightLon, bottomRightLat); } diff --git a/src/QtLocationPlugin/QGCMapUrlEngine.h b/src/QtLocationPlugin/QGCMapUrlEngine.h index 8d3535c..898cf47 100644 --- a/src/QtLocationPlugin/QGCMapUrlEngine.h +++ b/src/QtLocationPlugin/QGCMapUrlEngine.h @@ -29,32 +29,30 @@ class UrlFactory : public QObject { Q_OBJECT public: - static const char* kCopernicusElevationProviderKey; - static const char* kCopernicusElevationProviderNotice; UrlFactory (); ~UrlFactory (); - QNetworkRequest getTileURL (const QString& type, int x, int y, int zoom, QNetworkAccessManager* networkManager); + QNetworkRequest getTileURL (QString type, int x, int y, int zoom, QNetworkAccessManager* networkManager); QNetworkRequest getTileURL (int id, int x, int y, int zoom, QNetworkAccessManager* networkManager); - QString getImageFormat (const QString& type, const QByteArray& image); + QString getImageFormat (QString type, const QByteArray& image); QString getImageFormat (int id , const QByteArray& image); - quint32 averageSizeForType (const QString& type); + quint32 averageSizeForType (QString type); - int long2tileX(const QString& mapType, double lon, int z); - int lat2tileY(const QString& mapType, double lat, int z); + int long2tileX(QString mapType, double lon, int z); + int lat2tileY(QString mapType, double lat, int z); QHash getProviderTable(){return _providersTable;} - int getIdFromType(const QString& type); + int getIdFromType(QString type); QString getTypeFromId(int id); MapProvider* getMapProviderFromId(int id); QGCTileSet getTileCount(int zoom, double topleftLon, double topleftLat, double bottomRightLon, double bottomRightLat, - const QString& mapType); + QString mapType); bool isElevation(int mapId); diff --git a/src/QtLocationPlugin/QGCTileCacheWorker.cpp b/src/QtLocationPlugin/QGCTileCacheWorker.cpp index f8f9188..b8ab9f0 100644 --- a/src/QtLocationPlugin/QGCTileCacheWorker.cpp +++ b/src/QtLocationPlugin/QGCTileCacheWorker.cpp @@ -297,7 +297,7 @@ QGCCacheWorker::_saveTile(QGCMapTask *mtask) query.addBindValue(task->tile()->img()); query.addBindValue(task->tile()->img().size()); query.addBindValue(task->tile()->type()); - query.addBindValue(QDateTime::currentDateTime().toSecsSinceEpoch()); + query.addBindValue(QDateTime::currentDateTime().toTime_t()); if(query.exec()) { quint64 tileID = query.lastInsertId().toULongLong(); quint64 setID = task->tile()->set() == UINT64_MAX ? _getDefaultTileSet() : task->tile()->set(); @@ -329,11 +329,11 @@ QGCCacheWorker::_getTile(QGCMapTask* mtask) QString s = QString("SELECT tile, format, type FROM Tiles WHERE hash = \"%1\"").arg(task->hash()); if(query.exec(s)) { if(query.next()) { - const QByteArray& arrray = query.value(0).toByteArray(); - const QString& format = query.value(1).toString(); + QByteArray ar = query.value(0).toByteArray(); + QString format = query.value(1).toString(); QString type = getQGCMapEngine()->urlFactory()->getTypeFromId(query.value(2).toInt()); qCDebug(QGCTileCacheLog) << "_getTile() (Found in DB) HASH:" << task->hash(); - QGCCacheTile* tile = new QGCCacheTile(task->hash(), arrray, format, type); + QGCCacheTile* tile = new QGCCacheTile(task->hash(), ar, format, type); task->setTileFetched(tile); found = true; } @@ -370,7 +370,7 @@ QGCCacheWorker::_getTileSets(QGCMapTask* mtask) set->setType(getQGCMapEngine()->urlFactory()->getTypeFromId(query.value("type").toInt())); set->setTotalTileCount(query.value("numTiles").toUInt()); set->setDefaultSet(query.value("defaultSet").toInt() != 0); - set->setCreationDate(QDateTime::fromSecsSinceEpoch(query.value("date").toUInt())); + set->setCreationDate(QDateTime::fromTime_t(query.value("date").toUInt())); _updateSetTotals(set); //-- Object created here must be moved to app thread to be used there set->moveToThread(QApplication::instance()->thread()); @@ -499,7 +499,7 @@ QGCCacheWorker::_createTileSet(QGCMapTask *mtask) query.addBindValue(task->tileSet()->maxZoom()); query.addBindValue(getQGCMapEngine()->urlFactory()->getIdFromType(task->tileSet()->type())); query.addBindValue(task->tileSet()->totalTileCount()); - query.addBindValue(QDateTime::currentDateTime().toSecsSinceEpoch()); + query.addBindValue(QDateTime::currentDateTime().toTime_t()); if(!query.exec()) { qWarning() << "Map Cache SQL error (add tileSet into TileSets):" << query.lastError().text(); } else { @@ -799,7 +799,7 @@ QGCCacheWorker::_importSets(QGCMapTask* mtask) cQuery.addBindValue(type); cQuery.addBindValue(numTiles); cQuery.addBindValue(defaultSet); - cQuery.addBindValue(QDateTime::currentDateTime().toSecsSinceEpoch()); + cQuery.addBindValue(QDateTime::currentDateTime().toTime_t()); if(!cQuery.exec()) { task->setError("Error adding imported tile set to database"); break; @@ -829,7 +829,7 @@ QGCCacheWorker::_importSets(QGCMapTask* mtask) cQuery.addBindValue(img); cQuery.addBindValue(img.size()); cQuery.addBindValue(type); - cQuery.addBindValue(QDateTime::currentDateTime().toSecsSinceEpoch()); + cQuery.addBindValue(QDateTime::currentDateTime().toTime_t()); if(cQuery.exec()) { tilesSaved++; quint64 importTileID = cQuery.lastInsertId().toULongLong(); @@ -939,7 +939,7 @@ QGCCacheWorker::_exportSets(QGCMapTask* mtask) exportQuery.addBindValue(getQGCMapEngine()->urlFactory()->getIdFromType(set->type())); exportQuery.addBindValue(set->totalTileCount()); exportQuery.addBindValue(set->defaultSet()); - exportQuery.addBindValue(QDateTime::currentDateTime().toSecsSinceEpoch()); + exportQuery.addBindValue(QDateTime::currentDateTime().toTime_t()); if(!exportQuery.exec()) { task->setError("Error adding tile set to exported database"); break; @@ -969,7 +969,7 @@ QGCCacheWorker::_exportSets(QGCMapTask* mtask) exportQuery.addBindValue(img); exportQuery.addBindValue(img.size()); exportQuery.addBindValue(type); - exportQuery.addBindValue(QDateTime::currentDateTime().toSecsSinceEpoch()); + exportQuery.addBindValue(QDateTime::currentDateTime().toTime_t()); if(exportQuery.exec()) { quint64 exportTileID = exportQuery.lastInsertId().toULongLong(); QString s = QString("INSERT INTO SetTiles(tileID, setID) VALUES(%1, %2)").arg(exportTileID).arg(exportSetID); @@ -1115,7 +1115,7 @@ QGCCacheWorker::_createDB(QSqlDatabase& db, bool createDefault) query.prepare("INSERT INTO TileSets(name, defaultSet, date) VALUES(?, ?, ?)"); query.addBindValue(kDefaultSet); query.addBindValue(1); - query.addBindValue(QDateTime::currentDateTime().toSecsSinceEpoch()); + query.addBindValue(QDateTime::currentDateTime().toTime_t()); if(!query.exec()) { qWarning() << "Map Cache SQL error (Creating default tile set):" << db.lastError(); res = false; diff --git a/src/QtLocationPlugin/QMLControl/OfflineMap.qml b/src/QtLocationPlugin/QMLControl/OfflineMap.qml index 5db10d4..9a88b20 100644 --- a/src/QtLocationPlugin/QMLControl/OfflineMap.qml +++ b/src/QtLocationPlugin/QMLControl/OfflineMap.qml @@ -247,169 +247,181 @@ Item { Component { id: optionsDialogComponent - QGCPopupDialog { - title: qsTr("Offline Maps Options") - buttons: StandardButton.Save | StandardButton.Cancel + QGCViewDialog { + id: optionDialog - onAccepted: { + function accept() { QGroundControl.mapEngineManager.maxDiskCache = parseInt(maxCacheSize.text) QGroundControl.mapEngineManager.maxMemCache = parseInt(maxCacheMemSize.text) + optionDialog.hideDialog() } - Column { - spacing: ScreenTools.defaultFontPixelHeight / 2 + QGCFlickable { + anchors.fill: parent + contentHeight: optionsColumn.height - QGCLabel { text: qsTr("Max Cache Disk Size (MB):") } + Column { + id: optionsColumn + anchors.margins: ScreenTools.defaultFontPixelWidth + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + spacing: ScreenTools.defaultFontPixelHeight / 2 - QGCTextField { - id: maxCacheSize - maximumLength: 6 - inputMethodHints: Qt.ImhDigitsOnly - validator: IntValidator {bottom: 1; top: 262144;} - text: QGroundControl.mapEngineManager.maxDiskCache - } + QGCLabel { text: qsTr("Max Cache Disk Size (MB):") } - Item { width: 1; height: 1 } + QGCTextField { + id: maxCacheSize + maximumLength: 6 + inputMethodHints: Qt.ImhDigitsOnly + validator: IntValidator {bottom: 1; top: 262144;} + text: QGroundControl.mapEngineManager.maxDiskCache + } - QGCLabel { - anchors.left: parent.left - anchors.right: parent.right - wrapMode: Text.WordWrap - text: qsTr("Max Cache Memory Size (MB):") - } + Item { width: 1; height: 1 } - QGCTextField { - id: maxCacheMemSize - maximumLength: 4 - inputMethodHints: Qt.ImhDigitsOnly - validator: IntValidator {bottom: 1; top: 1024;} - text: QGroundControl.mapEngineManager.maxMemCache - } + QGCLabel { + anchors.left: parent.left + anchors.right: parent.right + wrapMode: Text.WordWrap + text: qsTr("Max Cache Memory Size (MB):") + } - QGCLabel { - anchors.left: parent.left - anchors.right: parent.right - wrapMode: Text.WordWrap - font.pointSize: _adjustableFontPointSize - text: qsTr("Memory cache changes require a restart to take effect.") - } + QGCTextField { + id: maxCacheMemSize + maximumLength: 4 + inputMethodHints: Qt.ImhDigitsOnly + validator: IntValidator {bottom: 1; top: 1024;} + text: QGroundControl.mapEngineManager.maxMemCache + } - Item { width: 1; height: 1; visible: _mapboxFact ? _mapboxFact.visible : false } - QGCLabel { text: qsTr("Mapbox Access Token"); visible: _mapboxFact ? _mapboxFact.visible : false } - FactTextField { - fact: _mapboxFact - visible: _mapboxFact ? _mapboxFact.visible : false - maximumLength: 256 - width: ScreenTools.defaultFontPixelWidth * 30 - } - QGCLabel { - anchors.left: parent.left - anchors.right: parent.right - wrapMode: Text.WordWrap - text: qsTr("To enable Mapbox maps, enter your access token.") - visible: _mapboxFact ? _mapboxFact.visible : false - font.pointSize: _adjustableFontPointSize - } + QGCLabel { + anchors.left: parent.left + anchors.right: parent.right + wrapMode: Text.WordWrap + font.pointSize: _adjustableFontPointSize + text: qsTr("Memory cache changes require a restart to take effect.") + } - Item { width: 1; height: 1; visible: _mapboxAccountFact ? _mapboxAccountFact.visible : false } - QGCLabel { text: qsTr("Mapbox User Name"); visible: _mapboxAccountFact ? _mapboxAccountFact.visible : false } - FactTextField { - fact: _mapboxAccountFact - visible: _mapboxAccountFact ? _mapboxAccountFact.visible : false - maximumLength: 256 - width: ScreenTools.defaultFontPixelWidth * 30 - } - QGCLabel { - anchors.left: parent.left - anchors.right: parent.right - wrapMode: Text.WordWrap - text: qsTr("To enable custom Mapbox styles, enter your account name.") - visible: _mapboxAccountFact ? _mapboxAccountFact.visible : false - font.pointSize: _adjustableFontPointSize - } + Item { width: 1; height: 1; visible: _mapboxFact ? _mapboxFact.visible : false } + QGCLabel { text: qsTr("Mapbox Access Token"); visible: _mapboxFact ? _mapboxFact.visible : false } + FactTextField { + fact: _mapboxFact + visible: _mapboxFact ? _mapboxFact.visible : false + maximumLength: 256 + width: ScreenTools.defaultFontPixelWidth * 30 + } + QGCLabel { + anchors.left: parent.left + anchors.right: parent.right + wrapMode: Text.WordWrap + text: qsTr("To enable Mapbox maps, enter your access token.") + visible: _mapboxFact ? _mapboxFact.visible : false + font.pointSize: _adjustableFontPointSize + } - Item { width: 1; height: 1; visible: _mapboxStyleFact ? _mapboxStyleFact.visible : false } - QGCLabel { text: qsTr("Mapbox Style ID"); visible: _mapboxStyleFact ? _mapboxStyleFact.visible : false } - FactTextField { - fact: _mapboxStyleFact - visible: _mapboxStyleFact ? _mapboxStyleFact.visible : false - maximumLength: 256 - width: ScreenTools.defaultFontPixelWidth * 30 - } - QGCLabel { - anchors.left: parent.left - anchors.right: parent.right - wrapMode: Text.WordWrap - text: qsTr("To enable custom Mapbox styles, enter your style ID.") - visible: _mapboxStyleFact ? _mapboxStyleFact.visible : false - font.pointSize: _adjustableFontPointSize - } + Item { width: 1; height: 1; visible: _mapboxAccountFact ? _mapboxAccountFact.visible : false } + QGCLabel { text: qsTr("Mapbox User Name"); visible: _mapboxAccountFact ? _mapboxAccountFact.visible : false } + FactTextField { + fact: _mapboxAccountFact + visible: _mapboxAccountFact ? _mapboxAccountFact.visible : false + maximumLength: 256 + width: ScreenTools.defaultFontPixelWidth * 30 + } + QGCLabel { + anchors.left: parent.left + anchors.right: parent.right + wrapMode: Text.WordWrap + text: qsTr("To enable custom Mapbox styles, enter your account name.") + visible: _mapboxAccountFact ? _mapboxAccountFact.visible : false + font.pointSize: _adjustableFontPointSize + } - Item { width: 1; height: 1; visible: _esriFact ? _esriFact.visible : false } - QGCLabel { text: qsTr("Esri Access Token"); visible: _esriFact ? _esriFact.visible : false } - FactTextField { - fact: _esriFact - visible: _esriFact ? _esriFact.visible : false - maximumLength: 256 - width: ScreenTools.defaultFontPixelWidth * 30 - } - QGCLabel { - anchors.left: parent.left - anchors.right: parent.right - wrapMode: Text.WordWrap - text: qsTr("To enable Esri maps, enter your access token.") - visible: _esriFact ? _esriFact.visible : false - font.pointSize: _adjustableFontPointSize - } + Item { width: 1; height: 1; visible: _mapboxStyleFact ? _mapboxStyleFact.visible : false } + QGCLabel { text: qsTr("Mapbox Style ID"); visible: _mapboxStyleFact ? _mapboxStyleFact.visible : false } + FactTextField { + fact: _mapboxStyleFact + visible: _mapboxStyleFact ? _mapboxStyleFact.visible : false + maximumLength: 256 + width: ScreenTools.defaultFontPixelWidth * 30 + } + QGCLabel { + anchors.left: parent.left + anchors.right: parent.right + wrapMode: Text.WordWrap + text: qsTr("To enable custom Mapbox styles, enter your style ID.") + visible: _mapboxStyleFact ? _mapboxStyleFact.visible : false + font.pointSize: _adjustableFontPointSize + } - Item { width: 1; height: 1; visible: _vworldFact ? _vworldFact.visible : false } - QGCLabel { text: qsTr("VWorld Access Token"); visible: _vworldFact ? _vworldFact.visible : false } - FactTextField { - fact: _vworldFact - visible: _vworldFact ? _vworldFact.visible : false - maximumLength: 256 - width: ScreenTools.defaultFontPixelWidth * 30 - } - QGCLabel { - anchors.left: parent.left - anchors.right: parent.right - wrapMode: Text.WordWrap - text: qsTr("To enable VWorld maps, enter your access token.") - visible: _vworldFact ? _vworldFact.visible : false - font.pointSize: _adjustableFontPointSize - } + Item { width: 1; height: 1; visible: _esriFact ? _esriFact.visible : false } + QGCLabel { text: qsTr("Esri Access Token"); visible: _esriFact ? _esriFact.visible : false } + FactTextField { + fact: _esriFact + visible: _esriFact ? _esriFact.visible : false + maximumLength: 256 + width: ScreenTools.defaultFontPixelWidth * 30 + } + QGCLabel { + anchors.left: parent.left + anchors.right: parent.right + wrapMode: Text.WordWrap + text: qsTr("To enable Esri maps, enter your access token.") + visible: _esriFact ? _esriFact.visible : false + font.pointSize: _adjustableFontPointSize + } - Item { width: 1; height: 1; visible: _customURLFact ? _customURLFact.visible : false } - QGCLabel { text: qsTr("Custom Map URL"); visible: _customURLFact ? _customURLFact.visible : false } - FactTextField { - fact: _customURLFact - visible: _customURLFact ? _customURLFact.visible : false - maximumLength: 256 - width: ScreenTools.defaultFontPixelWidth * 30 - } - QGCLabel { - anchors.left: parent.left - anchors.right: parent.right - wrapMode: Text.WordWrap - text: qsTr("URL with {x} {y} {z} or {zoom} substitutions") - visible: _customURLFact ? _customURLFact.visible : false - font.pointSize: _adjustableFontPointSize - } - } - } + Item { width: 1; height: 1; visible: _vworldFact ? _vworldFact.visible : false } + QGCLabel { text: qsTr("VWorld Access Token"); visible: _vworldFact ? _vworldFact.visible : false } + FactTextField { + fact: _vworldFact + visible: _vworldFact ? _vworldFact.visible : false + maximumLength: 256 + width: ScreenTools.defaultFontPixelWidth * 30 + } + QGCLabel { + anchors.left: parent.left + anchors.right: parent.right + wrapMode: Text.WordWrap + text: qsTr("To enable VWorld maps, enter your access token.") + visible: _vworldFact ? _vworldFact.visible : false + font.pointSize: _adjustableFontPointSize + } + + Item { width: 1; height: 1; visible: _customURLFact ? _customURLFact.visible : false } + QGCLabel { text: qsTr("Custom Map URL"); visible: _customURLFact ? _customURLFact.visible : false } + FactTextField { + fact: _customURLFact + visible: _customURLFact ? _customURLFact.visible : false + maximumLength: 256 + width: ScreenTools.defaultFontPixelWidth * 30 + } + QGCLabel { + anchors.left: parent.left + anchors.right: parent.right + wrapMode: Text.WordWrap + text: qsTr("URL with {x} {y} {z} or {zoom} substitutions") + visible: _customURLFact ? _customURLFact.visible : false + font.pointSize: _adjustableFontPointSize + } + } // GridLayout + } // QGCFlickable + } // QGCViewDialog - optionsDialog } // Component - optionsDialogComponent Component { id: deleteConfirmationDialogComponent - QGCSimpleMessageDialog { - title: qsTr("Confirm Delete") - text: offlineMapView._currentSelection.defaultSet ? - qsTr("This will delete all tiles INCLUDING the tile sets you have created yourself.\n\nIs this really what you want?") : - qsTr("Delete %1 and all its tiles.\n\nIs this really what you want?").arg(offlineMapView._currentSelection.name) - buttons: StandardButton.Yes | StandardButton.No - - onAccepted: { + QGCViewMessage { + id: deleteConfirmationDialog + message: { + if(offlineMapView._currentSelection.defaultSet) + return qsTr("This will delete all tiles INCLUDING the tile sets you have created yourself.\n\nIs this really what you want?"); + else + return qsTr("Delete %1 and all its tiles.\n\nIs this really what you want?").arg(offlineMapView._currentSelection.name); + } + function accept() { QGroundControl.mapEngineManager.deleteTileSet(offlineMapView._currentSelection) + deleteConfirmationDialog.hideDialog() leaveInfoView() showList() } @@ -522,7 +534,7 @@ Item { Row { spacing: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter - visible: !_defaultSet && mapType !== QGroundControl.elevationProviderName + visible: !_defaultSet && mapType !== "Airmap Elevation" QGCLabel { text: qsTr("Zoom Levels:"); width: infoView._labelWidth; } QGCLabel { text: offlineMapView._currentSelection ? (offlineMapView._currentSelection.minZoom + " - " + offlineMapView._currentSelection.maxZoom) : ""; horizontalAlignment: Text.AlignRight; width: infoView._valueWidth; } } @@ -594,8 +606,7 @@ Item { QGCButton { text: qsTr("Delete") width: ScreenTools.defaultFontPixelWidth * (infoView._extraButton ? 6 : 10) - onClicked: deleteConfirmationDialogComponent.createObject(mainWindow).open() - enabled: offlineMapView._currentSelection ? (offlineMapView._currentSelection.savedTileSize > 0) : false + onClicked: mainWindow.showComponentDialog(deleteConfirmationDialogComponent, qsTr("Confirm Delete"), mainWindow.showDialogDefaultWidth, StandardButton.Yes | StandardButton.No) } QGCButton { text: qsTr("Ok") @@ -1075,7 +1086,7 @@ Item { QGCButton { text: qsTr("Options") width: _buttonSize - onClicked: optionsDialogComponent.createObject(mainWindow).open() + onClicked: mainWindow.showComponentDialog(optionsDialogComponent, qsTr("Offline Maps Options"), mainWindow.showDialogDefaultWidth, StandardButton.Save | StandardButton.Cancel) } } diff --git a/src/QtLocationPlugin/QMLControl/QGCMapEngineManager.cc b/src/QtLocationPlugin/QMLControl/QGCMapEngineManager.cc index ec4fe2d..2882eac 100644 --- a/src/QtLocationPlugin/QMLControl/QGCMapEngineManager.cc +++ b/src/QtLocationPlugin/QMLControl/QGCMapEngineManager.cc @@ -28,8 +28,6 @@ QGC_LOGGING_CATEGORY(QGCMapEngineManagerLog, "QGCMapEngineManagerLog") static const char* kQmlOfflineMapKeyName = "QGCOfflineMap"; -static const auto kElevationMapType = UrlFactory::kCopernicusElevationProviderKey; - //----------------------------------------------------------------------------- QGCMapEngineManager::QGCMapEngineManager(QGCApplication* app, QGCToolbox* toolbox) : QGCTool(app, toolbox) @@ -86,7 +84,7 @@ QGCMapEngineManager::updateForCurrentView(double lon0, double lat0, double lon1, _imageSet += set; } if (_fetchElevation) { - QGCTileSet set = QGCMapEngine::getTileCount(1, lon0, lat0, lon1, lat1, kElevationMapType); + QGCTileSet set = QGCMapEngine::getTileCount(1, lon0, lat0, lon1, lat1, "Airmap Elevation"); _elevationSet += set; } @@ -161,9 +159,9 @@ QGCMapEngineManager::startDownload(const QString& name, const QString& mapType) } else { qWarning() << "QGCMapEngineManager::startDownload() No Tiles to save"; } - if (mapType != kElevationMapType && _fetchElevation) { + if (mapType != "Airmap Elevation" && _fetchElevation) { QGCCachedTileSet* set = new QGCCachedTileSet(name + " Elevation"); - set->setMapTypeStr(kElevationMapType); + set->setMapTypeStr("Airmap Elevation"); set->setTopleftLat(_topleftLat); set->setTopleftLon(_topleftLon); set->setBottomRightLat(_bottomRightLat); @@ -172,7 +170,7 @@ QGCMapEngineManager::startDownload(const QString& name, const QString& mapType) set->setMaxZoom(1); set->setTotalTileSize(_elevationSet.tileSize); set->setTotalTileCount(static_cast(_elevationSet.tileCount)); - set->setType(kElevationMapType); + set->setType("Airmap Elevation"); QGCCreateTileSetTask* task = new QGCCreateTileSetTask(set); //-- Create Tile Set (it will also create a list of tiles to download) connect(task, &QGCCreateTileSetTask::tileSetSaved, this, &QGCMapEngineManager::_tileSetSaved); @@ -454,7 +452,7 @@ QGCMapEngineManager::importSets(QString path) { if(dir.isEmpty()) { #if defined(__mobile__) //-- TODO: This has to be something fixed - dir = QDir(QDir::homePath()).filePath(QString("export_%1.db").arg(QDateTime::currentDateTime().toSecsSinceEpoch())); + dir = QDir(QDir::homePath()).filePath(QString("export_%1.db").arg(QDateTime::currentDateTime().toTime_t())); #else dir = QString(); //-- TODO: QGCQFileDialog::getOpenFileName( // nullptr, @@ -484,7 +482,7 @@ QGCMapEngineManager::exportSets(QString path) { QString dir = path; if(dir.isEmpty()) { #if defined(__mobile__) - dir = QDir(QDir::homePath()).filePath(QString("export_%1.db").arg(QDateTime::currentDateTime().toSecsSinceEpoch())); + dir = QDir(QDir::homePath()).filePath(QString("export_%1.db").arg(QDateTime::currentDateTime().toTime_t())); #else dir = QString(); //-- TODO: QGCQFileDialog::getSaveFileName( // MainWindow::instance(), diff --git a/src/QtLocationPlugin/qtlocation/README.md b/src/QtLocationPlugin/qtlocation/README.md new file mode 100644 index 0000000..d85d4f1 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/README.md @@ -0,0 +1,9 @@ +# QGroundControl + +## Qt Location Headers for Qt 5.5.1 + +Qt version 5.5.1 did not include the headers for QtLocation. It's included here so we can build our location plugin. This is only needed for Qt 5.5.1. The qmake file handles it automatically. Once we move past 5.5.1 we can delete this directory. + +The bug has been reported here: + +https://bugreports.qt.io/browse/QTBUG-48812 diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qcache3q_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qcache3q_p.h new file mode 100644 index 0000000..2f3ebc0 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qcache3q_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qcache3q_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeocameracapabilities_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeocameracapabilities_p.h new file mode 100644 index 0000000..c237979 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeocameracapabilities_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeocameracapabilities_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeocameradata_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeocameradata_p.h new file mode 100644 index 0000000..0639753 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeocameradata_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeocameradata_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeocameratiles_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeocameratiles_p.h new file mode 100644 index 0000000..80f6aaf --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeocameratiles_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeocameratiles_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeocodereply_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeocodereply_p.h new file mode 100644 index 0000000..2524050 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeocodereply_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeocodereply_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeocodingmanager_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeocodingmanager_p.h new file mode 100644 index 0000000..043ed36 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeocodingmanager_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeocodingmanager_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeocodingmanagerengine_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeocodingmanagerengine_p.h new file mode 100644 index 0000000..5ce24ee --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeocodingmanagerengine_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeocodingmanagerengine_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomaneuver_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomaneuver_p.h new file mode 100644 index 0000000..cd5008e --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomaneuver_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeomaneuver_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomap_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomap_p.h new file mode 100644 index 0000000..b7327e4 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomap_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeomap_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomap_p_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomap_p_p.h new file mode 100644 index 0000000..3407c69 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomap_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeomap_p_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomapcontroller_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomapcontroller_p.h new file mode 100644 index 0000000..ba33d75 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomapcontroller_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeomapcontroller_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomappingmanager_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomappingmanager_p.h new file mode 100644 index 0000000..9b03ed7 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomappingmanager_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeomappingmanager_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomappingmanager_p_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomappingmanager_p_p.h new file mode 100644 index 0000000..a9d965a --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomappingmanager_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeomappingmanager_p_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomappingmanagerengine_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomappingmanagerengine_p.h new file mode 100644 index 0000000..a1dd77b --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomappingmanagerengine_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeomappingmanagerengine_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomappingmanagerengine_p_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomappingmanagerengine_p_p.h new file mode 100644 index 0000000..7d99d28 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomappingmanagerengine_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeomappingmanagerengine_p_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomapscene_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomapscene_p.h new file mode 100644 index 0000000..b80f27d --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomapscene_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeomapscene_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomaptype_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomaptype_p.h new file mode 100644 index 0000000..d6f8348 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomaptype_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeomaptype_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomaptype_p_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomaptype_p_p.h new file mode 100644 index 0000000..93fb3ba --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeomaptype_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeomaptype_p_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeoroute_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeoroute_p.h new file mode 100644 index 0000000..aed5df1 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeoroute_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeoroute_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeoroutereply_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeoroutereply_p.h new file mode 100644 index 0000000..73e5640 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeoroutereply_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeoroutereply_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeorouterequest_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeorouterequest_p.h new file mode 100644 index 0000000..00f7941 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeorouterequest_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeorouterequest_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeoroutesegment_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeoroutesegment_p.h new file mode 100644 index 0000000..77cc84a --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeoroutesegment_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeoroutesegment_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeoroutingmanager_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeoroutingmanager_p.h new file mode 100644 index 0000000..1824922 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeoroutingmanager_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeoroutingmanager_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeoroutingmanagerengine_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeoroutingmanagerengine_p.h new file mode 100644 index 0000000..6f11de9 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeoroutingmanagerengine_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeoroutingmanagerengine_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeoserviceprovider_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeoserviceprovider_p.h new file mode 100644 index 0000000..88f9999 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeoserviceprovider_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeoserviceprovider_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotilecache_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotilecache_p.h new file mode 100644 index 0000000..bcabde3 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotilecache_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeotilecache_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotiledmap_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotiledmap_p.h new file mode 100644 index 0000000..718b0a3 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotiledmap_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeotiledmap_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotiledmap_p_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotiledmap_p_p.h new file mode 100644 index 0000000..10bf8bb --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotiledmap_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeotiledmap_p_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotiledmappingmanagerengine_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotiledmappingmanagerengine_p.h new file mode 100644 index 0000000..8cda0fe --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotiledmappingmanagerengine_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeotiledmappingmanagerengine_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotiledmappingmanagerengine_p_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotiledmappingmanagerengine_p_p.h new file mode 100644 index 0000000..1ad7d38 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotiledmappingmanagerengine_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeotiledmappingmanagerengine_p_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotiledmapreply_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotiledmapreply_p.h new file mode 100644 index 0000000..90e0c73 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotiledmapreply_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeotiledmapreply_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotiledmapreply_p_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotiledmapreply_p_p.h new file mode 100644 index 0000000..6563bf2 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotiledmapreply_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeotiledmapreply_p_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotilefetcher_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotilefetcher_p.h new file mode 100644 index 0000000..5e921b5 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotilefetcher_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeotilefetcher_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotilefetcher_p_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotilefetcher_p_p.h new file mode 100644 index 0000000..c183b71 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotilefetcher_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeotilefetcher_p_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotilerequestmanager_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotilerequestmanager_p.h new file mode 100644 index 0000000..8872823 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotilerequestmanager_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeotilerequestmanager_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotilespec_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotilespec_p.h new file mode 100644 index 0000000..7737cc7 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotilespec_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeotilespec_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotilespec_p_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotilespec_p_p.h new file mode 100644 index 0000000..8f318b6 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qgeotilespec_p_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/maps/qgeotilespec_p_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplace_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplace_p.h new file mode 100644 index 0000000..1aabde7 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplace_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplace_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplaceattribute_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplaceattribute_p.h new file mode 100644 index 0000000..ce8bd7c --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplaceattribute_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplaceattribute_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacecategory_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacecategory_p.h new file mode 100644 index 0000000..ed94a62 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacecategory_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplacecategory_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacecontactdetail_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacecontactdetail_p.h new file mode 100644 index 0000000..c8833e9 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacecontactdetail_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplacecontactdetail_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacecontent_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacecontent_p.h new file mode 100644 index 0000000..4ccd7c8 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacecontent_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplacecontent_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacecontentrequest_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacecontentrequest_p.h new file mode 100644 index 0000000..64ca72d --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacecontentrequest_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplacecontentrequest_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplaceeditorial_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplaceeditorial_p.h new file mode 100644 index 0000000..c4caf2e --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplaceeditorial_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplaceeditorial_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplaceicon_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplaceicon_p.h new file mode 100644 index 0000000..37a951d --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplaceicon_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplaceicon_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplaceimage_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplaceimage_p.h new file mode 100644 index 0000000..9de1983 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplaceimage_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplaceimage_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacemanagerengine_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacemanagerengine_p.h new file mode 100644 index 0000000..2e1be79 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacemanagerengine_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplacemanagerengine_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplaceproposedsearchresult_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplaceproposedsearchresult_p.h new file mode 100644 index 0000000..b9e81b0 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplaceproposedsearchresult_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplaceproposedsearchresult_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplaceratings_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplaceratings_p.h new file mode 100644 index 0000000..3904253 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplaceratings_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplaceratings_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacereply_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacereply_p.h new file mode 100644 index 0000000..fb0e273 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacereply_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplacereply_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplaceresult_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplaceresult_p.h new file mode 100644 index 0000000..94132fe --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplaceresult_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplaceresult_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacereview_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacereview_p.h new file mode 100644 index 0000000..94552a3 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacereview_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplacereview_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacesearchresult_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacesearchresult_p.h new file mode 100644 index 0000000..1b7404e --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacesearchresult_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplacesearchresult_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacesupplier_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacesupplier_p.h new file mode 100644 index 0000000..718cc74 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplacesupplier_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplacesupplier_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplaceuser_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplaceuser_p.h new file mode 100644 index 0000000..0dc4089 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/qplaceuser_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/qplaceuser_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/unsupportedreplies_p.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/unsupportedreplies_p.h new file mode 100644 index 0000000..396fcf9 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/5.5.1/QtLocation/private/unsupportedreplies_p.h @@ -0,0 +1 @@ +#include "../../../../../src/location/places/unsupportedreplies_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoCodeReply b/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoCodeReply new file mode 100644 index 0000000..14193f8 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoCodeReply @@ -0,0 +1 @@ +#include "qgeocodereply.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoCodingManager b/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoCodingManager new file mode 100644 index 0000000..ed7d721 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoCodingManager @@ -0,0 +1 @@ +#include "qgeocodingmanager.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoCodingManagerEngine b/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoCodingManagerEngine new file mode 100644 index 0000000..69303d2 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoCodingManagerEngine @@ -0,0 +1 @@ +#include "qgeocodingmanagerengine.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoManeuver b/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoManeuver new file mode 100644 index 0000000..a3ff6a5 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoManeuver @@ -0,0 +1 @@ +#include "qgeomaneuver.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoRoute b/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoRoute new file mode 100644 index 0000000..fd6690a --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoRoute @@ -0,0 +1 @@ +#include "qgeoroute.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoRouteReply b/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoRouteReply new file mode 100644 index 0000000..6109d67 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoRouteReply @@ -0,0 +1 @@ +#include "qgeoroutereply.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoRouteRequest b/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoRouteRequest new file mode 100644 index 0000000..221969b --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoRouteRequest @@ -0,0 +1 @@ +#include "qgeorouterequest.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoRouteSegment b/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoRouteSegment new file mode 100644 index 0000000..74590d6 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoRouteSegment @@ -0,0 +1 @@ +#include "qgeoroutesegment.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoRoutingManager b/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoRoutingManager new file mode 100644 index 0000000..76e5224 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoRoutingManager @@ -0,0 +1 @@ +#include "qgeoroutingmanager.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoRoutingManagerEngine b/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoRoutingManagerEngine new file mode 100644 index 0000000..300a668 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoRoutingManagerEngine @@ -0,0 +1 @@ +#include "qgeoroutingmanagerengine.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoServiceProvider b/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoServiceProvider new file mode 100644 index 0000000..d5b38bc --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoServiceProvider @@ -0,0 +1 @@ +#include "qgeoserviceprovider.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoServiceProviderFactory b/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoServiceProviderFactory new file mode 100644 index 0000000..9bee8fb --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QGeoServiceProviderFactory @@ -0,0 +1 @@ +#include "qgeoserviceproviderfactory.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QLocation b/src/QtLocationPlugin/qtlocation/include/QtLocation/QLocation new file mode 100644 index 0000000..e433f1e --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QLocation @@ -0,0 +1 @@ +#include "qlocation.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlace b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlace new file mode 100644 index 0000000..51b4bac --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlace @@ -0,0 +1 @@ +#include "qplace.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceAttribute b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceAttribute new file mode 100644 index 0000000..05d36df --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceAttribute @@ -0,0 +1 @@ +#include "qplaceattribute.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceCategory b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceCategory new file mode 100644 index 0000000..959738a --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceCategory @@ -0,0 +1 @@ +#include "qplacecategory.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceContactDetail b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceContactDetail new file mode 100644 index 0000000..4ff2d2d --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceContactDetail @@ -0,0 +1 @@ +#include "qplacecontactdetail.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceContent b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceContent new file mode 100644 index 0000000..7ebb145 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceContent @@ -0,0 +1 @@ +#include "qplacecontent.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceContentReply b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceContentReply new file mode 100644 index 0000000..67fc8a8 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceContentReply @@ -0,0 +1 @@ +#include "qplacecontentreply.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceContentRequest b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceContentRequest new file mode 100644 index 0000000..43459f4 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceContentRequest @@ -0,0 +1 @@ +#include "qplacecontentrequest.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceDetailsReply b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceDetailsReply new file mode 100644 index 0000000..1455310 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceDetailsReply @@ -0,0 +1 @@ +#include "qplacedetailsreply.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceEditorial b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceEditorial new file mode 100644 index 0000000..d1a232a --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceEditorial @@ -0,0 +1 @@ +#include "qplaceeditorial.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceIcon b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceIcon new file mode 100644 index 0000000..fae7a4e --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceIcon @@ -0,0 +1 @@ +#include "qplaceicon.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceIdReply b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceIdReply new file mode 100644 index 0000000..8709b65 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceIdReply @@ -0,0 +1 @@ +#include "qplaceidreply.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceImage b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceImage new file mode 100644 index 0000000..606c306 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceImage @@ -0,0 +1 @@ +#include "qplaceimage.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceManager b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceManager new file mode 100644 index 0000000..7973c48 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceManager @@ -0,0 +1 @@ +#include "qplacemanager.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceManagerEngine b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceManagerEngine new file mode 100644 index 0000000..27f07fc --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceManagerEngine @@ -0,0 +1 @@ +#include "qplacemanagerengine.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceMatchReply b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceMatchReply new file mode 100644 index 0000000..37ffdf2 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceMatchReply @@ -0,0 +1 @@ +#include "qplacematchreply.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceMatchRequest b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceMatchRequest new file mode 100644 index 0000000..ceaeb96 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceMatchRequest @@ -0,0 +1 @@ +#include "qplacematchrequest.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceProposedSearchResult b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceProposedSearchResult new file mode 100644 index 0000000..c43f2a6 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceProposedSearchResult @@ -0,0 +1 @@ +#include "qplaceproposedsearchresult.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceRatings b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceRatings new file mode 100644 index 0000000..4b7f63c --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceRatings @@ -0,0 +1 @@ +#include "qplaceratings.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceReply b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceReply new file mode 100644 index 0000000..f0654b8 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceReply @@ -0,0 +1 @@ +#include "qplacereply.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceResult b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceResult new file mode 100644 index 0000000..4f5c8db --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceResult @@ -0,0 +1 @@ +#include "qplaceresult.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceReview b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceReview new file mode 100644 index 0000000..83cccec --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceReview @@ -0,0 +1 @@ +#include "qplacereview.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceSearchReply b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceSearchReply new file mode 100644 index 0000000..395a61a --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceSearchReply @@ -0,0 +1 @@ +#include "qplacesearchreply.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceSearchRequest b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceSearchRequest new file mode 100644 index 0000000..b247dab --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceSearchRequest @@ -0,0 +1 @@ +#include "qplacesearchrequest.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceSearchResult b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceSearchResult new file mode 100644 index 0000000..2298271 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceSearchResult @@ -0,0 +1 @@ +#include "qplacesearchresult.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceSearchSuggestionReply b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceSearchSuggestionReply new file mode 100644 index 0000000..e7a4f91 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceSearchSuggestionReply @@ -0,0 +1 @@ +#include "qplacesearchsuggestionreply.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceSupplier b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceSupplier new file mode 100644 index 0000000..465b46d --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceSupplier @@ -0,0 +1 @@ +#include "qplacesupplier.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceUser b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceUser new file mode 100644 index 0000000..5acba29 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QPlaceUser @@ -0,0 +1 @@ +#include "qplaceuser.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QtLocation b/src/QtLocationPlugin/qtlocation/include/QtLocation/QtLocation new file mode 100644 index 0000000..897c1aa --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QtLocation @@ -0,0 +1,47 @@ +#ifndef QT_QTLOCATION_MODULE_H +#define QT_QTLOCATION_MODULE_H +#include +#include "qlocation.h" +#include "qlocationglobal.h" +#include "qgeocodereply.h" +#include "qgeocodingmanager.h" +#include "qgeocodingmanagerengine.h" +#include "qgeomaneuver.h" +#include "qgeoroute.h" +#include "qgeoroutereply.h" +#include "qgeorouterequest.h" +#include "qgeoroutesegment.h" +#include "qgeoroutingmanager.h" +#include "qgeoroutingmanagerengine.h" +#include "qgeoserviceprovider.h" +#include "qgeoserviceproviderfactory.h" +#include "placemacro.h" +#include "qplace.h" +#include "qplaceattribute.h" +#include "qplacecategory.h" +#include "qplacecontactdetail.h" +#include "qplacecontent.h" +#include "qplacecontentreply.h" +#include "qplacecontentrequest.h" +#include "qplacedetailsreply.h" +#include "qplaceeditorial.h" +#include "qplaceicon.h" +#include "qplaceidreply.h" +#include "qplaceimage.h" +#include "qplacemanager.h" +#include "qplacemanagerengine.h" +#include "qplacematchreply.h" +#include "qplacematchrequest.h" +#include "qplaceproposedsearchresult.h" +#include "qplaceratings.h" +#include "qplacereply.h" +#include "qplaceresult.h" +#include "qplacereview.h" +#include "qplacesearchreply.h" +#include "qplacesearchrequest.h" +#include "qplacesearchresult.h" +#include "qplacesearchsuggestionreply.h" +#include "qplacesupplier.h" +#include "qplaceuser.h" +#include "qtlocationversion.h" +#endif diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/QtLocationVersion b/src/QtLocationPlugin/qtlocation/include/QtLocation/QtLocationVersion new file mode 100644 index 0000000..8da2499 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/QtLocationVersion @@ -0,0 +1 @@ +#include "qtlocationversion.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/placemacro.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/placemacro.h new file mode 100644 index 0000000..19404ab --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/placemacro.h @@ -0,0 +1 @@ +#include "../../src/location/places/placemacro.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeocodereply.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeocodereply.h new file mode 100644 index 0000000..ba6d712 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeocodereply.h @@ -0,0 +1 @@ +#include "../../src/location/maps/qgeocodereply.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeocodingmanager.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeocodingmanager.h new file mode 100644 index 0000000..7ddf50f --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeocodingmanager.h @@ -0,0 +1 @@ +#include "../../src/location/maps/qgeocodingmanager.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeocodingmanagerengine.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeocodingmanagerengine.h new file mode 100644 index 0000000..18d06ef --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeocodingmanagerengine.h @@ -0,0 +1 @@ +#include "../../src/location/maps/qgeocodingmanagerengine.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeomaneuver.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeomaneuver.h new file mode 100644 index 0000000..72e145b --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeomaneuver.h @@ -0,0 +1 @@ +#include "../../src/location/maps/qgeomaneuver.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeoroute.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeoroute.h new file mode 100644 index 0000000..b0bdf34 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeoroute.h @@ -0,0 +1 @@ +#include "../../src/location/maps/qgeoroute.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeoroutereply.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeoroutereply.h new file mode 100644 index 0000000..34d8e88 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeoroutereply.h @@ -0,0 +1 @@ +#include "../../src/location/maps/qgeoroutereply.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeorouterequest.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeorouterequest.h new file mode 100644 index 0000000..33bf11d --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeorouterequest.h @@ -0,0 +1 @@ +#include "../../src/location/maps/qgeorouterequest.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeoroutesegment.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeoroutesegment.h new file mode 100644 index 0000000..7205732 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeoroutesegment.h @@ -0,0 +1 @@ +#include "../../src/location/maps/qgeoroutesegment.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeoroutingmanager.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeoroutingmanager.h new file mode 100644 index 0000000..8ae46be --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeoroutingmanager.h @@ -0,0 +1 @@ +#include "../../src/location/maps/qgeoroutingmanager.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeoroutingmanagerengine.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeoroutingmanagerengine.h new file mode 100644 index 0000000..4b26f14 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeoroutingmanagerengine.h @@ -0,0 +1 @@ +#include "../../src/location/maps/qgeoroutingmanagerengine.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeoserviceprovider.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeoserviceprovider.h new file mode 100644 index 0000000..4aca205 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeoserviceprovider.h @@ -0,0 +1 @@ +#include "../../src/location/maps/qgeoserviceprovider.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeoserviceproviderfactory.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeoserviceproviderfactory.h new file mode 100644 index 0000000..39a5e4c --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qgeoserviceproviderfactory.h @@ -0,0 +1 @@ +#include "../../src/location/maps/qgeoserviceproviderfactory.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qlocation.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qlocation.h new file mode 100644 index 0000000..4c266a1 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qlocation.h @@ -0,0 +1 @@ +#include "../../src/location/qlocation.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qlocationglobal.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qlocationglobal.h new file mode 100644 index 0000000..9959740 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qlocationglobal.h @@ -0,0 +1 @@ +#include "../../src/location/qlocationglobal.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplace.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplace.h new file mode 100644 index 0000000..7ce3cf4 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplace.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplace.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceattribute.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceattribute.h new file mode 100644 index 0000000..9ade0c5 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceattribute.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplaceattribute.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacecategory.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacecategory.h new file mode 100644 index 0000000..310d15c --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacecategory.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacecategory.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacecontactdetail.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacecontactdetail.h new file mode 100644 index 0000000..179040c --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacecontactdetail.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacecontactdetail.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacecontent.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacecontent.h new file mode 100644 index 0000000..675d5ee --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacecontent.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacecontent.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacecontentreply.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacecontentreply.h new file mode 100644 index 0000000..3129a8f --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacecontentreply.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacecontentreply.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacecontentrequest.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacecontentrequest.h new file mode 100644 index 0000000..1578507 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacecontentrequest.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacecontentrequest.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacedetailsreply.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacedetailsreply.h new file mode 100644 index 0000000..586e16a --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacedetailsreply.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacedetailsreply.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceeditorial.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceeditorial.h new file mode 100644 index 0000000..9dac346 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceeditorial.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplaceeditorial.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceicon.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceicon.h new file mode 100644 index 0000000..558ac04 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceicon.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplaceicon.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceidreply.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceidreply.h new file mode 100644 index 0000000..8d19185 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceidreply.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplaceidreply.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceimage.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceimage.h new file mode 100644 index 0000000..856deb1 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceimage.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplaceimage.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacemanager.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacemanager.h new file mode 100644 index 0000000..689e043 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacemanager.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacemanager.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacemanagerengine.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacemanagerengine.h new file mode 100644 index 0000000..8966e6d --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacemanagerengine.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacemanagerengine.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacematchreply.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacematchreply.h new file mode 100644 index 0000000..123bd8f --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacematchreply.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacematchreply.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacematchrequest.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacematchrequest.h new file mode 100644 index 0000000..bca1b69 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacematchrequest.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacematchrequest.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceproposedsearchresult.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceproposedsearchresult.h new file mode 100644 index 0000000..9a609b4 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceproposedsearchresult.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplaceproposedsearchresult.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceratings.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceratings.h new file mode 100644 index 0000000..dc6ad10 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceratings.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplaceratings.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacereply.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacereply.h new file mode 100644 index 0000000..96a2fef --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacereply.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacereply.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceresult.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceresult.h new file mode 100644 index 0000000..48e4bed --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceresult.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplaceresult.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacereview.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacereview.h new file mode 100644 index 0000000..19273d9 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacereview.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacereview.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacesearchreply.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacesearchreply.h new file mode 100644 index 0000000..5e45879 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacesearchreply.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacesearchreply.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacesearchrequest.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacesearchrequest.h new file mode 100644 index 0000000..794ac51 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacesearchrequest.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacesearchrequest.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacesearchresult.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacesearchresult.h new file mode 100644 index 0000000..102d1e8 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacesearchresult.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacesearchresult.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacesearchsuggestionreply.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacesearchsuggestionreply.h new file mode 100644 index 0000000..72cdc6a --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacesearchsuggestionreply.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacesearchsuggestionreply.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacesupplier.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacesupplier.h new file mode 100644 index 0000000..071102d --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplacesupplier.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplacesupplier.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceuser.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceuser.h new file mode 100644 index 0000000..88d3b28 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qplaceuser.h @@ -0,0 +1 @@ +#include "../../src/location/places/qplaceuser.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtLocation/qtlocationversion.h b/src/QtLocationPlugin/qtlocation/include/QtLocation/qtlocationversion.h new file mode 100644 index 0000000..9a2b1c8 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtLocation/qtlocationversion.h @@ -0,0 +1,9 @@ +/* This file was generated by syncqt. */ +#ifndef QT_QTLOCATION_VERSION_H +#define QT_QTLOCATION_VERSION_H + +#define QTLOCATION_VERSION_STR "5.5.1" + +#define QTLOCATION_VERSION 0x050501 + +#endif // QT_QTLOCATION_VERSION_H diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qdeclarativegeoaddress_p.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qdeclarativegeoaddress_p.h new file mode 100644 index 0000000..56562a7 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qdeclarativegeoaddress_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qdeclarativegeoaddress_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qdeclarativegeolocation_p.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qdeclarativegeolocation_p.h new file mode 100644 index 0000000..ce5bbf3 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qdeclarativegeolocation_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qdeclarativegeolocation_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qdoublevector2d_p.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qdoublevector2d_p.h new file mode 100644 index 0000000..a679f2f --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qdoublevector2d_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qdoublevector2d_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qdoublevector3d_p.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qdoublevector3d_p.h new file mode 100644 index 0000000..6b1a13c --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qdoublevector3d_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qdoublevector3d_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qgeoaddress_p.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qgeoaddress_p.h new file mode 100644 index 0000000..b494007 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qgeoaddress_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qgeoaddress_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qgeocircle_p.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qgeocircle_p.h new file mode 100644 index 0000000..80a2f05 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qgeocircle_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qgeocircle_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qgeocoordinate_p.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qgeocoordinate_p.h new file mode 100644 index 0000000..53b5c3b --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qgeocoordinate_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qgeocoordinate_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qgeolocation_p.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qgeolocation_p.h new file mode 100644 index 0000000..15bd5a1 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qgeolocation_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qgeolocation_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qgeopositioninfosource_p.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qgeopositioninfosource_p.h new file mode 100644 index 0000000..a43d355 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qgeopositioninfosource_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qgeopositioninfosource_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qgeoprojection_p.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qgeoprojection_p.h new file mode 100644 index 0000000..d055679 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qgeoprojection_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qgeoprojection_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qgeorectangle_p.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qgeorectangle_p.h new file mode 100644 index 0000000..e4d2ac1 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qgeorectangle_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qgeorectangle_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qgeoshape_p.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qgeoshape_p.h new file mode 100644 index 0000000..ef4a35e --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qgeoshape_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qgeoshape_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qlocationutils_p.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qlocationutils_p.h new file mode 100644 index 0000000..0c3d9cd --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qlocationutils_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qlocationutils_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qnmeapositioninfosource_p.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qnmeapositioninfosource_p.h new file mode 100644 index 0000000..2fd5904 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/5.5.1/QtPositioning/private/qnmeapositioninfosource_p.h @@ -0,0 +1 @@ +#include "../../../../../src/positioning/qnmeapositioninfosource_p.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoAddress b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoAddress new file mode 100644 index 0000000..708bcab --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoAddress @@ -0,0 +1 @@ +#include "qgeoaddress.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoAreaMonitorInfo b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoAreaMonitorInfo new file mode 100644 index 0000000..7e137e6 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoAreaMonitorInfo @@ -0,0 +1 @@ +#include "qgeoareamonitorinfo.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoAreaMonitorSource b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoAreaMonitorSource new file mode 100644 index 0000000..942ccf6 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoAreaMonitorSource @@ -0,0 +1 @@ +#include "qgeoareamonitorsource.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoCircle b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoCircle new file mode 100644 index 0000000..b77d827 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoCircle @@ -0,0 +1 @@ +#include "qgeocircle.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoCoordinate b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoCoordinate new file mode 100644 index 0000000..812fb2a --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoCoordinate @@ -0,0 +1 @@ +#include "qgeocoordinate.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoLocation b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoLocation new file mode 100644 index 0000000..bd38c75 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoLocation @@ -0,0 +1 @@ +#include "qgeolocation.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoPositionInfo b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoPositionInfo new file mode 100644 index 0000000..d6feec9 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoPositionInfo @@ -0,0 +1 @@ +#include "qgeopositioninfo.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoPositionInfoSource b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoPositionInfoSource new file mode 100644 index 0000000..b7cc338 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoPositionInfoSource @@ -0,0 +1 @@ +#include "qgeopositioninfosource.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoPositionInfoSourceFactory b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoPositionInfoSourceFactory new file mode 100644 index 0000000..7448436 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoPositionInfoSourceFactory @@ -0,0 +1 @@ +#include "qgeopositioninfosourcefactory.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoRectangle b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoRectangle new file mode 100644 index 0000000..9a7d48f --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoRectangle @@ -0,0 +1 @@ +#include "qgeorectangle.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoSatelliteInfo b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoSatelliteInfo new file mode 100644 index 0000000..a3fd47d --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoSatelliteInfo @@ -0,0 +1 @@ +#include "qgeosatelliteinfo.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoSatelliteInfoSource b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoSatelliteInfoSource new file mode 100644 index 0000000..cc6ba9d --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoSatelliteInfoSource @@ -0,0 +1 @@ +#include "qgeosatelliteinfosource.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoShape b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoShape new file mode 100644 index 0000000..d86ddc3 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QGeoShape @@ -0,0 +1 @@ +#include "qgeoshape.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/QNmeaPositionInfoSource b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QNmeaPositionInfoSource new file mode 100644 index 0000000..5c261c9 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QNmeaPositionInfoSource @@ -0,0 +1 @@ +#include "qnmeapositioninfosource.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/QtPositioning b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QtPositioning new file mode 100644 index 0000000..90f0720 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QtPositioning @@ -0,0 +1,20 @@ +#ifndef QT_QTPOSITIONING_MODULE_H +#define QT_QTPOSITIONING_MODULE_H +#include +#include "qgeoaddress.h" +#include "qgeoareamonitorinfo.h" +#include "qgeoareamonitorsource.h" +#include "qgeocircle.h" +#include "qgeocoordinate.h" +#include "qgeolocation.h" +#include "qgeopositioninfo.h" +#include "qgeopositioninfosource.h" +#include "qgeopositioninfosourcefactory.h" +#include "qgeorectangle.h" +#include "qgeosatelliteinfo.h" +#include "qgeosatelliteinfosource.h" +#include "qgeoshape.h" +#include "qnmeapositioninfosource.h" +#include "qpositioningglobal.h" +#include "qtpositioningversion.h" +#endif diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/QtPositioningVersion b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QtPositioningVersion new file mode 100644 index 0000000..2f99398 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/QtPositioningVersion @@ -0,0 +1 @@ +#include "qtpositioningversion.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeoaddress.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeoaddress.h new file mode 100644 index 0000000..b8e0a99 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeoaddress.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeoaddress.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeoareamonitorinfo.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeoareamonitorinfo.h new file mode 100644 index 0000000..f9a334c --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeoareamonitorinfo.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeoareamonitorinfo.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeoareamonitorsource.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeoareamonitorsource.h new file mode 100644 index 0000000..4555de8 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeoareamonitorsource.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeoareamonitorsource.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeocircle.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeocircle.h new file mode 100644 index 0000000..f598c2c --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeocircle.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeocircle.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeocoordinate.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeocoordinate.h new file mode 100644 index 0000000..93b16d9 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeocoordinate.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeocoordinate.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeolocation.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeolocation.h new file mode 100644 index 0000000..59429ea --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeolocation.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeolocation.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeopositioninfo.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeopositioninfo.h new file mode 100644 index 0000000..213fbb2 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeopositioninfo.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeopositioninfo.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeopositioninfosource.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeopositioninfosource.h new file mode 100644 index 0000000..8f7082d --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeopositioninfosource.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeopositioninfosource.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeopositioninfosourcefactory.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeopositioninfosourcefactory.h new file mode 100644 index 0000000..e59bdd9 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeopositioninfosourcefactory.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeopositioninfosourcefactory.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeorectangle.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeorectangle.h new file mode 100644 index 0000000..f4a6526 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeorectangle.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeorectangle.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeosatelliteinfo.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeosatelliteinfo.h new file mode 100644 index 0000000..1c1d631 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeosatelliteinfo.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeosatelliteinfo.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeosatelliteinfosource.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeosatelliteinfosource.h new file mode 100644 index 0000000..a3115b1 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeosatelliteinfosource.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeosatelliteinfosource.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeoshape.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeoshape.h new file mode 100644 index 0000000..6e7d4db --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qgeoshape.h @@ -0,0 +1 @@ +#include "../../src/positioning/qgeoshape.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/qnmeapositioninfosource.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qnmeapositioninfosource.h new file mode 100644 index 0000000..6f5d63d --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qnmeapositioninfosource.h @@ -0,0 +1 @@ +#include "../../src/positioning/qnmeapositioninfosource.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/qpositioningglobal.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qpositioningglobal.h new file mode 100644 index 0000000..a291214 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qpositioningglobal.h @@ -0,0 +1 @@ +#include "../../src/positioning/qpositioningglobal.h" diff --git a/src/QtLocationPlugin/qtlocation/include/QtPositioning/qtpositioningversion.h b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qtpositioningversion.h new file mode 100644 index 0000000..a177db2 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/include/QtPositioning/qtpositioningversion.h @@ -0,0 +1,9 @@ +/* This file was generated by syncqt. */ +#ifndef QT_QTPOSITIONING_VERSION_H +#define QT_QTPOSITIONING_VERSION_H + +#define QTPOSITIONING_VERSION_STR "5.5.1" + +#define QTPOSITIONING_VERSION 0x050501 + +#endif // QT_QTPOSITIONING_VERSION_H diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/maps.pri b/src/QtLocationPlugin/qtlocation/src/location/maps/maps.pri new file mode 100644 index 0000000..43e0f74 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/maps.pri @@ -0,0 +1,89 @@ + +INCLUDEPATH += maps + +QT += gui quick + +PUBLIC_HEADERS += \ + maps/qgeocodereply.h \ + maps/qgeocodingmanagerengine.h \ + maps/qgeocodingmanager.h \ + maps/qgeomaneuver.h \ + maps/qgeoroute.h \ + maps/qgeoroutereply.h \ + maps/qgeorouterequest.h \ + maps/qgeoroutesegment.h \ + maps/qgeoroutingmanagerengine.h \ + maps/qgeoroutingmanager.h \ + maps/qgeoserviceproviderfactory.h \ + maps/qgeoserviceprovider.h + +PRIVATE_HEADERS += \ + maps/qgeocameracapabilities_p.h \ + maps/qgeocameradata_p.h \ + maps/qgeocameratiles_p.h \ + maps/qgeocodereply_p.h \ + maps/qgeocodingmanagerengine_p.h \ + maps/qgeocodingmanager_p.h \ + maps/qgeomaneuver_p.h \ + maps/qgeomapcontroller_p.h \ + maps/qgeomapscene_p.h \ + maps/qgeotilerequestmanager_p.h \ + maps/qgeomap_p.h \ + maps/qgeomap_p_p.h \ + maps/qgeotiledmap_p.h \ + maps/qgeotiledmap_p_p.h \ + maps/qgeotilefetcher_p.h \ + maps/qgeotilefetcher_p_p.h \ + maps/qgeomappingmanager_p.h \ + maps/qgeomappingmanager_p_p.h \ + maps/qgeomappingmanagerengine_p.h \ + maps/qgeomappingmanagerengine_p_p.h \ + maps/qgeotiledmappingmanagerengine_p.h \ + maps/qgeotiledmappingmanagerengine_p_p.h \ + maps/qgeomaptype_p.h \ + maps/qgeomaptype_p_p.h \ + maps/qgeoroute_p.h \ + maps/qgeoroutereply_p.h \ + maps/qgeorouterequest_p.h \ + maps/qgeoroutesegment_p.h \ + maps/qgeoroutingmanagerengine_p.h \ + maps/qgeoroutingmanager_p.h \ + maps/qgeoserviceprovider_p.h \ + maps/qgeotilecache_p.h \ + maps/qgeotiledmapreply_p.h \ + maps/qgeotiledmapreply_p_p.h \ + maps/qgeotilespec_p.h \ + maps/qgeotilespec_p_p.h \ + maps/qcache3q_p.h + +SOURCES += \ + maps/qgeocameracapabilities.cpp \ + maps/qgeocameradata.cpp \ + maps/qgeocameratiles.cpp \ + maps/qgeocodereply.cpp \ + maps/qgeocodingmanager.cpp \ + maps/qgeocodingmanagerengine.cpp \ + maps/qgeomaneuver.cpp \ + maps/qgeomapcontroller.cpp \ + maps/qgeomapscene.cpp \ + maps/qgeotilerequestmanager.cpp \ + maps/qgeomap.cpp \ + maps/qgeomappingmanager.cpp \ + maps/qgeomappingmanagerengine.cpp \ + maps/qgeotiledmappingmanagerengine.cpp \ + maps/qgeotilefetcher.cpp \ + maps/qgeomaptype.cpp \ + maps/qgeoroute.cpp \ + maps/qgeoroutereply.cpp \ + maps/qgeorouterequest.cpp \ + maps/qgeoroutesegment.cpp \ + maps/qgeoroutingmanager.cpp \ + maps/qgeoroutingmanagerengine.cpp \ + maps/qgeoserviceprovider.cpp \ + maps/qgeoserviceproviderfactory.cpp \ + maps/qgeotilecache.cpp \ + maps/qgeotiledmapreply.cpp \ + maps/qgeotilespec.cpp \ + maps/qgeotiledmap.cpp + + diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qcache3q_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qcache3q_p.h new file mode 100644 index 0000000..debce5d --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qcache3q_p.h @@ -0,0 +1,471 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QCACHE3Q_H +#define QCACHE3Q_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +template +class QCache3QDefaultEvictionPolicy +{ +protected: + /* called just before a key/value pair is about to be _evicted_ */ + void aboutToBeEvicted(const Key &key, QSharedPointer obj); + /* called just before a key/value pair is about to be removed, by + * clear(), remove() or by the destructor (which calls clear) */ + void aboutToBeRemoved(const Key &key, QSharedPointer obj); +}; + +template +void QCache3QDefaultEvictionPolicy::aboutToBeEvicted(const Key &key, QSharedPointer obj) +{ + Q_UNUSED(key); + Q_UNUSED(obj); +} + +template +void QCache3QDefaultEvictionPolicy::aboutToBeRemoved(const Key &key, QSharedPointer obj) +{ + Q_UNUSED(key); + Q_UNUSED(obj); +} + +/* + * QCache3Q + * + * A cache template class for managing QSharedPointers to objects with an + * associated key. It's a lot like QCache, but uses an alternative algorithm + * '3Q' -- which is the '2Q' algorithm plus an extra queue for previously popular + * but evicted nodes, and a 'ghost' list of recent evictions to make a better + * placement choice if they are requested again. + * + * New nodes enter the cache on the "newbies" queue, which is evicted LRA + * (least-recently-added). If a newbie is popular enough (it has been requested + * more than promoteAt times), it will be promoted to a "regular". Regulars + * are evicted LRU (least-recently-used). If a regular is under consideration + * for eviction, its popularity is compared to the mean popularity of the whole + * regulars queue. If it is greater, it is instead moved to the "hobos" queue. + * The "hobos" queue is also evicted LRU, but has a maximum size constraint + * so eviction from it is less likely than from the regulars. + * + * Tweakables: + * * maxCost = maximum total cost for the whole cache + * * minRecent = minimum size that q1 ("newbies") has to be before eviction + * from it takes place + * * maxOldPopular = maximum size that q3 ("hobos") can reach before eviction + * from it takes place + * * promoteAt = minimum popularity necessary to promote a node from + * "newbie" to "regular" + */ +template > +class QCache3Q : public EvPolicy +{ +private: + class Queue; + class Node + { + public: + inline explicit Node() : q(0), n(0), p(0), pop(0), cost(0) {} + + Queue *q; + Node *n; + Node *p; + Key k; + QSharedPointer v; + quint64 pop; // popularity, incremented each ping + int cost; + }; + + class Queue + { + public: + inline explicit Queue() : f(0), l(0), cost(0), pop(0), size(0) {} + + Node *f; + Node *l; + int cost; // total cost of nodes on the queue + quint64 pop; // sum of popularity values on the queue + int size; // size of the queue + }; + + Queue *q1_; // "newbies": seen only once, evicted LRA (least-recently-added) + Queue *q2_; // regular nodes, promoted from newbies, evicted LRU + Queue *q3_; // "hobos": evicted from q2 but were very popular (above mean) + Queue *q1_evicted_; // ghosts of recently evicted newbies and regulars + QHash lookup_; + +public: + explicit QCache3Q(int maxCost = 100, int minRecent = -1, int maxOldPopular = -1); + inline ~QCache3Q() { clear(); delete q1_; delete q2_; delete q3_; delete q1_evicted_; } + + inline int maxCost() const { return maxCost_; } + void setMaxCost(int maxCost, int minRecent = -1, int maxOldPopular = -1); + + inline int promoteAt() const { return promote_; } + inline void setPromoteAt(int p) { promote_ = p; } + + inline int totalCost() const { return q1_->cost + q2_->cost + q3_->cost; } + + void clear(); + bool insert(const Key &key, QSharedPointer object, int cost = 1); + QSharedPointer object(const Key &key) const; + QSharedPointer operator[](const Key &key) const; + + void remove(const Key &key); + + void printStats(); + + // Copy data directly into a queue. Designed for single use after construction + void deserializeQueue(int queueNumber, const QList &keys, + const QList > &values, const QList &costs); + // Copy data from specific queue into list + void serializeQueue(int queueNumber, QList > &buffer); + +private: + int maxCost_, minRecent_, maxOldPopular_; + int hitCount_, missCount_, promote_; + + void rebalance(); + void unlink(Node *n); + void link_front(Node *n, Queue *q); + +private: + // make these private so they can't be used + inline QCache3Q(const QCache3Q &) {} + inline QCache3Q &operator=(const QCache3Q &) {} +}; + +template +void QCache3Q::printStats() +{ + qDebug("\n=== cache %p ===", this); + qDebug("hits: %d (%.2f%%)\tmisses: %d\tfill: %.2f%%", hitCount_, + 100.0 * float(hitCount_) / (float(hitCount_ + missCount_)), + missCount_, + 100.0 * float(totalCost()) / float(maxCost())); + qDebug("q1g: size=%d, pop=%llu", q1_evicted_->size, q1_evicted_->pop); + qDebug("q1: cost=%d, size=%d, pop=%llu", q1_->cost, q1_->size, q1_->pop); + qDebug("q2: cost=%d, size=%d, pop=%llu", q2_->cost, q2_->size, q2_->pop); + qDebug("q3: cost=%d, size=%d, pop=%llu", q3_->cost, q3_->size, q3_->pop); +} + +template +QCache3Q::QCache3Q(int maxCost, int minRecent, int maxOldPopular) + : q1_(new Queue), q2_(new Queue), q3_(new Queue), q1_evicted_(new Queue), + maxCost_(maxCost), minRecent_(minRecent), maxOldPopular_(maxOldPopular), + hitCount_(0), missCount_(0), promote_(0) +{ + if (minRecent_ < 0) + minRecent_ = maxCost_ / 3; + if (maxOldPopular_ < 0) + maxOldPopular_ = maxCost_ / 5; +} + +template +void QCache3Q::serializeQueue(int queueNumber, QList > &buffer) +{ + Q_ASSERT(queueNumber >= 1 && queueNumber <= 4); + Queue *queue = queueNumber == 1 ? q1_ : + queueNumber == 2 ? q2_ : + queueNumber == 3 ? q3_ : + q1_evicted_; + for (Node *node = queue->f; node; node = node->n) + buffer.append(node->v); +} + +template +void QCache3Q::deserializeQueue(int queueNumber, const QList &keys, + const QList > &values, const QList &costs) +{ + Q_ASSERT(queueNumber >= 1 && queueNumber <= 4); + int bufferSize = keys.size(); + if (bufferSize == 0) + return; + clear(); + Queue *queue = queueNumber == 1 ? q1_ : + queueNumber == 2 ? q2_ : + queueNumber == 3 ? q3_ : + q1_evicted_; + for (int i = 0; iv = values[i]; + node->k = keys[i]; + node->cost = costs[i]; + link_front(node, queue); + lookup_[keys[i]] = node; + } +} + + +template +inline void QCache3Q::setMaxCost(int maxCost, int minRecent, int maxOldPopular) +{ + maxCost_ = maxCost; + minRecent_ = minRecent; + maxOldPopular_ = maxOldPopular; + if (minRecent_ < 0) + minRecent_ = maxCost_ / 3; + if (maxOldPopular_ < 0) + maxOldPopular_ = maxCost_ / 5; + rebalance(); +} + +template +bool QCache3Q::insert(const Key &key, QSharedPointer object, int cost) +{ + if (cost > maxCost_) { + return false; + } + + if (lookup_.contains(key)) { + Node *n = lookup_[key]; + n->v = object; + n->q->cost -= n->cost; + n->cost = cost; + n->q->cost += cost; + + if (n->q == q1_evicted_) { + if (n->pop > (uint)promote_) { + unlink(n); + link_front(n, q2_); + rebalance(); + } + } else if (n->q != q1_) { + Queue *q = n->q; + unlink(n); + link_front(n, q); + rebalance(); + } + + return true; + } + + Node *n = new Node; + n->v = object; + n->k = key; + n->cost = cost; + link_front(n, q1_); + lookup_[key] = n; + + rebalance(); + + return true; +} + +template +void QCache3Q::clear() +{ + while (q1_evicted_->f) { + Node *n = q1_evicted_->f; + unlink(n); + delete n; + } + + while (q1_->f) { + Node *n = q1_->f; + unlink(n); + EvPolicy::aboutToBeRemoved(n->k, n->v); + delete n; + } + + while (q2_->f) { + Node *n = q2_->f; + unlink(n); + EvPolicy::aboutToBeRemoved(n->k, n->v); + delete n; + } + + while (q3_->f) { + Node *n = q3_->f; + unlink(n); + EvPolicy::aboutToBeRemoved(n->k, n->v); + delete n; + } + + lookup_.clear(); +} + +template +void QCache3Q::unlink(Node *n) +{ + if (n->n) + n->n->p = n->p; + if (n->p) + n->p->n = n->n; + if (n->q->f == n) + n->q->f = n->n; + if (n->q->l == n) + n->q->l = n->p; + n->n = 0; + n->p = 0; + n->q->pop -= n->pop; + n->q->cost -= n->cost; + n->q->size--; + n->q = 0; +} + +template +void QCache3Q::link_front(Node *n, Queue *q) +{ + n->n = q->f; + n->p = 0; + n->q = q; + if (q->f) + q->f->p = n; + q->f = n; + if (!q->l) + q->l = n; + + q->pop += n->pop; + q->cost += n->cost; + q->size++; +} + +template +void QCache3Q::rebalance() +{ + while (q1_evicted_->size > (q1_->size + q2_->size + q3_->size) * 4) { + Node *n = q1_evicted_->l; + unlink(n); + lookup_.remove(n->k); + delete n; + } + + while ((q1_->cost + q2_->cost + q3_->cost) > maxCost_) { + if (q3_->cost > maxOldPopular_) { + Node *n = q3_->l; + unlink(n); + EvPolicy::aboutToBeEvicted(n->k, n->v); + lookup_.remove(n->k); + delete n; + } else if (q1_->cost > minRecent_) { + Node *n = q1_->l; + unlink(n); + EvPolicy::aboutToBeEvicted(n->k, n->v); + n->v.clear(); + n->cost = 0; + link_front(n, q1_evicted_); + } else { + Node *n = q2_->l; + unlink(n); + if (n->pop > (q2_->pop / q2_->size)) { + link_front(n, q3_); + } else { + EvPolicy::aboutToBeEvicted(n->k, n->v); + n->v.clear(); + n->cost = 0; + link_front(n, q1_evicted_); + } + } + } +} + +template +void QCache3Q::remove(const Key &key) +{ + if (!lookup_.contains(key)) { + return; + } + Node *n = lookup_[key]; + unlink(n); + if (n->q != q1_evicted_) + EvPolicy::aboutToBeRemoved(n->k, n->v); + lookup_.remove(key); + delete n; +} + +template +QSharedPointer QCache3Q::object(const Key &key) const +{ + if (!lookup_.contains(key)) { + const_cast *>(this)->missCount_++; + return QSharedPointer(0); + } + + QCache3Q *me = const_cast *>(this); + + Node *n = me->lookup_[key]; + n->pop++; + n->q->pop++; + + if (n->q == q1_) { + me->hitCount_++; + + if (n->pop > (quint64)promote_) { + me->unlink(n); + me->link_front(n, q2_); + me->rebalance(); + } + } else if (n->q != q1_evicted_) { + me->hitCount_++; + + Queue *q = n->q; + me->unlink(n); + me->link_front(n, q); + me->rebalance(); + } else { + me->missCount_++; + } + + return n->v; +} + +template +inline QSharedPointer QCache3Q::operator[](const Key &key) const +{ + return object(key); +} + +QT_END_NAMESPACE + +#endif // QCACHE3Q_H diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocameracapabilities_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocameracapabilities_p.h new file mode 100644 index 0000000..4e498b1 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocameracapabilities_p.h @@ -0,0 +1,97 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOCAMERACAPABILITIES_P_H +#define QGEOCAMERACAPABILITIES_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include + +#include + +QT_BEGIN_NAMESPACE + +class QGeoCameraCapabilitiesPrivate; + +class Q_LOCATION_EXPORT QGeoCameraCapabilities +{ +public: + QGeoCameraCapabilities(); + QGeoCameraCapabilities(const QGeoCameraCapabilities &other); + ~QGeoCameraCapabilities(); + + QGeoCameraCapabilities &operator = (const QGeoCameraCapabilities &other); + + void setMinimumZoomLevel(double minimumZoomLevel); + double minimumZoomLevel() const; + + void setMaximumZoomLevel(double maximumZoomLevel); + double maximumZoomLevel() const; + + void setSupportsBearing(bool supportsBearing); + bool supportsBearing() const; + + void setSupportsRolling(bool supportsRolling); + bool supportsRolling() const; + + void setSupportsTilting(bool supportsTilting); + bool supportsTilting() const; + + void setMinimumTilt(double minimumTilt); + double minimumTilt() const; + + void setMaximumTilt(double maximumTilt); + double maximumTilt() const; + + bool isValid() const; + +private: + QSharedDataPointer d; +}; + +QT_END_NAMESPACE + +#endif // QGEOCAMERACAPABILITIES_P_H diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocameradata_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocameradata_p.h new file mode 100644 index 0000000..a1434fd --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocameradata_p.h @@ -0,0 +1,98 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QGEOCAMERADATA_P_H +#define QGEOCAMERADATA_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qlocationglobal.h" +#include "qgeocoordinate.h" + +#include + +#include + +#include + +QT_BEGIN_NAMESPACE + +class QGeoCameraDataPrivate; + +class Q_LOCATION_EXPORT QGeoCameraData +{ +public: + QGeoCameraData(); + QGeoCameraData(const QGeoCameraData &other); + ~QGeoCameraData(); + + QGeoCameraData &operator = (const QGeoCameraData &other); + + bool operator == (const QGeoCameraData &other) const; + bool operator != (const QGeoCameraData &other) const; + + void setCenter(const QGeoCoordinate &coordinate); + QGeoCoordinate center() const; + + void setBearing(double bearing); + double bearing() const; + + void setTilt(double tilt); + double tilt() const; + + void setRoll(double roll); + double roll() const; + + void setZoomLevel(double zoomLevel); + double zoomLevel() const; + +private: + QSharedDataPointer d; +}; + +QT_END_NAMESPACE + +Q_DECLARE_METATYPE(QGeoCameraData) + +#endif // QGEOCAMERADATA_P_H diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocameratiles_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocameratiles_p.h new file mode 100644 index 0000000..e326028 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocameratiles_p.h @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QGEOCAMERATILES_P_H +#define QGEOCAMERATILES_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoCameraData; +class QGeoTileSpec; +class QGeoMapType; +class QGeoCameraTilesPrivate; +class QSize; + +class Q_LOCATION_EXPORT QGeoCameraTiles { +public: + QGeoCameraTiles(); + ~QGeoCameraTiles(); + + enum PrefetchStle { PrefetchNeighbourLayer, PrefetchTwoNeighbourLayers}; + + void setCamera(const QGeoCameraData &camera); + void setScreenSize(const QSize &size); + void setTileSize(int tileSize); + void setMaximumZoomLevel(int maxZoom); + + int tileSize() const; + + void setPluginString(const QString &pluginString); + void setMapType(const QGeoMapType &mapType); + void setMapVersion(int mapVersion); + + QSet visibleTiles(); + QSet prefetchTiles(PrefetchStle style); + +protected: + QScopedPointer d_ptr; + Q_DISABLE_COPY(QGeoCameraTiles) +}; + +QT_END_NAMESPACE + +#endif // QGEOCAMERATILES_P_H diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocodereply.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocodereply.h new file mode 100644 index 0000000..f713e42 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocodereply.h @@ -0,0 +1,105 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOCODEREPLY_H +#define QGEOCODEREPLY_H + +#include +#include +#include + +#include + +QT_BEGIN_NAMESPACE + +class QGeoShape; +class QGeoCodeReplyPrivate; + +class Q_LOCATION_EXPORT QGeoCodeReply : public QObject +{ + Q_OBJECT + +public: + enum Error { + NoError, + EngineNotSetError, + CommunicationError, + ParseError, + UnsupportedOptionError, + CombinationError, + UnknownError + }; + + QGeoCodeReply(Error error, const QString &errorString, QObject *parent = 0); + virtual ~QGeoCodeReply(); + + bool isFinished() const; + Error error() const; + QString errorString() const; + + QGeoShape viewport() const; + QList locations() const; + + int limit() const; + int offset() const; + + virtual void abort(); + +Q_SIGNALS: + void finished(); + void error(QGeoCodeReply::Error error, const QString &errorString = QString()); + +protected: + QGeoCodeReply(QObject *parent = 0); + + void setError(Error error, const QString &errorString); + void setFinished(bool finished); + + void setViewport(const QGeoShape &viewport); + void addLocation(const QGeoLocation &location); + void setLocations(const QList &locations); + + void setLimit(int limit); + void setOffset(int offset); + +private: + QGeoCodeReplyPrivate *d_ptr; + Q_DISABLE_COPY(QGeoCodeReply) +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocodereply_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocodereply_p.h new file mode 100644 index 0000000..fefe788 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocodereply_p.h @@ -0,0 +1,83 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOCODEREPLY_P_H +#define QGEOCODEREPLY_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qgeocodereply.h" + +#include "qgeoshape.h" + +#include + +QT_BEGIN_NAMESPACE + +class QGeoLocation; + +class QGeoCodeReplyPrivate +{ +public: + QGeoCodeReplyPrivate(); + QGeoCodeReplyPrivate(QGeoCodeReply::Error error, const QString &errorString); + ~QGeoCodeReplyPrivate(); + + QGeoCodeReply::Error error; + QString errorString; + bool isFinished; + + QGeoShape viewport; + QList locations; + + int limit; + int offset; +private: + Q_DISABLE_COPY(QGeoCodeReplyPrivate) +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocodingmanager.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocodingmanager.h new file mode 100644 index 0000000..b33cda7 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocodingmanager.h @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOCODINGMANAGER_H +#define QGEOCODINGMANAGER_H + +#include +#include + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QLocale; + +class QGeoCodingManagerEngine; +class QGeoCodingManagerPrivate; + +class Q_LOCATION_EXPORT QGeoCodingManager : public QObject +{ + Q_OBJECT +public: + ~QGeoCodingManager(); + + QString managerName() const; + int managerVersion() const; + + QGeoCodeReply *geocode(const QGeoAddress &address, + const QGeoShape &bounds = QGeoShape()); + QGeoCodeReply *geocode(const QString &searchString, + int limit = -1, + int offset = 0, + const QGeoShape &bounds = QGeoShape()); + + QGeoCodeReply *reverseGeocode(const QGeoCoordinate &coordinate, + const QGeoShape &bounds = QGeoShape()); + + void setLocale(const QLocale &locale); + QLocale locale() const; + +Q_SIGNALS: + void finished(QGeoCodeReply *reply); + void error(QGeoCodeReply *reply, QGeoCodeReply::Error error, QString errorString = QString()); + +private: + QGeoCodingManager(QGeoCodingManagerEngine *engine, QObject *parent = 0); + + QGeoCodingManagerPrivate *d_ptr; + Q_DISABLE_COPY(QGeoCodingManager) + + friend class QGeoServiceProvider; + friend class QGeoServiceProviderPrivate; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocodingmanager_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocodingmanager_p.h new file mode 100644 index 0000000..de723ee --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocodingmanager_p.h @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOCODINGMANAGER_P_H +#define QGEOCODINGMANAGER_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qgeocodingmanager.h" + +#include "qgeocodereply.h" + +#include + +QT_BEGIN_NAMESPACE + +class QGeoCodingManagerEngine; + +class QGeoCodingManagerPrivate +{ +public: + QGeoCodingManagerPrivate(); + ~QGeoCodingManagerPrivate(); + + QGeoCodingManagerEngine *engine; + +private: + Q_DISABLE_COPY(QGeoCodingManagerPrivate) +}; + +QT_END_NAMESPACE + +#endif + diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocodingmanagerengine.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocodingmanagerengine.h new file mode 100644 index 0000000..3e91575 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocodingmanagerengine.h @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOCODINGMANAGERENGINE_H +#define QGEOCODINGMANAGERENGINE_H + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoAddress; +class QGeoShape; +class QGeoCodingManagerEnginePrivate; + +class Q_LOCATION_EXPORT QGeoCodingManagerEngine : public QObject +{ + Q_OBJECT +public: + QGeoCodingManagerEngine(const QVariantMap ¶meters, QObject *parent = 0); + virtual ~QGeoCodingManagerEngine(); + + QString managerName() const; + int managerVersion() const; + + virtual QGeoCodeReply *geocode(const QGeoAddress &address, const QGeoShape &bounds); + virtual QGeoCodeReply *geocode(const QString &address, + int limit, + int offset, + const QGeoShape &bounds); + virtual QGeoCodeReply *reverseGeocode(const QGeoCoordinate &coordinate, + const QGeoShape &bounds); + + + void setLocale(const QLocale &locale); + QLocale locale() const; + +Q_SIGNALS: + void finished(QGeoCodeReply *reply); + void error(QGeoCodeReply *reply, QGeoCodeReply::Error error, QString errorString = QString()); + +private: + void setManagerName(const QString &managerName); + void setManagerVersion(int managerVersion); + + QGeoCodingManagerEnginePrivate *d_ptr; + Q_DISABLE_COPY(QGeoCodingManagerEngine) + + friend class QGeoServiceProvider; + friend class QGeoServiceProviderPrivate; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocodingmanagerengine_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocodingmanagerengine_p.h new file mode 100644 index 0000000..b6fcb68 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeocodingmanagerengine_p.h @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOCODINGMANAGERENGINE_P_H +#define QGEOCODINGMANAGERENGINE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qgeocodingmanagerengine.h" + +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoCodingManagerEnginePrivate +{ +public: + QGeoCodingManagerEnginePrivate(); + ~QGeoCodingManagerEnginePrivate(); + + QString managerName; + int managerVersion; + + QLocale locale; + +private: + Q_DISABLE_COPY(QGeoCodingManagerEnginePrivate) +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomaneuver.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomaneuver.h new file mode 100644 index 0000000..9710f8f --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomaneuver.h @@ -0,0 +1,104 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOMANEUVER_H +#define QGEOMANEUVER_H + +#include +#include + +QT_BEGIN_NAMESPACE + +class QString; + +class QGeoCoordinate; +class QGeoManeuverPrivate; + +class Q_LOCATION_EXPORT QGeoManeuver +{ + +public: + enum InstructionDirection { + NoDirection, + DirectionForward, + DirectionBearRight, + DirectionLightRight, + DirectionRight, + DirectionHardRight, + DirectionUTurnRight, + DirectionUTurnLeft, + DirectionHardLeft, + DirectionLeft, + DirectionLightLeft, + DirectionBearLeft + }; + + QGeoManeuver(); + QGeoManeuver(const QGeoManeuver &other); + ~QGeoManeuver(); + + QGeoManeuver &operator= (const QGeoManeuver &other); + + bool operator== (const QGeoManeuver &other) const; + bool operator!= (const QGeoManeuver &other) const; + + bool isValid() const; + + void setPosition(const QGeoCoordinate &position); + QGeoCoordinate position() const; + + void setInstructionText(const QString &instructionText); + QString instructionText() const; + + void setDirection(InstructionDirection direction); + InstructionDirection direction() const; + + void setTimeToNextInstruction(int secs); + int timeToNextInstruction() const; + + void setDistanceToNextInstruction(qreal distance); + qreal distanceToNextInstruction() const; + + void setWaypoint(const QGeoCoordinate &coordinate); + QGeoCoordinate waypoint() const; + +private: + QSharedDataPointer d_ptr; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomaneuver_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomaneuver_p.h new file mode 100644 index 0000000..c048f13 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomaneuver_p.h @@ -0,0 +1,80 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOMANEUVER_P_H +#define QGEOMANEUVER_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qgeomaneuver.h" +#include "qgeocoordinate.h" + +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoManeuverPrivate : public QSharedData +{ +public: + QGeoManeuverPrivate(); + QGeoManeuverPrivate(const QGeoManeuverPrivate &other); + ~QGeoManeuverPrivate(); + + bool operator== (const QGeoManeuverPrivate &other) const; + + bool valid; + QString id; + QGeoCoordinate position; + QString text; + QGeoManeuver::InstructionDirection direction; + int timeToNextInstruction; + qreal distanceToNextInstruction; + QGeoCoordinate waypoint; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomap_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomap_p.h new file mode 100644 index 0000000..9e4d5a0 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomap_p.h @@ -0,0 +1,115 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QGEOMAP_P_H +#define QGEOMAP_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qgeocameradata_p.h" +#include "qgeomaptype_p.h" +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoMappingManagerEngine; +class QGeoMapPrivate; +class QGeoMapController; +class QGeoCameraCapabilities; +class QGeoCoordinate; +class QSGNode; +class QQuickWindow; + +class Q_LOCATION_EXPORT QGeoMap : public QObject +{ + Q_OBJECT + Q_DECLARE_PRIVATE(QGeoMap) + +public: + virtual ~QGeoMap(); + + QGeoMapController *mapController(); + + void resize(int width, int height); + int width() const; + int height() const; + + QGeoCameraData cameraData() const; + + void setActiveMapType(const QGeoMapType mapType); + const QGeoMapType activeMapType() const; + + virtual QGeoCoordinate itemPositionToCoordinate(const QDoubleVector2D &pos, bool clipToViewport = true) const = 0; + virtual QDoubleVector2D coordinateToItemPosition(const QGeoCoordinate &coordinate, bool clipToViewport = true) const = 0; + virtual int mapVersion(); + virtual void prefetchData(); + + QString pluginString(); + QGeoCameraCapabilities cameraCapabilities(); + +protected: + QGeoMap(QGeoMapPrivate &dd, QObject *parent = 0); + void setCameraData(const QGeoCameraData &cameraData); + virtual QSGNode *updateSceneGraph(QSGNode *node, QQuickWindow *window) = 0; + +public Q_SLOTS: + void update(); + +Q_SIGNALS: + void cameraDataChanged(const QGeoCameraData &cameraData); + void updateRequired(); + void activeMapTypeChanged(); + void copyrightsChanged(const QImage ©rightsImage); + void copyrightsChanged(const QString ©rightsHtml); + +private: + Q_DISABLE_COPY(QGeoMap) + friend class QGeoMapController; //setCameraData + friend class QDeclarativeGeoMap; //updateSceneGraph +}; + +QT_END_NAMESPACE + +#endif // QGEOMAP_P_H diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomap_p_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomap_p_p.h new file mode 100644 index 0000000..e7a2306 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomap_p_p.h @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QGEOMAP_P_P_H +#define QGEOMAP_P_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qgeocameradata_p.h" +#include "qgeomaptype_p.h" +#include + + +QT_BEGIN_NAMESPACE + +class QGeoMappingManagerEngine; +class QGeoMap; +class QGeoMapController; + +class QGeoMapPrivate : public QObjectPrivate +{ + Q_DECLARE_PUBLIC(QGeoMap) +public: + QGeoMapPrivate(QGeoMappingManagerEngine *engine); + virtual ~QGeoMapPrivate(); + + void setCameraData(const QGeoCameraData &cameraData); + void resize(int width, int height); + +protected: + virtual void mapResized(int width, int height) = 0; + virtual void changeCameraData(const QGeoCameraData &oldCameraData) = 0; + virtual void changeActiveMapType(const QGeoMapType mapType) = 0; + +protected: + int m_width; + int m_height; + double m_aspectRatio; + QPointer m_engine; + QString m_pluginString; + QGeoMapController *m_controller; + QGeoCameraData m_cameraData; + QGeoMapType m_activeMapType; +}; + +QT_END_NAMESPACE + +#endif // QGEOMAP_P_P_H diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomapcontroller_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomapcontroller_p.h new file mode 100644 index 0000000..06f2b92 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomapcontroller_p.h @@ -0,0 +1,112 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QGEOMAPCONTROLLER_P_H +#define QGEOMAPCONTROLLER_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include + +#include "qgeocoordinate.h" +#include "qgeocameradata_p.h" + +QT_BEGIN_NAMESPACE + +class QGeoMap; + + +class Q_LOCATION_EXPORT QGeoMapController : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QGeoCoordinate center READ center WRITE setCenter NOTIFY centerChanged) + Q_PROPERTY(qreal bearing READ bearing WRITE setBearing NOTIFY bearingChanged) + Q_PROPERTY(qreal tilt READ tilt WRITE setTilt NOTIFY tiltChanged) + Q_PROPERTY(qreal roll READ roll WRITE setRoll NOTIFY rollChanged) + Q_PROPERTY(qreal zoom READ zoom WRITE setZoom NOTIFY zoomChanged) + +public: + QGeoMapController(QGeoMap *map); + ~QGeoMapController(); + + QGeoCoordinate center() const; + void setCenter(const QGeoCoordinate ¢er); + + void setLatitude(qreal latitude); + void setLongitude(qreal longitude); + void setAltitude(qreal altitude); + + qreal bearing() const; + void setBearing(qreal bearing); + + qreal tilt() const; + void setTilt(qreal tilt); + + qreal roll() const; + void setRoll(qreal roll); + + qreal zoom() const; + void setZoom(qreal zoom); + + void pan(qreal dx, qreal dy); + +private Q_SLOTS: + void cameraDataChanged(const QGeoCameraData &cameraData); + +Q_SIGNALS: + void centerChanged(const QGeoCoordinate ¢er); + void bearingChanged(qreal bearing); + void tiltChanged(qreal tilt); + void rollChanged(qreal roll); + void zoomChanged(qreal zoom); + +private: + QGeoMap *map_; + QGeoCameraData oldCameraData_; +}; + +QT_END_NAMESPACE + +#endif // QGEOMAPCONTROLLER_P_H diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomappingmanager_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomappingmanager_p.h new file mode 100644 index 0000000..043ebd8 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomappingmanager_p.h @@ -0,0 +1,106 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOMAPPINGMANAGER_H +#define QGEOMAPPINGMANAGER_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include +#include +#include "qgeomaptype_p.h" + +QT_BEGIN_NAMESPACE + +class QGeoMap; +class QLocale; +class QGeoRectangle; +class QGeoCoordinate; +class QGeoMappingManagerPrivate; +class QGeoMapRequestOptions; +class QGeoMappingManagerEngine; +class QGeoCameraCapabilities; + + +class Q_LOCATION_EXPORT QGeoMappingManager : public QObject +{ + Q_OBJECT + +public: + ~QGeoMappingManager(); + + QString managerName() const; + int managerVersion() const; + + QGeoMap *createMap(QObject *parent); + + QList supportedMapTypes() const; + + bool isInitialized() const; + + QGeoCameraCapabilities cameraCapabilities() const; + + void setLocale(const QLocale &locale); + QLocale locale() const; + +Q_SIGNALS: + void initialized(); + +protected: + QGeoMappingManager(QGeoMappingManagerEngine *engine, QObject *parent = 0); + +private: + QGeoMappingManagerPrivate *d_ptr; + Q_DISABLE_COPY(QGeoMappingManager) + + friend class QGeoServiceProvider; + friend class QGeoServiceProviderPrivate; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomappingmanager_p_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomappingmanager_p_p.h new file mode 100644 index 0000000..65d1b5e --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomappingmanager_p_p.h @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOMAPPINGMANAGER_P_H +#define QGEOMAPPINGMANAGER_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoMappingManagerPrivate +{ +public: + QGeoMappingManagerPrivate(); + ~QGeoMappingManagerPrivate(); + + QGeoMappingManagerEngine *engine; + +private: + Q_DISABLE_COPY(QGeoMappingManagerPrivate) +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomappingmanagerengine_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomappingmanagerengine_p.h new file mode 100644 index 0000000..b9565d8 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomappingmanagerengine_p.h @@ -0,0 +1,125 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOMAPPINGMANAGERENGINE_H +#define QGEOMAPPINGMANAGERENGINE_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "qgeomaptype_p.h" +#include "qgeomappingmanager_p.h" + +QT_BEGIN_NAMESPACE + +class QLocale; + +class QGeoRectangle; +class QGeoCoordinate; +class QGeoMappingManagerPrivate; +class QGeoMapRequestOptions; + +class QGeoMappingManagerEnginePrivate; +class QGeoMap; + +class Q_LOCATION_EXPORT QGeoMappingManagerEngine : public QObject +{ + Q_OBJECT + +public: + explicit QGeoMappingManagerEngine(QObject *parent = 0); + virtual ~QGeoMappingManagerEngine(); + + virtual QGeoMap *createMap() = 0; + virtual void registerMap(QGeoMap *map) = 0; + virtual void deregisterMap(QGeoMap *map) = 0; + + QVariantMap parameters() const; + + QString managerName() const; + int managerVersion() const; + + QList supportedMapTypes() const; + + QGeoCameraCapabilities cameraCapabilities(); + + void setLocale(const QLocale &locale); + QLocale locale() const; + + bool isInitialized() const; + +Q_SIGNALS: + void initialized(); + +protected: + void setSupportedMapTypes(const QList &supportedMapTypes); + void setCameraCapabilities(const QGeoCameraCapabilities &capabilities); + + void engineInitialized(); + +private: + QGeoMappingManagerEnginePrivate *d_ptr; + + void setManagerName(const QString &managerName); + void setManagerVersion(int managerVersion); + + Q_DECLARE_PRIVATE(QGeoMappingManagerEngine) + Q_DISABLE_COPY(QGeoMappingManagerEngine) + + friend class QGeoServiceProvider; + friend class QGeoServiceProviderPrivate; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomappingmanagerengine_p_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomappingmanagerengine_p_p.h new file mode 100644 index 0000000..5442686 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomappingmanagerengine_p_p.h @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOMAPPINGMANAGERENGINE_P_H +#define QGEOMAPPINGMANAGERENGINE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include +#include +#include +#include +#include "qgeomaptype_p.h" +#include "qgeomappingmanager_p.h" +#include "qgeocameracapabilities_p.h" + +QT_BEGIN_NAMESPACE + +class QGeoTileSpec; +class QGeoTiledMapReply; + +class QGeoMappingManagerEnginePrivate +{ +public: + QGeoMappingManagerEnginePrivate(); + ~QGeoMappingManagerEnginePrivate(); + + QString managerName; + int managerVersion; + + QList supportedMapTypes; + QGeoCameraCapabilities capabilities_; + + QLocale locale; + bool initialized; + +private: + Q_DISABLE_COPY(QGeoMappingManagerEnginePrivate) +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomapscene_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomapscene_p.h new file mode 100644 index 0000000..a4a9e4e --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomapscene_p.h @@ -0,0 +1,98 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QGEOMAPSCENE_P_H +#define QGEOMAPSCENE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoCameraData; +class QGeoTileSpec; +class QDoubleVector2D; +class QGeoTileTexture; +class QSGNode; +class QQuickWindow; +class QGeoMapScenePrivate; + +class Q_LOCATION_EXPORT QGeoMapScene : public QObject +{ + Q_OBJECT + Q_DECLARE_PRIVATE(QGeoMapScene) +public: + explicit QGeoMapScene(QObject *parent = 0); + virtual ~QGeoMapScene(); + + void setScreenSize(const QSize &size); + void setTileSize(int tileSize); + void setCameraData(const QGeoCameraData &cameraData); + + void setVisibleTiles(const QSet &tiles); + + void setUseVerticalLock(bool lock); + + void addTile(const QGeoTileSpec &spec, QSharedPointer texture); + + QDoubleVector2D itemPositionToMercator(const QDoubleVector2D &pos) const; + QDoubleVector2D mercatorToItemPosition(const QDoubleVector2D &mercator) const; + + QSGNode *updateSceneGraph(QSGNode *oldNode, QQuickWindow *window); + + bool verticalLock() const; + QSet texturedTiles(); + +Q_SIGNALS: + void newTilesVisible(const QSet &newTiles); + +private: + Q_DISABLE_COPY(QGeoMapScene) +}; + +QT_END_NAMESPACE + +#endif // QGEOMAPSCENE_P_H diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomaptype_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomaptype_p.h new file mode 100644 index 0000000..78c7416 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomaptype_p.h @@ -0,0 +1,101 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOMAPTYPE_H +#define QGEOMAPTYPE_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoMapTypePrivate; + +class Q_LOCATION_EXPORT QGeoMapType +{ +public: + enum MapStyle { + NoMap = 0, + StreetMap, + SatelliteMapDay, + SatelliteMapNight, + TerrainMap, + HybridMap, + TransitMap, + GrayStreetMap, + PedestrianMap, + CarNavigationMap, + CycleMap, + CustomMap = 100 + }; + + QGeoMapType(); + QGeoMapType(const QGeoMapType &other); + QGeoMapType(MapStyle style, const QString &name, const QString &description, bool mobile, + bool night, int mapId); + ~QGeoMapType(); + + QGeoMapType &operator = (const QGeoMapType &other); + + bool operator == (const QGeoMapType &other) const; + bool operator != (const QGeoMapType &other) const; + + MapStyle style() const; + QString name() const; + QString description() const; + bool mobile() const; + bool night() const; + int mapId() const; + +private: + QSharedDataPointer d_ptr; +}; + +QT_END_NAMESPACE + +#endif // QGEOMAPTYPE_H diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomaptype_p_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomaptype_p_p.h new file mode 100644 index 0000000..2aafd37 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeomaptype_p_p.h @@ -0,0 +1,83 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOMAPTYPE_P_H +#define QGEOMAPTYPE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include + +#include "qgeomaptype_p.h" + +QT_BEGIN_NAMESPACE + +class QGeoMapTypePrivate : public QSharedData +{ +public: + QGeoMapTypePrivate(); + QGeoMapTypePrivate(QGeoMapType::MapStyle style, const QString &name, const QString &description, bool mobile, bool night, int mapId); + QGeoMapTypePrivate(const QGeoMapTypePrivate &other); + ~QGeoMapTypePrivate(); + + QGeoMapTypePrivate &operator = (const QGeoMapTypePrivate &other); + + bool operator == (const QGeoMapTypePrivate &other) const; + + QGeoMapType::MapStyle style_; + QString name_; + QString description_; + bool mobile_; + bool night_; + int mapId_; +}; + +QT_END_NAMESPACE + +Q_DECLARE_METATYPE(QGeoMapTypePrivate) + +#endif // QGEOMAPTYPE_P_H diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroute.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroute.h new file mode 100644 index 0000000..68e73c0 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroute.h @@ -0,0 +1,96 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOROUTE_H +#define QGEOROUTE_H + +#include +#include + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoRectangle; +class QGeoRouteSegment; + +class QGeoRoutePrivate; + +class Q_LOCATION_EXPORT QGeoRoute +{ +public: + QGeoRoute(); + QGeoRoute(const QGeoRoute &other); + ~QGeoRoute(); + + QGeoRoute &operator = (const QGeoRoute &other); + + bool operator == (const QGeoRoute &other) const; + bool operator != (const QGeoRoute &other) const; + + void setRouteId(const QString &id); + QString routeId() const; + + void setRequest(const QGeoRouteRequest &request); + QGeoRouteRequest request() const; + + void setBounds(const QGeoRectangle &bounds); + QGeoRectangle bounds() const; + + void setFirstRouteSegment(const QGeoRouteSegment &routeSegment); + QGeoRouteSegment firstRouteSegment() const; + + void setTravelTime(int secs); + int travelTime() const; + + void setDistance(qreal distance); + qreal distance() const; + + void setTravelMode(QGeoRouteRequest::TravelMode mode); + QGeoRouteRequest::TravelMode travelMode() const; + + void setPath(const QList &path); + QList path() const; + +private: + QExplicitlySharedDataPointer d_ptr; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroute_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroute_p.h new file mode 100644 index 0000000..66ef3c6 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroute_p.h @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOROUTE_P_H +#define QGEOROUTE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qgeoroute.h" +#include "qgeorouterequest.h" +#include "qgeorectangle.h" +#include "qgeoroutesegment.h" + +#include + +QT_BEGIN_NAMESPACE + +class QGeoCoordinate; + +class QGeoRoutePrivate : public QSharedData +{ +public: + QGeoRoutePrivate(); + QGeoRoutePrivate(const QGeoRoutePrivate &other); + ~QGeoRoutePrivate(); + + bool operator == (const QGeoRoutePrivate &other) const; + + QString id; + QGeoRouteRequest request; + + QGeoRectangle bounds; +// QList routeSegments; + + int travelTime; + qreal distance; + + QGeoRouteRequest::TravelMode travelMode; + + QList path; + + QGeoRouteSegment firstSegment; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroutereply.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroutereply.h new file mode 100644 index 0000000..52f9133 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroutereply.h @@ -0,0 +1,95 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOROUTEREPLY_H +#define QGEOROUTEREPLY_H + +#include + +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoRouteRequest; +class QGeoRouteReplyPrivate; + +class Q_LOCATION_EXPORT QGeoRouteReply : public QObject +{ + Q_OBJECT +public: + enum Error { + NoError, + EngineNotSetError, + CommunicationError, + ParseError, + UnsupportedOptionError, + UnknownError + }; + + QGeoRouteReply(Error error, const QString &errorString, QObject *parent = 0); + virtual ~QGeoRouteReply(); + + bool isFinished() const; + Error error() const; + QString errorString() const; + + QGeoRouteRequest request() const; + QList routes() const; + + virtual void abort(); + +Q_SIGNALS: + void finished(); + void error(QGeoRouteReply::Error error, const QString &errorString = QString()); + +protected: + QGeoRouteReply(const QGeoRouteRequest &request, QObject *parent = 0); + + void setError(Error error, const QString &errorString); + void setFinished(bool finished); + + void setRoutes(const QList &routes); + void addRoutes(const QList &routes); + +private: + QGeoRouteReplyPrivate *d_ptr; + Q_DISABLE_COPY(QGeoRouteReply) +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroutereply_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroutereply_p.h new file mode 100644 index 0000000..496a616 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroutereply_p.h @@ -0,0 +1,80 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOROUTEREPLY_P_H +#define QGEOROUTEREPLY_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qgeorouterequest.h" +#include "qgeoroutereply.h" + +#include + +QT_BEGIN_NAMESPACE + +class QGeoRoute; + +class QGeoRouteReplyPrivate +{ +public: + explicit QGeoRouteReplyPrivate(const QGeoRouteRequest &request); + QGeoRouteReplyPrivate(QGeoRouteReply::Error error, QString errorString); + ~QGeoRouteReplyPrivate(); + + QGeoRouteReply::Error error; + QString errorString; + bool isFinished; + + QGeoRouteRequest request; + QList routes; + +private: + Q_DISABLE_COPY(QGeoRouteReplyPrivate) +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeorouterequest.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeorouterequest.h new file mode 100644 index 0000000..1692bbb --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeorouterequest.h @@ -0,0 +1,161 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOROUTEREQUEST_H +#define QGEOROUTEREQUEST_H + +#include +#include +#include + +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoRectangle; +class QGeoRouteRequestPrivate; + +class Q_LOCATION_EXPORT QGeoRouteRequest +{ +public: + enum TravelMode { + CarTravel = 0x0001, + PedestrianTravel = 0x0002, + BicycleTravel = 0x0004, + PublicTransitTravel = 0x0008, + TruckTravel = 0x0010 + }; + Q_DECLARE_FLAGS(TravelModes, TravelMode) + + enum FeatureType { + NoFeature = 0x00000000, + TollFeature = 0x00000001, + HighwayFeature = 0x00000002, + PublicTransitFeature = 0x00000004, + FerryFeature = 0x00000008, + TunnelFeature = 0x00000010, + DirtRoadFeature = 0x00000020, + ParksFeature = 0x00000040, + MotorPoolLaneFeature = 0x00000080 + }; + Q_DECLARE_FLAGS(FeatureTypes, FeatureType) + + enum FeatureWeight { + NeutralFeatureWeight = 0x00000000, + PreferFeatureWeight = 0x00000001, + RequireFeatureWeight = 0x00000002, + AvoidFeatureWeight = 0x00000004, + DisallowFeatureWeight = 0x00000008 + }; + Q_DECLARE_FLAGS(FeatureWeights, FeatureWeight) + + enum RouteOptimization { + ShortestRoute = 0x0001, + FastestRoute = 0x0002, + MostEconomicRoute = 0x0004, + MostScenicRoute = 0x0008 + }; + Q_DECLARE_FLAGS(RouteOptimizations, RouteOptimization) + + enum SegmentDetail { + NoSegmentData = 0x0000, + BasicSegmentData = 0x0001 + }; + Q_DECLARE_FLAGS(SegmentDetails, SegmentDetail) + + enum ManeuverDetail { + NoManeuvers = 0x0000, + BasicManeuvers = 0x0001 + }; + Q_DECLARE_FLAGS(ManeuverDetails, ManeuverDetail) + + explicit QGeoRouteRequest(const QList &waypoints = QList()); + QGeoRouteRequest(const QGeoCoordinate &origin, + const QGeoCoordinate &destination); + QGeoRouteRequest(const QGeoRouteRequest &other); + + ~QGeoRouteRequest(); + + QGeoRouteRequest &operator= (const QGeoRouteRequest &other); + + bool operator == (const QGeoRouteRequest &other) const; + bool operator != (const QGeoRouteRequest &other) const; + + void setWaypoints(const QList &waypoints); + QList waypoints() const; + + void setExcludeAreas(const QList &areas); + QList excludeAreas() const; + + // defaults to 0 + void setNumberAlternativeRoutes(int alternatives); + int numberAlternativeRoutes() const; + + // defaults to TravelByCar + void setTravelModes(TravelModes travelModes); + TravelModes travelModes() const; + + void setFeatureWeight(FeatureType featureType, FeatureWeight featureWeight); + FeatureWeight featureWeight(FeatureType featureType) const; + QList featureTypes() const; + + // defaults to OptimizeFastest + void setRouteOptimization(RouteOptimizations optimization); + RouteOptimizations routeOptimization() const; + + // defaults to BasicSegmentData + void setSegmentDetail(SegmentDetail segmentDetail); + SegmentDetail segmentDetail() const; + + // defaults to BasicManeuvers + void setManeuverDetail(ManeuverDetail maneuverDetail); + ManeuverDetail maneuverDetail() const; + +private: + QExplicitlySharedDataPointer d_ptr; +}; + +Q_DECLARE_OPERATORS_FOR_FLAGS(QGeoRouteRequest::TravelModes) +Q_DECLARE_OPERATORS_FOR_FLAGS(QGeoRouteRequest::FeatureTypes) +Q_DECLARE_OPERATORS_FOR_FLAGS(QGeoRouteRequest::FeatureWeights) +Q_DECLARE_OPERATORS_FOR_FLAGS(QGeoRouteRequest::RouteOptimizations) +Q_DECLARE_OPERATORS_FOR_FLAGS(QGeoRouteRequest::SegmentDetails) +Q_DECLARE_OPERATORS_FOR_FLAGS(QGeoRouteRequest::ManeuverDetails) + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeorouterequest_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeorouterequest_p.h new file mode 100644 index 0000000..ea0b142 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeorouterequest_p.h @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOROUTEREQUEST_P_H +#define QGEOROUTEREQUEST_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qgeorouterequest.h" + +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoRouteRequestPrivate : public QSharedData +{ +public: + QGeoRouteRequestPrivate(); + QGeoRouteRequestPrivate(const QGeoRouteRequestPrivate &other); + ~QGeoRouteRequestPrivate(); + + bool operator ==(const QGeoRouteRequestPrivate &other) const; + + QList waypoints; + QList excludeAreas; + int numberAlternativeRoutes; + QGeoRouteRequest::TravelModes travelModes; + QMap < QGeoRouteRequest::FeatureType, + QGeoRouteRequest::FeatureWeight > featureWeights; + QGeoRouteRequest::RouteOptimizations routeOptimization; + QGeoRouteRequest::SegmentDetail segmentDetail; + QGeoRouteRequest::ManeuverDetail maneuverDetail; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroutesegment.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroutesegment.h new file mode 100644 index 0000000..bddc172 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroutesegment.h @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOROUTESEGMENT_H +#define QGEOROUTESEGMENT_H + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoCoordinate; +class QGeoManeuver; +class QGeoRouteSegmentPrivate; + +class Q_LOCATION_EXPORT QGeoRouteSegment +{ + +public: + QGeoRouteSegment(); + QGeoRouteSegment(const QGeoRouteSegment &other); + ~QGeoRouteSegment(); + + QGeoRouteSegment &operator= (const QGeoRouteSegment &other); + + bool operator ==(const QGeoRouteSegment &other) const; + bool operator !=(const QGeoRouteSegment &other) const; + + bool isValid() const; + + void setNextRouteSegment(const QGeoRouteSegment &routeSegment); + QGeoRouteSegment nextRouteSegment() const; + + void setTravelTime(int secs); + int travelTime() const; + + void setDistance(qreal distance); + qreal distance() const; + + void setPath(const QList &path); + QList path() const; + + void setManeuver(const QGeoManeuver &maneuver); + QGeoManeuver maneuver() const; + +protected: + QGeoRouteSegment(QExplicitlySharedDataPointer &d_ptr); + +private: + QExplicitlySharedDataPointer d_ptr; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroutesegment_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroutesegment_p.h new file mode 100644 index 0000000..1751266 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroutesegment_p.h @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOROUTESEGMENT_P_H +#define QGEOROUTESEGMENT_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qgeomaneuver.h" + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoCoordinate; + +class QGeoRouteSegmentPrivate : public QSharedData +{ +public: + QGeoRouteSegmentPrivate(); + QGeoRouteSegmentPrivate(const QGeoRouteSegmentPrivate &other); + ~QGeoRouteSegmentPrivate(); + + bool operator ==(const QGeoRouteSegmentPrivate &other) const; + + bool valid; + + int travelTime; + qreal distance; + QList path; + QGeoManeuver maneuver; + + QExplicitlySharedDataPointer nextSegment; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroutingmanager.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroutingmanager.h new file mode 100644 index 0000000..0648a15 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroutingmanager.h @@ -0,0 +1,91 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOROUTINGMANAGER_H +#define QGEOROUTINGMANAGER_H + +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoRoutingManagerEngine; +class QGeoRoutingManagerPrivate; + +class Q_LOCATION_EXPORT QGeoRoutingManager : public QObject +{ + Q_OBJECT + +public: + ~QGeoRoutingManager(); + + QString managerName() const; + int managerVersion() const; + + QGeoRouteReply *calculateRoute(const QGeoRouteRequest &request); + QGeoRouteReply *updateRoute(const QGeoRoute &route, const QGeoCoordinate &position); + + QGeoRouteRequest::TravelModes supportedTravelModes() const; + QGeoRouteRequest::FeatureTypes supportedFeatureTypes() const; + QGeoRouteRequest::FeatureWeights supportedFeatureWeights() const; + QGeoRouteRequest::RouteOptimizations supportedRouteOptimizations() const; + QGeoRouteRequest::SegmentDetails supportedSegmentDetails() const; + QGeoRouteRequest::ManeuverDetails supportedManeuverDetails() const; + + void setLocale(const QLocale &locale); + QLocale locale() const; + void setMeasurementSystem(QLocale::MeasurementSystem system); + QLocale::MeasurementSystem measurementSystem() const; + +Q_SIGNALS: + void finished(QGeoRouteReply *reply); + void error(QGeoRouteReply *reply, QGeoRouteReply::Error error, QString errorString = QString()); + +private: + QGeoRoutingManager(QGeoRoutingManagerEngine *engine, QObject *parent = 0); + + QGeoRoutingManagerPrivate *d_ptr; + Q_DISABLE_COPY(QGeoRoutingManager) + + friend class QGeoServiceProvider; + friend class QGeoServiceProviderPrivate; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroutingmanager_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroutingmanager_p.h new file mode 100644 index 0000000..b3a9f2f --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroutingmanager_p.h @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOROUTINGMANAGER_P_H +#define QGEOROUTINGMANAGER_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +QT_BEGIN_NAMESPACE + +class QGeoRoutingManagerEngine; + +class QGeoRoutingManagerPrivate +{ +public: + QGeoRoutingManagerPrivate(); + ~QGeoRoutingManagerPrivate(); + + QGeoRoutingManagerEngine *engine; + +private: + Q_DISABLE_COPY(QGeoRoutingManagerPrivate) +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroutingmanagerengine.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroutingmanagerengine.h new file mode 100644 index 0000000..9fa0272 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroutingmanagerengine.h @@ -0,0 +1,100 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOROUTINGMANAGERENGINE_H +#define QGEOROUTINGMANAGERENGINE_H + +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoRoutingManagerEnginePrivate; + +class Q_LOCATION_EXPORT QGeoRoutingManagerEngine : public QObject +{ + Q_OBJECT +public: + QGeoRoutingManagerEngine(const QVariantMap ¶meters, QObject *parent = 0); + virtual ~QGeoRoutingManagerEngine(); + + QString managerName() const; + int managerVersion() const; + + virtual QGeoRouteReply *calculateRoute(const QGeoRouteRequest &request) = 0; + virtual QGeoRouteReply *updateRoute(const QGeoRoute &route, const QGeoCoordinate &position); + + QGeoRouteRequest::TravelModes supportedTravelModes() const; + QGeoRouteRequest::FeatureTypes supportedFeatureTypes() const; + QGeoRouteRequest::FeatureWeights supportedFeatureWeights() const; + QGeoRouteRequest::RouteOptimizations supportedRouteOptimizations() const; + QGeoRouteRequest::SegmentDetails supportedSegmentDetails() const; + QGeoRouteRequest::ManeuverDetails supportedManeuverDetails() const; + + void setLocale(const QLocale &locale); + QLocale locale() const; + void setMeasurementSystem(QLocale::MeasurementSystem system); + QLocale::MeasurementSystem measurementSystem() const; + +Q_SIGNALS: + void finished(QGeoRouteReply *reply); + void error(QGeoRouteReply *reply, QGeoRouteReply::Error error, QString errorString = QString()); + +protected: + void setSupportedTravelModes(QGeoRouteRequest::TravelModes travelModes); + void setSupportedFeatureTypes(QGeoRouteRequest::FeatureTypes featureTypes); + void setSupportedFeatureWeights(QGeoRouteRequest::FeatureWeights featureWeights); + void setSupportedRouteOptimizations(QGeoRouteRequest::RouteOptimizations optimizations); + void setSupportedSegmentDetails(QGeoRouteRequest::SegmentDetails segmentDetails); + void setSupportedManeuverDetails(QGeoRouteRequest::ManeuverDetails maneuverDetails); + +private: + void setManagerName(const QString &managerName); + void setManagerVersion(int managerVersion); + + QGeoRoutingManagerEnginePrivate *d_ptr; + Q_DISABLE_COPY(QGeoRoutingManagerEngine) + + friend class QGeoServiceProvider; + friend class QGeoServiceProviderPrivate; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroutingmanagerengine_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroutingmanagerengine_p.h new file mode 100644 index 0000000..7ba6c3d --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoroutingmanagerengine_p.h @@ -0,0 +1,83 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOROUTINGMANAGERENGINE_P_H +#define QGEOROUTINGMANAGERENGINE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qgeorouterequest.h" + +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoRoutingManagerEnginePrivate +{ +public: + QGeoRoutingManagerEnginePrivate(); + ~QGeoRoutingManagerEnginePrivate(); + + QString managerName; + int managerVersion; + + QGeoRouteRequest::TravelModes supportedTravelModes; + QGeoRouteRequest::FeatureTypes supportedFeatureTypes; + QGeoRouteRequest::FeatureWeights supportedFeatureWeights; + QGeoRouteRequest::RouteOptimizations supportedRouteOptimizations; + QGeoRouteRequest::SegmentDetails supportedSegmentDetails; + QGeoRouteRequest::ManeuverDetails supportedManeuverDetails; + + QLocale locale; + QLocale::MeasurementSystem measurementSystem; + +private: + Q_DISABLE_COPY(QGeoRoutingManagerEnginePrivate) +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoserviceprovider.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoserviceprovider.h new file mode 100644 index 0000000..69a9838 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoserviceprovider.h @@ -0,0 +1,163 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOSERVICEPROVIDER_H +#define QGEOSERVICEPROVIDER_H + +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QLocale; +class QStringList; +class QGeoCodingManager; +class QGeoMappingManager; +class QGeoRoutingManager; +class QPlaceManager; +class QGeoCodingManagerEngine; +class QGeoMappingManagerEngine; +class QGeoRoutingManagerEngine; +class QPlaceManagerEngine; +class QGeoServiceProviderPrivate; + +class Q_LOCATION_EXPORT QGeoServiceProvider : public QObject +{ + Q_OBJECT + Q_ENUM(Error) +public: + enum Error { + NoError, + NotSupportedError, + UnknownParameterError, + MissingRequiredParameterError, + ConnectionError + }; + + enum RoutingFeature { + NoRoutingFeatures = 0, + OnlineRoutingFeature = (1<<0), + OfflineRoutingFeature = (1<<1), + LocalizedRoutingFeature = (1<<2), + RouteUpdatesFeature = (1<<3), + AlternativeRoutesFeature = (1<<4), + ExcludeAreasRoutingFeature = (1<<5), + AnyRoutingFeatures = ~(0) + }; + + enum GeocodingFeature { + NoGeocodingFeatures = 0, + OnlineGeocodingFeature = (1<<0), + OfflineGeocodingFeature = (1<<1), + ReverseGeocodingFeature = (1<<2), + LocalizedGeocodingFeature = (1<<3), + AnyGeocodingFeatures = ~(0) + }; + + enum MappingFeature { + NoMappingFeatures = 0, + OnlineMappingFeature = (1<<0), + OfflineMappingFeature = (1<<1), + LocalizedMappingFeature = (1<<2), + AnyMappingFeatures = ~(0) + }; + + enum PlacesFeature { + NoPlacesFeatures = 0, + OnlinePlacesFeature = (1<<0), + OfflinePlacesFeature = (1<<1), + SavePlaceFeature = (1<<2), + RemovePlaceFeature = (1<<3), + SaveCategoryFeature = (1<<4), + RemoveCategoryFeature = (1<<5), + PlaceRecommendationsFeature = (1<<6), + SearchSuggestionsFeature = (1<<7), + LocalizedPlacesFeature = (1<<8), + NotificationsFeature = (1<<9), + PlaceMatchingFeature = (1<<10), + AnyPlacesFeatures = ~(0) + }; + + Q_DECLARE_FLAGS(RoutingFeatures, RoutingFeature) + Q_FLAGS(RoutingFeatures) + + Q_DECLARE_FLAGS(GeocodingFeatures, GeocodingFeature) + Q_FLAGS(GeocodingFeatures) + + Q_DECLARE_FLAGS(MappingFeatures, MappingFeature) + Q_FLAGS(MappingFeatures) + + Q_DECLARE_FLAGS(PlacesFeatures, PlacesFeature) + Q_FLAGS(PlacesFeatures) + + static QStringList availableServiceProviders(); + QGeoServiceProvider(const QString &providerName, + const QVariantMap ¶meters = QVariantMap(), + bool allowExperimental = false); + + ~QGeoServiceProvider(); + + RoutingFeatures routingFeatures() const; + GeocodingFeatures geocodingFeatures() const; + MappingFeatures mappingFeatures() const; + PlacesFeatures placesFeatures() const; + + QGeoCodingManager *geocodingManager() const; + QGeoMappingManager *mappingManager() const; + QGeoRoutingManager *routingManager() const; + QPlaceManager *placeManager() const; + + Error error() const; + QString errorString() const; + + void setParameters(const QVariantMap ¶meters); + void setLocale(const QLocale &locale); + void setAllowExperimental(bool allow); + +private: + QGeoServiceProviderPrivate *d_ptr; +}; + +Q_DECLARE_OPERATORS_FOR_FLAGS(QGeoServiceProvider::RoutingFeatures) +Q_DECLARE_OPERATORS_FOR_FLAGS(QGeoServiceProvider::GeocodingFeatures) +Q_DECLARE_OPERATORS_FOR_FLAGS(QGeoServiceProvider::MappingFeatures) +Q_DECLARE_OPERATORS_FOR_FLAGS(QGeoServiceProvider::PlacesFeatures) + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoserviceprovider_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoserviceprovider_p.h new file mode 100644 index 0000000..6bfb9b2 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoserviceprovider_p.h @@ -0,0 +1,121 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOSERVICEPROVIDER_P_H +#define QGEOSERVICEPROVIDER_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qgeoserviceprovider.h" + +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoCodingManager; +class QGeoRoutingManager; +class QGeoMappingManager; + +class QGeoServiceProviderFactory; + +class QGeoServiceProviderPrivate +{ +public: + QGeoServiceProviderPrivate(); + ~QGeoServiceProviderPrivate(); + + void loadMeta(); + void loadPlugin(const QVariantMap ¶meters); + void unload(); + void filterParameterMap(); + + /* helper templates for generating the feature and manager accessors */ + template + Manager *manager(QGeoServiceProvider::Error *error, + QString *errorString, Manager **manager); + template + Flags features(const char *enumName); + + QGeoServiceProviderFactory *factory; + QJsonObject metaData; + + QVariantMap parameterMap; + QVariantMap cleanedParameterMap; + + bool experimental; + + QGeoCodingManager *geocodingManager; + QGeoRoutingManager *routingManager; + QGeoMappingManager *mappingManager; + QPlaceManager *placeManager; + + QGeoServiceProvider::Error geocodeError; + QGeoServiceProvider::Error routingError; + QGeoServiceProvider::Error mappingError; + QGeoServiceProvider::Error placeError; + + QString geocodeErrorString; + QString routingErrorString; + QString mappingErrorString; + QString placeErrorString; + + QGeoServiceProvider::Error error; + QString errorString; + + QString providerName; + + QLocale locale; + bool localeSet; + + static QHash plugins(bool reload = false); + static void loadPluginMetadata(QHash &list); +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoserviceproviderfactory.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoserviceproviderfactory.h new file mode 100644 index 0000000..cc60cf7 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeoserviceproviderfactory.h @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOSERVICEPROVIDERFACTORY_H +#define QGEOSERVICEPROVIDERFACTORY_H + +#include + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Q_LOCATION_EXPORT QGeoServiceProviderFactory +{ +public: + virtual ~QGeoServiceProviderFactory() {} + + virtual QGeoCodingManagerEngine *createGeocodingManagerEngine(const QVariantMap ¶meters, + QGeoServiceProvider::Error *error, + QString *errorString) const; + virtual QGeoMappingManagerEngine *createMappingManagerEngine(const QVariantMap ¶meters, + QGeoServiceProvider::Error *error, + QString *errorString) const; + virtual QGeoRoutingManagerEngine *createRoutingManagerEngine(const QVariantMap ¶meters, + QGeoServiceProvider::Error *error, + QString *errorString) const; + virtual QPlaceManagerEngine *createPlaceManagerEngine(const QVariantMap ¶meters, + QGeoServiceProvider::Error *error, + QString *errorString) const; +}; + +Q_DECLARE_INTERFACE(QGeoServiceProviderFactory, + "org.qt-project.qt.geoservice.serviceproviderfactory/5.0") + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotilecache_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotilecache_p.h new file mode 100644 index 0000000..9cf31db --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotilecache_p.h @@ -0,0 +1,168 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QGEOTILECACHE_P_H +#define QGEOTILECACHE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include + +#include +#include +#include "qcache3q_p.h" +#include +#include +#include + +#include "qgeotilespec_p.h" +#include "qgeotiledmappingmanagerengine_p.h" + +#include + +QT_BEGIN_NAMESPACE + +class QGeoMappingManager; + +class QGeoTile; +class QGeoCachedTileMemory; +class QGeoTileCache; + +class QPixmap; +class QThread; + +/* This would be internal to qgeotilecache.cpp except that the eviction + * policy can't be defined without it being concrete here */ +class QGeoCachedTileDisk +{ +public: + ~QGeoCachedTileDisk(); + + QGeoTileSpec spec; + QString filename; + QString format; + QGeoTileCache *cache; +}; + +/* This is also used in the mapgeometry */ +class Q_LOCATION_EXPORT QGeoTileTexture +{ +public: + + QGeoTileTexture(); + ~QGeoTileTexture(); + + QGeoTileSpec spec; + QImage image; + bool textureBound; +}; + +/* Custom eviction policy for the disk cache, to avoid deleting all the files + * when the application closes */ +class QCache3QTileEvictionPolicy : public QCache3QDefaultEvictionPolicy +{ +protected: + void aboutToBeRemoved(const QGeoTileSpec &key, QSharedPointer obj); + void aboutToBeEvicted(const QGeoTileSpec &key, QSharedPointer obj); +}; + +class Q_LOCATION_EXPORT QGeoTileCache : public QObject +{ + Q_OBJECT +public: + QGeoTileCache(const QString &directory = QString(), QObject *parent = 0); + ~QGeoTileCache(); + + void setMaxDiskUsage(int diskUsage); + int maxDiskUsage() const; + int diskUsage() const; + + void setMaxMemoryUsage(int memoryUsage); + int maxMemoryUsage() const; + int memoryUsage() const; + + void setMinTextureUsage(int textureUsage); + void setExtraTextureUsage(int textureUsage); + int maxTextureUsage() const; + int minTextureUsage() const; + int textureUsage() const; + + QSharedPointer get(const QGeoTileSpec &spec); + QString directory() const; + + // can be called without a specific tileCache pointer + static void evictFromDiskCache(QGeoCachedTileDisk *td); + static void evictFromMemoryCache(QGeoCachedTileMemory *tm); + + void insert(const QGeoTileSpec &spec, + const QByteArray &bytes, + const QString &format, + QGeoTiledMappingManagerEngine::CacheAreas areas = QGeoTiledMappingManagerEngine::AllCaches); + void handleError(const QGeoTileSpec &spec, const QString &errorString); + +public Q_SLOTS: + void printStats(); + +private: + void loadTiles(); + + QSharedPointer addToDiskCache(const QGeoTileSpec &spec, const QString &filename); + QSharedPointer addToMemoryCache(const QGeoTileSpec &spec, const QByteArray &bytes, const QString &format); + QSharedPointer addToTextureCache(const QGeoTileSpec &spec, const QPixmap &pixmap); + + static QString tileSpecToFilename(const QGeoTileSpec &spec, const QString &format, const QString &directory); + static QGeoTileSpec filenameToTileSpec(const QString &filename); + + QString directory_; + QCache3Q diskCache_; + QCache3Q memoryCache_; + QCache3Q textureCache_; + + int minTextureUsage_; + int extraTextureUsage_; +}; + +QT_END_NAMESPACE + +#endif // QGEOTILECACHE_P_H diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotiledmap_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotiledmap_p.h new file mode 100644 index 0000000..2dbf175 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotiledmap_p.h @@ -0,0 +1,105 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QGEOTILEDMAP_P_H +#define QGEOTILEDMAP_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include + +#include "qgeomap_p.h" +#include "qgeocameradata_p.h" +#include "qgeomaptype_p.h" + +#include + +QT_BEGIN_NAMESPACE + +class QGeoTileSpec; +class QGeoTileTexture; +class QGeoTileCache; +class QGeoTiledMapPrivate; +class QGeoTiledMappingManagerEngine; +class QGeoTileRequestManager; + +class QQuickWindow; +class QSGNode; + +class QPointF; + +class Q_LOCATION_EXPORT QGeoTiledMap : public QGeoMap +{ + Q_OBJECT + Q_DECLARE_PRIVATE(QGeoTiledMap) + +public: + QGeoTiledMap(QGeoTiledMappingManagerEngine *engine, QObject *parent); + virtual ~QGeoTiledMap(); + + QGeoTileCache *tileCache(); + QGeoTileRequestManager *requestManager(); + void updateTile(const QGeoTileSpec &spec); + + QGeoCoordinate itemPositionToCoordinate(const QDoubleVector2D &pos, bool clipToViewport = true) const Q_DECL_OVERRIDE; + QDoubleVector2D coordinateToItemPosition(const QGeoCoordinate &coordinate, bool clipToViewport = true) const Q_DECL_OVERRIDE; + void prefetchData() Q_DECL_OVERRIDE; + + +protected: + QSGNode *updateSceneGraph(QSGNode *, QQuickWindow *window) Q_DECL_OVERRIDE; + +protected Q_SLOTS: + virtual void evaluateCopyrights(const QSet &visibleTiles); + void updateMapVersion(); + +private: + Q_DISABLE_COPY(QGeoTiledMap) + +}; + +QT_END_NAMESPACE + +#endif // QGEOMAP_P_H diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotiledmap_p_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotiledmap_p_p.h new file mode 100644 index 0000000..bd4b4c0 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotiledmap_p_p.h @@ -0,0 +1,102 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QGEOTILEDMAP_P_P_H +#define QGEOTILEDMAP_P_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qgeomap_p_p.h" +#include "qgeocameradata_p.h" +#include "qgeomaptype_p.h" +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoCameraTiles; +class QGeoMapScene; +class QGeoTileCache; +class QGeoTiledMappingManagerEngine; +class QGeoTiledMap; +class QGeoTileRequestManager; +class QGeoTileSpec; +class QSGNode; +class QQuickWindow; + +class QGeoTiledMapPrivate : public QGeoMapPrivate +{ + Q_DECLARE_PUBLIC(QGeoTiledMap) +public: + QGeoTiledMapPrivate(QGeoTiledMappingManagerEngine *engine); + ~QGeoTiledMapPrivate(); + + QSGNode *updateSceneGraph(QSGNode *node, QQuickWindow *window); + + void changeMapVersion(int mapVersion); + void resized(int width, int height); + + QGeoCoordinate itemPositionToCoordinate(const QDoubleVector2D &pos) const; + QDoubleVector2D coordinateToItemPosition(const QGeoCoordinate &coordinate) const; + + void updateTile(const QGeoTileSpec &spec); + void prefetchTiles(); + +protected: + void mapResized(int width, int height) Q_DECL_OVERRIDE; + void changeCameraData(const QGeoCameraData &oldCameraData) Q_DECL_OVERRIDE; + void changeActiveMapType(const QGeoMapType mapType) Q_DECL_OVERRIDE; + +private: + QGeoTileCache *m_cache; + QGeoCameraTiles *m_cameraTiles; + QGeoMapScene *m_mapScene; + QGeoTileRequestManager *m_tileRequests; + Q_DISABLE_COPY(QGeoTiledMapPrivate) +}; + +QT_END_NAMESPACE + +#endif // QGEOTILEDMAP_P_P_H diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotiledmappingmanagerengine_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotiledmappingmanagerengine_p.h new file mode 100644 index 0000000..6cc4cae --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotiledmappingmanagerengine_p.h @@ -0,0 +1,119 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOTILEDMAPPINGMANAGERENGINE_H +#define QGEOTILEDMAPPINGMANAGERENGINE_H + +#include +#include +#include +#include +#include "qgeomaptype_p.h" +#include "qgeomappingmanagerengine_p.h" + +QT_BEGIN_NAMESPACE + +class QGeoTiledMappingManagerEnginePrivate; +class QGeoMapRequestOptions; +class QGeoTileFetcher; +class QGeoTileTexture; + +class QGeoTileSpec; +class QGeoTiledMap; +class QGeoTileCache; + +class Q_LOCATION_EXPORT QGeoTiledMappingManagerEngine : public QGeoMappingManagerEngine +{ + Q_OBJECT + +public: + enum CacheArea { + DiskCache = 0x01, + MemoryCache = 0x02, + AllCaches = 0xFF + }; + Q_DECLARE_FLAGS(CacheAreas, CacheArea) + + explicit QGeoTiledMappingManagerEngine(QObject *parent = 0); + virtual ~QGeoTiledMappingManagerEngine(); + + QGeoTileFetcher *tileFetcher(); + + QGeoMap *createMap() Q_DECL_OVERRIDE; + void registerMap(QGeoMap *map) Q_DECL_OVERRIDE; + void deregisterMap(QGeoMap *map) Q_DECL_OVERRIDE; + + QSize tileSize() const; + + void updateTileRequests(QGeoTiledMap *map, + const QSet &tilesAdded, + const QSet &tilesRemoved); + + QGeoTileCache *tileCache(); // TODO: check this is still used + QSharedPointer getTileTexture(const QGeoTileSpec &spec); + + + QGeoTiledMappingManagerEngine::CacheAreas cacheHint() const; + +private Q_SLOTS: + void engineTileFinished(const QGeoTileSpec &spec, const QByteArray &bytes, const QString &format); + void engineTileError(const QGeoTileSpec &spec, const QString &errorString); + +Q_SIGNALS: + void tileError(const QGeoTileSpec &spec, const QString &errorString); + void mapVersionChanged(); + +protected: + void setTileFetcher(QGeoTileFetcher *fetcher); + void setTileSize(const QSize &tileSize); + void setCacheHint(QGeoTiledMappingManagerEngine::CacheAreas cacheHint); + + QGeoTileCache *createTileCacheWithDir(const QString &cacheDirectory); + +private: + QGeoTiledMappingManagerEnginePrivate *d_ptr; + + Q_DECLARE_PRIVATE(QGeoTiledMappingManagerEngine) + Q_DISABLE_COPY(QGeoTiledMappingManagerEngine) + + friend class QGeoTileFetcher; +}; + +Q_DECLARE_OPERATORS_FOR_FLAGS(QGeoTiledMappingManagerEngine::CacheAreas) + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotiledmappingmanagerengine_p_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotiledmappingmanagerengine_p_p.h new file mode 100644 index 0000000..77e84e8 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotiledmappingmanagerengine_p_p.h @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#ifndef QGEOTILEDMAPPINGMANAGER_P_H +#define QGEOTILEDMAPPINGMANAGER_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include +#include "qgeotiledmappingmanagerengine_p.h" + +QT_BEGIN_NAMESPACE + +class QGeoTiledMap; +class QGeoTileCache; +class QGeoTileSpec; +class QGeoTileFetcher; + +class QGeoTiledMappingManagerEnginePrivate +{ +public: + QGeoTiledMappingManagerEnginePrivate(); + ~QGeoTiledMappingManagerEnginePrivate(); + + QSize tileSize_; + QSet tileMaps_; + QHash > mapHash_; + QHash > tileHash_; + QGeoTiledMappingManagerEngine::CacheAreas cacheHint_; + QGeoTileCache *tileCache_; + QGeoTileFetcher *fetcher_; + +private: + Q_DISABLE_COPY(QGeoTiledMappingManagerEnginePrivate) +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotiledmapreply_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotiledmapreply_p.h new file mode 100644 index 0000000..91852cc --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotiledmapreply_p.h @@ -0,0 +1,109 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOTILEDMAPREPLY_H +#define QGEOTILEDMAPREPLY_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include + +#include + +QT_BEGIN_NAMESPACE + +class QGeoTileSpec; +class QGeoTiledMapReplyPrivate; + +class Q_LOCATION_EXPORT QGeoTiledMapReply : public QObject +{ + Q_OBJECT + +public: + enum Error { + NoError, + CommunicationError, + ParseError, + UnknownError + }; + + QGeoTiledMapReply(const QGeoTileSpec &spec, QObject *parent = 0); + QGeoTiledMapReply(Error error, const QString &errorString, QObject *parent = 0); + virtual ~QGeoTiledMapReply(); + + bool isFinished() const; + Error error() const; + QString errorString() const; + + bool isCached() const; + + QGeoTileSpec tileSpec() const; + + QByteArray mapImageData() const; + QString mapImageFormat() const; + + virtual void abort(); + +Q_SIGNALS: + void finished(); + void error(QGeoTiledMapReply::Error error, const QString &errorString = QString()); + +protected: + void setError(Error error, const QString &errorString); + void setFinished(bool finished); + + void setCached(bool cached); + + void setMapImageData(const QByteArray &data); + void setMapImageFormat(const QString &format); + +private: + QGeoTiledMapReplyPrivate *d_ptr; + Q_DISABLE_COPY(QGeoTiledMapReply) +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotiledmapreply_p_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotiledmapreply_p_p.h new file mode 100644 index 0000000..5dcf5a7 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotiledmapreply_p_p.h @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOTILEDMAPREPLY_P_H +#define QGEOTILEDMAPREPLY_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qgeotiledmapreply_p.h" +#include "qgeotilespec_p.h" + +QT_BEGIN_NAMESPACE + +class QGeoTiledMapReplyPrivate +{ +public: + QGeoTiledMapReplyPrivate(const QGeoTileSpec &spec); + QGeoTiledMapReplyPrivate(QGeoTiledMapReply::Error error, const QString &errorString); + ~QGeoTiledMapReplyPrivate(); + + QGeoTiledMapReply::Error error; + QString errorString; + bool isFinished; + bool isCached; + + QGeoTileSpec spec; + QByteArray mapImageData; + QString mapImageFormat; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotilefetcher_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotilefetcher_p.h new file mode 100644 index 0000000..cabab05 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotilefetcher_p.h @@ -0,0 +1,103 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOTILEFETCHER_H +#define QGEOTILEFETCHER_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include "qgeomaptype_p.h" +#include "qgeotiledmappingmanagerengine_p.h" + +QT_BEGIN_NAMESPACE + +class QGeoMapRequestOptions; + +class QGeoTileFetcherPrivate; +class QGeoTiledMappingManagerEngine; +class QGeoTiledMapReply; +class QGeoTileSpec; + +class Q_LOCATION_EXPORT QGeoTileFetcher : public QObject +{ + Q_OBJECT + +public: + QGeoTileFetcher(QObject *parent = 0); + virtual ~QGeoTileFetcher(); + +public Q_SLOTS: + void updateTileRequests(const QSet &tilesAdded, const QSet &tilesRemoved); + +private Q_SLOTS: + void cancelTileRequests(const QSet &tiles); + void requestNextTile(); + void finished(); + +Q_SIGNALS: + void tileFinished(const QGeoTileSpec &spec, const QByteArray &bytes, const QString &format); + void tileError(const QGeoTileSpec &spec, const QString &errorString); + +protected: + void timerEvent(QTimerEvent *event); + QGeoTiledMappingManagerEngine::CacheAreas cacheHint() const; + +private: + QGeoTileFetcherPrivate *d_ptr; + + virtual QGeoTiledMapReply *getTileImage(const QGeoTileSpec &spec) = 0; + void handleReply(QGeoTiledMapReply *reply, const QGeoTileSpec &spec); + + Q_DECLARE_PRIVATE(QGeoTileFetcher) + Q_DISABLE_COPY(QGeoTileFetcher) + + friend class QGeoTiledMappingManagerEngine; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotilefetcher_p_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotilefetcher_p_p.h new file mode 100644 index 0000000..ce2a548 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotilefetcher_p_p.h @@ -0,0 +1,86 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOTILEFETCHER_P_H +#define QGEOTILEFETCHER_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include "qgeomaptype_p.h" + +QT_BEGIN_NAMESPACE + +class QGeoTileSpec; +class QGeoTiledMapReply; +class QGeoTileCache; +class QGeoTiledMappingManagerEngine; + +class QGeoTileFetcherPrivate +{ +public: + QGeoTileFetcherPrivate(); + virtual ~QGeoTileFetcherPrivate(); + + bool enabled_; + QBasicTimer timer_; + QMutex queueMutex_; + QList queue_; + QHash invmap_; + +private: + Q_DISABLE_COPY(QGeoTileFetcherPrivate) +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotilerequestmanager_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotilerequestmanager_p.h new file mode 100644 index 0000000..8ae7360 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotilerequestmanager_p.h @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QGEOTILEREQUESTMANAGER_P_H +#define QGEOTILEREQUESTMANAGER_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include + +QT_BEGIN_NAMESPACE + +class QGeoTiledMap; +class QGeoTiledMappingManagerEngine; +class QGeoTileSpec; +class QGeoTileCache; +class QGeoTileTexture; + +class QGeoTileRequestManagerPrivate; + +class QGeoTileRequestManager +{ +public: + explicit QGeoTileRequestManager(QGeoTiledMap *map, QGeoTiledMappingManagerEngine *engine); + ~QGeoTileRequestManager(); + + QList > requestTiles(const QSet &tiles); + + void tileError(const QGeoTileSpec &tile, const QString &errorString); + void tileFetched(const QGeoTileSpec &spec); + QSharedPointer tileTexture(const QGeoTileSpec &spec); + +private: + QScopedPointer d_ptr; + Q_DISABLE_COPY(QGeoTileRequestManager) +}; + +QT_END_NAMESPACE + +#endif // QGEOTILEREQUESTMANAGER_P_H diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotilespec_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotilespec_p.h new file mode 100644 index 0000000..b277824 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotilespec_p.h @@ -0,0 +1,103 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOTILESPEC_H +#define QGEOTILESPEC_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include + +#include + +QT_BEGIN_NAMESPACE + +class QGeoTileSpecPrivate; + +class Q_LOCATION_EXPORT QGeoTileSpec +{ +public: + QGeoTileSpec(); + QGeoTileSpec(const QGeoTileSpec &other); + QGeoTileSpec(const QString &plugin, int mapId, int zoom, int x, int y, int version = -1); + ~QGeoTileSpec(); + + QGeoTileSpec &operator = (const QGeoTileSpec &other); + + QString plugin() const; + + void setZoom(int zoom); + int zoom() const; + + void setX(int x); + int x() const; + + void setY(int y); + int y() const; + + void setMapId(int mapId); + int mapId() const; + + void setVersion(int version); + int version() const; + + bool operator == (const QGeoTileSpec &rhs) const; + bool operator < (const QGeoTileSpec &rhs) const; + +private: + QSharedDataPointer d; +}; + +Q_LOCATION_EXPORT unsigned int qHash(const QGeoTileSpec &spec); + +Q_LOCATION_EXPORT QDebug operator<<(QDebug, const QGeoTileSpec &); + +QT_END_NAMESPACE + +Q_DECLARE_METATYPE(QGeoTileSpec) + +#endif // QGEOTILESPEC_H diff --git a/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotilespec_p_p.h b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotilespec_p_p.h new file mode 100644 index 0000000..1e7442f --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/maps/qgeotilespec_p_p.h @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QGEOTILESPEC_P_H +#define QGEOTILESPEC_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoTileSpecPrivate : public QSharedData +{ +public: + QGeoTileSpecPrivate(); + QGeoTileSpecPrivate(const QGeoTileSpecPrivate &other); + QGeoTileSpecPrivate(const QString &plugin, int mapId, int zoom, int x, int y, int version); + ~QGeoTileSpecPrivate(); + + QGeoTileSpecPrivate &operator = (const QGeoTileSpecPrivate &other); + + bool operator == (const QGeoTileSpecPrivate &rhs) const; + bool operator < (const QGeoTileSpecPrivate &rhs) const; + + QString plugin_; + int mapId_; + int zoom_; + int x_; + int y_; + int version_; +}; + +QT_END_NAMESPACE + +#endif // QGEOTILESPEC_P_H diff --git a/src/QtLocationPlugin/qtlocation/src/location/qlocation.h b/src/QtLocationPlugin/qtlocation/src/location/qlocation.h new file mode 100644 index 0000000..d30a3a3 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/qlocation.h @@ -0,0 +1,65 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QLOCATION_H +#define QLOCATION_H + +#if 0 +#pragma qt_class(QLocation) +#endif + +#include + +QT_BEGIN_NAMESPACE + +namespace QLocation { + +enum Visibility { + UnspecifiedVisibility = 0x00, + DeviceVisibility = 0x01, + PrivateVisibility = 0x02, + PublicVisibility = 0x04 +}; + +Q_DECLARE_FLAGS(VisibilityScope, Visibility) + +} + +Q_DECLARE_OPERATORS_FOR_FLAGS(QLocation::VisibilityScope) + +QT_END_NAMESPACE + +#endif // QLOCATION_H diff --git a/src/QtLocationPlugin/qtlocation/src/location/qlocationglobal.h b/src/QtLocationPlugin/qtlocation/src/location/qlocationglobal.h new file mode 100644 index 0000000..7992c09 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/location/qlocationglobal.h @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QLOCATIONGLOBAL_H +#define QLOCATIONGLOBAL_H + +#include + +QT_BEGIN_NAMESPACE + +#ifndef QT_STATIC +# if defined(QT_BUILD_LOCATION_LIB) +# define Q_LOCATION_EXPORT Q_DECL_EXPORT +# else +# define Q_LOCATION_EXPORT Q_DECL_IMPORT +# endif +#else +# define Q_LOCATION_EXPORT +#endif + +QT_END_NAMESPACE + +#endif // QLOCATIONGLOBAL_H + diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qdeclarativegeoaddress_p.h b/src/QtLocationPlugin/qtlocation/src/positioning/qdeclarativegeoaddress_p.h new file mode 100644 index 0000000..7f51d55 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qdeclarativegeoaddress_p.h @@ -0,0 +1,103 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +***************************************************************************/ + +#ifndef QDECLARATIVEGEOADDRESS_P_H +#define QDECLARATIVEGEOADDRESS_P_H + +#include +#include + +QT_BEGIN_NAMESPACE + +class Q_POSITIONING_EXPORT QDeclarativeGeoAddress : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QGeoAddress address READ address WRITE setAddress) + Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged) + Q_PROPERTY(QString country READ country WRITE setCountry NOTIFY countryChanged) + Q_PROPERTY(QString countryCode READ countryCode WRITE setCountryCode NOTIFY countryCodeChanged) + Q_PROPERTY(QString state READ state WRITE setState NOTIFY stateChanged) + Q_PROPERTY(QString county READ county WRITE setCounty NOTIFY countyChanged) + Q_PROPERTY(QString city READ city WRITE setCity NOTIFY cityChanged) + Q_PROPERTY(QString district READ district WRITE setDistrict NOTIFY districtChanged) + Q_PROPERTY(QString street READ street WRITE setStreet NOTIFY streetChanged) + Q_PROPERTY(QString postalCode READ postalCode WRITE setPostalCode NOTIFY postalCodeChanged) + Q_PROPERTY(bool isTextGenerated READ isTextGenerated NOTIFY isTextGeneratedChanged) + +public: + explicit QDeclarativeGeoAddress(QObject *parent = 0); + QDeclarativeGeoAddress(const QGeoAddress &address, QObject *parent = 0); + QGeoAddress address() const; + void setAddress(const QGeoAddress &address); + + QString text() const; + void setText(const QString &address); + + QString country() const; + void setCountry(const QString &country); + QString countryCode() const; + void setCountryCode(const QString &countryCode); + QString state() const; + void setState(const QString &state); + QString county() const; + void setCounty(const QString &county); + QString city() const; + void setCity(const QString &city); + QString district() const; + void setDistrict(const QString &district); + QString street() const; + void setStreet(const QString &street); + QString postalCode() const; + void setPostalCode(const QString &postalCode); + bool isTextGenerated() const; + +Q_SIGNALS: + void textChanged(); + void countryChanged(); + void countryCodeChanged(); + void stateChanged(); + void countyChanged(); + void cityChanged(); + void districtChanged(); + void streetChanged(); + void postalCodeChanged(); + void isTextGeneratedChanged(); + +private: + QGeoAddress m_address; +}; + +QT_END_NAMESPACE + +#endif // QDECLARATIVEGEOADDRESS_P_H diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qdeclarativegeolocation_p.h b/src/QtLocationPlugin/qtlocation/src/positioning/qdeclarativegeolocation_p.h new file mode 100644 index 0000000..832dac6 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qdeclarativegeolocation_p.h @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QDECLARATIVEGEOLOCATION_P_H +#define QDECLARATIVEGEOLOCATION_P_H + +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Q_POSITIONING_EXPORT QDeclarativeGeoLocation : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QGeoLocation location READ location WRITE setLocation) + Q_PROPERTY(QDeclarativeGeoAddress *address READ address WRITE setAddress NOTIFY addressChanged) + Q_PROPERTY(QGeoCoordinate coordinate READ coordinate WRITE setCoordinate NOTIFY coordinateChanged) + Q_PROPERTY(QGeoRectangle boundingBox READ boundingBox WRITE setBoundingBox NOTIFY boundingBoxChanged) + +public: + explicit QDeclarativeGeoLocation(QObject *parent = 0); + explicit QDeclarativeGeoLocation(const QGeoLocation &src, QObject *parent = 0); + ~QDeclarativeGeoLocation(); + + QGeoLocation location() const; + void setLocation(const QGeoLocation &src); + + QDeclarativeGeoAddress *address() const; + void setAddress(QDeclarativeGeoAddress *address); + QGeoCoordinate coordinate() const; + void setCoordinate(const QGeoCoordinate coordinate); + + QGeoRectangle boundingBox() const; + void setBoundingBox(const QGeoRectangle &boundingBox); + +Q_SIGNALS: + void addressChanged(); + void coordinateChanged(); + void boundingBoxChanged(); + +private: + QDeclarativeGeoAddress *m_address; + QGeoRectangle m_boundingBox; + QGeoCoordinate m_coordinate; +}; + +QT_END_NAMESPACE + +#endif // QDECLARATIVELOCATION_P_H diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qdoublevector2d_p.h b/src/QtLocationPlugin/qtlocation/src/positioning/qdoublevector2d_p.h new file mode 100644 index 0000000..f25190b --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qdoublevector2d_p.h @@ -0,0 +1,242 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QDOUBLEVECTOR2D_P_H +#define QDOUBLEVECTOR2D_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#ifdef QT_BUILD_LOCATION_LIB +#include +#endif + +#include "qpositioningglobal.h" +#include +#include + +QT_BEGIN_NAMESPACE + +class QDoubleVector3D; + +class Q_POSITIONING_EXPORT QDoubleVector2D +{ +public: + Q_DECL_CONSTEXPR inline QDoubleVector2D(); + Q_DECL_CONSTEXPR inline QDoubleVector2D(double xpos, double ypos); + Q_DECL_CONSTEXPR explicit inline QDoubleVector2D(const QPointF &p); + explicit QDoubleVector2D(const QDoubleVector3D &vector); + + Q_DECL_CONSTEXPR inline double manhattanLength() const; + inline bool isNull() const; + + Q_DECL_CONSTEXPR inline double x() const; + Q_DECL_CONSTEXPR inline double y() const; + + inline void setX(double x); + inline void setY(double y); + + double length() const; + Q_DECL_CONSTEXPR inline double lengthSquared() const; + + QDoubleVector2D normalized() const; + void normalize(); + + inline QDoubleVector2D &operator+=(const QDoubleVector2D &vector); + inline QDoubleVector2D &operator-=(const QDoubleVector2D &vector); + inline QDoubleVector2D &operator*=(double factor); + inline QDoubleVector2D &operator*=(const QDoubleVector2D &vector); + inline QDoubleVector2D &operator/=(double divisor); + + Q_DECL_CONSTEXPR static inline double dotProduct(const QDoubleVector2D &v1, const QDoubleVector2D &v2) + { return v1.xp * v2.xp + v1.yp * v2.yp; } + + + friend Q_DECL_CONSTEXPR inline bool operator==(const QDoubleVector2D &v1, const QDoubleVector2D &v2); + friend Q_DECL_CONSTEXPR inline bool operator!=(const QDoubleVector2D &v1, const QDoubleVector2D &v2); + friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator+(const QDoubleVector2D &v1, const QDoubleVector2D &v2); + friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator-(const QDoubleVector2D &v1, const QDoubleVector2D &v2); + friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator*(double factor, const QDoubleVector2D &vector); + friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator*(const QDoubleVector2D &vector, double factor); + friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator*(const QDoubleVector2D &v1, const QDoubleVector2D &v2); + friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator-(const QDoubleVector2D &vector); + friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator/(const QDoubleVector2D &vector, double divisor); + + friend Q_DECL_CONSTEXPR inline bool qFuzzyCompare(const QDoubleVector2D &v1, const QDoubleVector2D &v2); + + QDoubleVector3D toVector3D() const; + Q_DECL_CONSTEXPR inline QPointF toPointF() const; + +private: + double xp, yp; + + friend class QDoubleVector3D; +}; + +Q_DECLARE_TYPEINFO(QDoubleVector2D, Q_MOVABLE_TYPE); + +Q_DECL_CONSTEXPR inline QDoubleVector2D::QDoubleVector2D() : xp(0.0), yp(0.0) {} + +Q_DECL_CONSTEXPR inline QDoubleVector2D::QDoubleVector2D(double xpos, double ypos) : xp(xpos), yp(ypos) {} + +Q_DECL_CONSTEXPR inline QDoubleVector2D::QDoubleVector2D(const QPointF &p) : xp(p.x()), yp(p.y()) { } + +Q_DECL_CONSTEXPR inline double QDoubleVector2D::manhattanLength() const +{ + return qAbs(x())+qAbs(y()); +} + +inline bool QDoubleVector2D::isNull() const +{ + return qIsNull(xp) && qIsNull(yp); +} + +Q_DECL_CONSTEXPR inline double QDoubleVector2D::x() const { return xp; } +Q_DECL_CONSTEXPR inline double QDoubleVector2D::y() const { return yp; } + +inline void QDoubleVector2D::setX(double aX) { xp = aX; } +inline void QDoubleVector2D::setY(double aY) { yp = aY; } + +Q_DECL_CONSTEXPR inline double QDoubleVector2D::lengthSquared() const +{ return xp * xp + yp * yp; } + +inline QDoubleVector2D &QDoubleVector2D::operator+=(const QDoubleVector2D &vector) +{ + xp += vector.xp; + yp += vector.yp; + return *this; +} + +inline QDoubleVector2D &QDoubleVector2D::operator-=(const QDoubleVector2D &vector) +{ + xp -= vector.xp; + yp -= vector.yp; + return *this; +} + +inline QDoubleVector2D &QDoubleVector2D::operator*=(double factor) +{ + xp *= factor; + yp *= factor; + return *this; +} + +inline QDoubleVector2D &QDoubleVector2D::operator*=(const QDoubleVector2D &vector) +{ + xp *= vector.xp; + yp *= vector.yp; + return *this; +} + +inline QDoubleVector2D &QDoubleVector2D::operator/=(double divisor) +{ + xp /= divisor; + yp /= divisor; + return *this; +} + +Q_DECL_CONSTEXPR inline bool operator==(const QDoubleVector2D &v1, const QDoubleVector2D &v2) +{ + return v1.xp == v2.xp && v1.yp == v2.yp; +} + +Q_DECL_CONSTEXPR inline bool operator!=(const QDoubleVector2D &v1, const QDoubleVector2D &v2) +{ + return v1.xp != v2.xp || v1.yp != v2.yp; +} + +Q_DECL_CONSTEXPR inline const QDoubleVector2D operator+(const QDoubleVector2D &v1, const QDoubleVector2D &v2) +{ + return QDoubleVector2D(v1.xp + v2.xp, v1.yp + v2.yp); +} + +Q_DECL_CONSTEXPR inline const QDoubleVector2D operator-(const QDoubleVector2D &v1, const QDoubleVector2D &v2) +{ + return QDoubleVector2D(v1.xp - v2.xp, v1.yp - v2.yp); +} + +Q_DECL_CONSTEXPR inline const QDoubleVector2D operator*(double factor, const QDoubleVector2D &vector) +{ + return QDoubleVector2D(vector.xp * factor, vector.yp * factor); +} + +Q_DECL_CONSTEXPR inline const QDoubleVector2D operator*(const QDoubleVector2D &vector, double factor) +{ + return QDoubleVector2D(vector.xp * factor, vector.yp * factor); +} + +Q_DECL_CONSTEXPR inline const QDoubleVector2D operator*(const QDoubleVector2D &v1, const QDoubleVector2D &v2) +{ + return QDoubleVector2D(v1.xp * v2.xp, v1.yp * v2.yp); +} + +Q_DECL_CONSTEXPR inline const QDoubleVector2D operator-(const QDoubleVector2D &vector) +{ + return QDoubleVector2D(-vector.xp, -vector.yp); +} + +Q_DECL_CONSTEXPR inline const QDoubleVector2D operator/(const QDoubleVector2D &vector, double divisor) +{ + return QDoubleVector2D(vector.xp / divisor, vector.yp / divisor); +} + +Q_DECL_CONSTEXPR inline bool qFuzzyCompare(const QDoubleVector2D &v1, const QDoubleVector2D &v2) +{ + return qFuzzyCompare(v1.xp, v2.xp) && qFuzzyCompare(v1.yp, v2.yp); +} + +Q_DECL_CONSTEXPR inline QPointF QDoubleVector2D::toPointF() const +{ + return QPointF(qreal(xp), qreal(yp)); +} + +#ifndef QT_NO_DEBUG_STREAM +Q_POSITIONING_EXPORT QDebug operator<<(QDebug dbg, const QDoubleVector2D &vector); +#endif + +#ifndef QT_NO_DATASTREAM +Q_POSITIONING_EXPORT QDataStream &operator<<(QDataStream &, const QDoubleVector2D &); +Q_POSITIONING_EXPORT QDataStream &operator>>(QDataStream &, QDoubleVector2D &); +#endif + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qdoublevector3d_p.h b/src/QtLocationPlugin/qtlocation/src/positioning/qdoublevector3d_p.h new file mode 100644 index 0000000..e4f96e3 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qdoublevector3d_p.h @@ -0,0 +1,296 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QDOUBLEVECTOR3D_P_H +#define QDOUBLEVECTOR3D_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#ifdef QT_BUILD_LOCATION_LIB +#include +#endif + +#include "qpositioningglobal.h" +#include "qdoublevector2d_p.h" +#include + +QT_BEGIN_NAMESPACE + +class Q_POSITIONING_EXPORT QDoubleVector3D +{ +public: + Q_DECL_CONSTEXPR inline QDoubleVector3D(); + Q_DECL_CONSTEXPR inline QDoubleVector3D(double xpos, double ypos, double zpos); + Q_DECL_CONSTEXPR inline QDoubleVector3D(const QDoubleVector2D &vector); + Q_DECL_CONSTEXPR inline QDoubleVector3D(const QDoubleVector2D &vector, double zpos); + + inline bool isNull() const; + + Q_DECL_CONSTEXPR inline double x() const; + Q_DECL_CONSTEXPR inline double y() const; + Q_DECL_CONSTEXPR inline double z() const; + + inline void setX(double x); + inline void setY(double y); + inline void setZ(double z); + + inline double get(int i) const; + inline void set(int i, double value); + + double length() const; + Q_DECL_CONSTEXPR inline double lengthSquared() const; + + QDoubleVector3D normalized() const; + void normalize(); + + inline QDoubleVector3D &operator+=(const QDoubleVector3D &vector); + inline QDoubleVector3D &operator-=(const QDoubleVector3D &vector); + inline QDoubleVector3D &operator*=(double factor); + inline QDoubleVector3D &operator*=(const QDoubleVector3D &vector); + inline QDoubleVector3D &operator/=(double divisor); + + Q_DECL_CONSTEXPR static inline double dotProduct(const QDoubleVector3D &v1, const QDoubleVector3D &v2) + { return v1.xp * v2.xp + v1.yp * v2.yp + v1.zp * v2.zp; } + + Q_DECL_CONSTEXPR static inline QDoubleVector3D crossProduct(const QDoubleVector3D &v1, const QDoubleVector3D &v2) + { return QDoubleVector3D(v1.yp * v2.zp - v1.zp * v2.yp, + v1.zp * v2.xp - v1.xp * v2.zp, + v1.xp * v2.yp - v1.yp * v2.xp); } + + static QDoubleVector3D normal(const QDoubleVector3D &v1, const QDoubleVector3D &v2); + static QDoubleVector3D normal + (const QDoubleVector3D &v1, const QDoubleVector3D &v2, const QDoubleVector3D &v3); + + double distanceToPlane(const QDoubleVector3D &plane, const QDoubleVector3D &normal) const; + double distanceToPlane(const QDoubleVector3D &plane1, const QDoubleVector3D &plane2, const QDoubleVector3D &plane3) const; + double distanceToLine(const QDoubleVector3D &point, const QDoubleVector3D &direction) const; + + friend Q_DECL_CONSTEXPR inline bool operator==(const QDoubleVector3D &v1, const QDoubleVector3D &v2); + friend Q_DECL_CONSTEXPR inline bool operator!=(const QDoubleVector3D &v1, const QDoubleVector3D &v2); + friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator+(const QDoubleVector3D &v1, const QDoubleVector3D &v2); + friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator-(const QDoubleVector3D &v1, const QDoubleVector3D &v2); + friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator*(double factor, const QDoubleVector3D &vector); + friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator*(const QDoubleVector3D &vector, double factor); + friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator*(const QDoubleVector3D &v1, const QDoubleVector3D &v2); + friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator-(const QDoubleVector3D &vector); + friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator/(const QDoubleVector3D &vector, double divisor); + + friend Q_DECL_CONSTEXPR inline bool qFuzzyCompare(const QDoubleVector3D &v1, const QDoubleVector3D &v2); + + Q_DECL_CONSTEXPR inline QDoubleVector2D toVector2D() const; + +private: + double xp, yp, zp; + + friend class QDoubleVector2D; +}; + +Q_DECLARE_TYPEINFO(QDoubleVector3D, Q_MOVABLE_TYPE); + +Q_DECL_CONSTEXPR inline QDoubleVector3D::QDoubleVector3D() : xp(0.0), yp(0.0), zp(0.0) {} + +Q_DECL_CONSTEXPR inline QDoubleVector3D::QDoubleVector3D(double xpos, double ypos, double zpos) : xp(xpos), yp(ypos), zp(zpos) {} + +Q_DECL_CONSTEXPR inline QDoubleVector3D::QDoubleVector3D(const QDoubleVector2D &v) + : xp(v.xp), yp(v.yp), zp(0.0) {} + +Q_DECL_CONSTEXPR inline QDoubleVector3D::QDoubleVector3D(const QDoubleVector2D &v, double zpos) + : xp(v.xp), yp(v.yp), zp(zpos) {} + +inline bool QDoubleVector3D::isNull() const +{ + return qIsNull(xp) && qIsNull(yp) && qIsNull(zp); +} + +Q_DECL_CONSTEXPR inline double QDoubleVector3D::x() const { return xp; } +Q_DECL_CONSTEXPR inline double QDoubleVector3D::y() const { return yp; } +Q_DECL_CONSTEXPR inline double QDoubleVector3D::z() const { return zp; } + +Q_DECL_CONSTEXPR inline double QDoubleVector3D::lengthSquared() const +{ return xp * xp + yp * yp + zp * zp; } + + +inline void QDoubleVector3D::setX(double aX) { xp = aX; } +inline void QDoubleVector3D::setY(double aY) { yp = aY; } +inline void QDoubleVector3D::setZ(double aZ) { zp = aZ; } + +inline double QDoubleVector3D::get(int i) const +{ + switch (i) { + case 0: + return xp; + case 1: + return yp; + case 2: + return zp; + default: + return 0.0; + } +} + +inline void QDoubleVector3D::set(int i, double value) +{ + switch (i) { + case 0: + xp = value; + break; + case 1: + yp = value; + break; + case 2: + zp = value; + break; + default: + break; + } +} + +inline QDoubleVector3D &QDoubleVector3D::operator+=(const QDoubleVector3D &vector) +{ + xp += vector.xp; + yp += vector.yp; + zp += vector.zp; + return *this; +} + +inline QDoubleVector3D &QDoubleVector3D::operator-=(const QDoubleVector3D &vector) +{ + xp -= vector.xp; + yp -= vector.yp; + zp -= vector.zp; + return *this; +} + +inline QDoubleVector3D &QDoubleVector3D::operator*=(double factor) +{ + xp *= factor; + yp *= factor; + zp *= factor; + return *this; +} + +inline QDoubleVector3D &QDoubleVector3D::operator*=(const QDoubleVector3D &vector) +{ + xp *= vector.xp; + yp *= vector.yp; + zp *= vector.zp; + return *this; +} + +inline QDoubleVector3D &QDoubleVector3D::operator/=(double divisor) +{ + xp /= divisor; + yp /= divisor; + zp /= divisor; + return *this; +} + +Q_DECL_CONSTEXPR inline bool operator==(const QDoubleVector3D &v1, const QDoubleVector3D &v2) +{ + return v1.xp == v2.xp && v1.yp == v2.yp && v1.zp == v2.zp; +} + +Q_DECL_CONSTEXPR inline bool operator!=(const QDoubleVector3D &v1, const QDoubleVector3D &v2) +{ + return v1.xp != v2.xp || v1.yp != v2.yp || v1.zp != v2.zp; +} + +Q_DECL_CONSTEXPR inline const QDoubleVector3D operator+(const QDoubleVector3D &v1, const QDoubleVector3D &v2) +{ + return QDoubleVector3D(v1.xp + v2.xp, v1.yp + v2.yp, v1.zp + v2.zp); +} + +Q_DECL_CONSTEXPR inline const QDoubleVector3D operator-(const QDoubleVector3D &v1, const QDoubleVector3D &v2) +{ + return QDoubleVector3D(v1.xp - v2.xp, v1.yp - v2.yp, v1.zp - v2.zp); +} + +Q_DECL_CONSTEXPR inline const QDoubleVector3D operator*(double factor, const QDoubleVector3D &vector) +{ + return QDoubleVector3D(vector.xp * factor, vector.yp * factor, vector.zp * factor); +} + +Q_DECL_CONSTEXPR inline const QDoubleVector3D operator*(const QDoubleVector3D &vector, double factor) +{ + return QDoubleVector3D(vector.xp * factor, vector.yp * factor, vector.zp * factor); +} + +Q_DECL_CONSTEXPR inline const QDoubleVector3D operator*(const QDoubleVector3D &v1, const QDoubleVector3D &v2) +{ + return QDoubleVector3D(v1.xp * v2.xp, v1.yp * v2.yp, v1.zp * v2.zp); +} + +Q_DECL_CONSTEXPR inline const QDoubleVector3D operator-(const QDoubleVector3D &vector) +{ + return QDoubleVector3D(-vector.xp, -vector.yp, -vector.zp); +} + +Q_DECL_CONSTEXPR inline const QDoubleVector3D operator/(const QDoubleVector3D &vector, double divisor) +{ + return QDoubleVector3D(vector.xp / divisor, vector.yp / divisor, vector.zp / divisor); +} + +Q_DECL_CONSTEXPR inline bool qFuzzyCompare(const QDoubleVector3D &v1, const QDoubleVector3D &v2) +{ + return qFuzzyCompare(v1.xp, v2.xp) && + qFuzzyCompare(v1.yp, v2.yp) && + qFuzzyCompare(v1.zp, v2.zp); +} + +Q_DECL_CONSTEXPR inline QDoubleVector2D QDoubleVector3D::toVector2D() const +{ + return QDoubleVector2D(xp, yp); +} + + +#ifndef QT_NO_DEBUG_STREAM +Q_POSITIONING_EXPORT QDebug operator<<(QDebug dbg, const QDoubleVector3D &vector); +#endif + +#ifndef QT_NO_DATASTREAM +Q_POSITIONING_EXPORT QDataStream &operator<<(QDataStream &, const QDoubleVector3D &); +Q_POSITIONING_EXPORT QDataStream &operator>>(QDataStream &, QDoubleVector3D &); +#endif + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qgeoaddress.h b/src/QtLocationPlugin/qtlocation/src/positioning/qgeoaddress.h new file mode 100644 index 0000000..9c107b1 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qgeoaddress.h @@ -0,0 +1,100 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOADDRESS_H +#define QGEOADDRESS_H + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QString; +class QGeoAddressPrivate; +class Q_POSITIONING_EXPORT QGeoAddress +{ +public: + QGeoAddress(); + QGeoAddress(const QGeoAddress &other); + ~QGeoAddress(); + + QGeoAddress &operator=(const QGeoAddress &other); + bool operator==(const QGeoAddress &other) const; + bool operator!=(const QGeoAddress &other) const { + return !(other == *this); + } + + QString text() const; + void setText(const QString &text); + + QString country() const; + void setCountry(const QString &country); + + QString countryCode() const; + void setCountryCode(const QString &countryCode); + + QString state() const; + void setState(const QString &state); + + QString county() const; + void setCounty(const QString &county); + + QString city() const; + void setCity(const QString &city); + + QString district() const; + void setDistrict(const QString &district); + + QString postalCode() const; + void setPostalCode(const QString &postalCode); + + QString street() const; + void setStreet(const QString &street); + + bool isEmpty() const; + void clear(); + + bool isTextGenerated() const; + +private: + QSharedDataPointer d; +}; + +Q_DECLARE_TYPEINFO(QGeoAddress, Q_MOVABLE_TYPE); + +QT_END_NAMESPACE + +Q_DECLARE_METATYPE(QGeoAddress) + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qgeoaddress_p.h b/src/QtLocationPlugin/qtlocation/src/positioning/qgeoaddress_p.h new file mode 100644 index 0000000..bbd47fc --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qgeoaddress_p.h @@ -0,0 +1,74 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QLOCATION_GEOADDRESS_P_H +#define QLOCATION_GEOADDRESS_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoAddressPrivate : public QSharedData +{ +public: + QGeoAddressPrivate(); + QGeoAddressPrivate(const QGeoAddressPrivate &other); + ~QGeoAddressPrivate(); + + QString sCountry; //!< country field + QString sCountryCode; //!< country code field + QString sState; //!< state field + QString sCounty; //!< county field + QString sCity; //!< city field + QString sDistrict; //!< district field + QString sStreet; //!< street name field + QString sPostalCode; //!< postal code field + QString sText; + bool m_autoGeneratedText; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qgeoareamonitorinfo.h b/src/QtLocationPlugin/qtlocation/src/positioning/qgeoareamonitorinfo.h new file mode 100644 index 0000000..faa8f09 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qgeoareamonitorinfo.h @@ -0,0 +1,97 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOAREAMONITORINFO_H +#define QGEOAREAMONITORINFO_H + +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QDataStream; +class QGeoAreaMonitorInfo; + +#ifndef QT_NO_DATASTREAM +Q_POSITIONING_EXPORT QDataStream &operator<<(QDataStream &, const QGeoAreaMonitorInfo &); +Q_POSITIONING_EXPORT QDataStream &operator>>(QDataStream &, QGeoAreaMonitorInfo &); +#endif + +class QGeoAreaMonitorInfoPrivate; +class Q_POSITIONING_EXPORT QGeoAreaMonitorInfo +{ +public: + explicit QGeoAreaMonitorInfo(const QString &name = QString()); + QGeoAreaMonitorInfo(const QGeoAreaMonitorInfo &other); + ~QGeoAreaMonitorInfo(); + + QGeoAreaMonitorInfo &operator=(const QGeoAreaMonitorInfo &other); + + bool operator==(const QGeoAreaMonitorInfo &other) const; + bool operator!=(const QGeoAreaMonitorInfo &other) const; + + QString name() const; + void setName(const QString &name); + + QString identifier() const; + bool isValid() const; + + QGeoShape area() const; + void setArea(const QGeoShape &newShape); + + QDateTime expiration() const; + void setExpiration(const QDateTime &expiry); + + bool isPersistent() const; + void setPersistent(bool isPersistent); + + QVariantMap notificationParameters() const; + void setNotificationParameters(const QVariantMap ¶meters); +private: + QSharedDataPointer d; + +#ifndef QT_NO_DATASTREAM + friend Q_POSITIONING_EXPORT QDataStream &operator<<(QDataStream &, const QGeoAreaMonitorInfo &); + friend Q_POSITIONING_EXPORT QDataStream &operator>>(QDataStream &, QGeoAreaMonitorInfo &); +#endif +}; + +#ifndef QT_NO_DEBUG_STREAM +Q_POSITIONING_EXPORT QDebug operator<<(QDebug, const QGeoAreaMonitorInfo &); +#endif + +QT_END_NAMESPACE + +#endif // QGEOAREAMONITORINFO_H diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qgeoareamonitorsource.h b/src/QtLocationPlugin/qtlocation/src/positioning/qgeoareamonitorsource.h new file mode 100644 index 0000000..1d9aa69 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qgeoareamonitorsource.h @@ -0,0 +1,102 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QGEOAREAMONITORSOURCE_H +#define QGEOAREAMONITORSOURCE_H + +#include +#include +#include + +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoPositionInfo; +class QGeoAreaMonitorSourcePrivate; +class Q_POSITIONING_EXPORT QGeoAreaMonitorSource : public QObject +{ + Q_OBJECT + +public: + enum Error { + AccessError = 0, + InsufficientPositionInfo = 1, + UnknownSourceError = 2, + NoError = 3 + }; + Q_ENUM(Error) + + enum AreaMonitorFeature { + PersistentAreaMonitorFeature = 0x00000001, + AnyAreaMonitorFeature = 0xffffffff + }; + Q_DECLARE_FLAGS(AreaMonitorFeatures, AreaMonitorFeature) + + explicit QGeoAreaMonitorSource(QObject *parent); + virtual ~QGeoAreaMonitorSource(); + + static QGeoAreaMonitorSource *createDefaultSource(QObject *parent); + static QGeoAreaMonitorSource *createSource(const QString& sourceName, QObject *parent); + static QStringList availableSources(); + + virtual void setPositionInfoSource(QGeoPositionInfoSource *source); + virtual QGeoPositionInfoSource* positionInfoSource() const; + + QString sourceName() const; + + virtual Error error() const = 0; + virtual AreaMonitorFeatures supportedAreaMonitorFeatures() const = 0; + + virtual bool startMonitoring(const QGeoAreaMonitorInfo &monitor) = 0; + virtual bool stopMonitoring(const QGeoAreaMonitorInfo &monitor) = 0; + virtual bool requestUpdate(const QGeoAreaMonitorInfo &monitor, const char *signal) = 0; + + virtual QList activeMonitors() const = 0; + virtual QList activeMonitors(const QGeoShape &lookupArea) const = 0; + +Q_SIGNALS: + void areaEntered(const QGeoAreaMonitorInfo &monitor, const QGeoPositionInfo &update); + void areaExited(const QGeoAreaMonitorInfo &monitor, const QGeoPositionInfo &update); + void monitorExpired(const QGeoAreaMonitorInfo &monitor); + void error(QGeoAreaMonitorSource::Error error); + +private: + Q_DISABLE_COPY(QGeoAreaMonitorSource) + QGeoAreaMonitorSourcePrivate *d; +}; + + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qgeocircle.h b/src/QtLocationPlugin/qtlocation/src/positioning/qgeocircle.h new file mode 100644 index 0000000..9d2828c --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qgeocircle.h @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOCIRCLE_H +#define QGEOCIRCLE_H + +#include + +QT_BEGIN_NAMESPACE + +class QGeoCoordinate; +class QGeoCirclePrivate; + +class Q_POSITIONING_EXPORT QGeoCircle : public QGeoShape +{ + Q_GADGET + Q_PROPERTY(QGeoCoordinate center READ center WRITE setCenter) + Q_PROPERTY(qreal radius READ radius WRITE setRadius) + +public: + QGeoCircle(); + QGeoCircle(const QGeoCoordinate ¢er, qreal radius = -1.0); + QGeoCircle(const QGeoCircle &other); + QGeoCircle(const QGeoShape &other); + + ~QGeoCircle(); + + QGeoCircle &operator=(const QGeoCircle &other); + + using QGeoShape::operator==; + bool operator==(const QGeoCircle &other) const; + + using QGeoShape::operator!=; + bool operator!=(const QGeoCircle &other) const; + + void setCenter(const QGeoCoordinate ¢er); + QGeoCoordinate center() const; + + void setRadius(qreal radius); + qreal radius() const; + + void translate(double degreesLatitude, double degreesLongitude); + QGeoCircle translated(double degreesLatitude, double degreesLongitude) const; + + Q_INVOKABLE QString toString() const; + +private: + inline QGeoCirclePrivate *d_func(); + inline const QGeoCirclePrivate *d_func() const; +}; + +Q_DECLARE_TYPEINFO(QGeoCircle, Q_MOVABLE_TYPE); + +QT_END_NAMESPACE + +Q_DECLARE_METATYPE(QGeoCircle) + +#endif + diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qgeocircle_p.h b/src/QtLocationPlugin/qtlocation/src/positioning/qgeocircle_p.h new file mode 100644 index 0000000..c3c6333 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qgeocircle_p.h @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOCIRCLE_P_H +#define QGEOCIRCLE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qgeoshape_p.h" +#include "qgeocoordinate.h" + +QT_BEGIN_NAMESPACE + +class QGeoCirclePrivate : public QGeoShapePrivate +{ +public: + QGeoCirclePrivate(); + QGeoCirclePrivate(const QGeoCoordinate ¢er, qreal radius); + QGeoCirclePrivate(const QGeoCirclePrivate &other); + ~QGeoCirclePrivate(); + + bool isValid() const Q_DECL_OVERRIDE; + bool isEmpty() const Q_DECL_OVERRIDE; + bool contains(const QGeoCoordinate &coordinate) const Q_DECL_OVERRIDE; + + QGeoCoordinate center() const Q_DECL_OVERRIDE; + + void extendShape(const QGeoCoordinate &coordinate) Q_DECL_OVERRIDE; + + QGeoShapePrivate *clone() const Q_DECL_OVERRIDE; + + bool operator==(const QGeoShapePrivate &other) const Q_DECL_OVERRIDE; + + QGeoCoordinate m_center; + qreal radius; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qgeocoordinate.h b/src/QtLocationPlugin/qtlocation/src/positioning/qgeocoordinate.h new file mode 100644 index 0000000..a1a636d --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qgeocoordinate.h @@ -0,0 +1,127 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOCOORDINATE_H +#define QGEOCOORDINATE_H + +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QDebug; +class QDataStream; + +class QGeoCoordinatePrivate; +class Q_POSITIONING_EXPORT QGeoCoordinate +{ + Q_GADGET + + Q_PROPERTY(double latitude READ latitude WRITE setLatitude) + Q_PROPERTY(double longitude READ longitude WRITE setLongitude) + Q_PROPERTY(double altitude READ altitude WRITE setAltitude) + Q_PROPERTY(bool isValid READ isValid) + +public: + + enum CoordinateType { + InvalidCoordinate, + Coordinate2D, + Coordinate3D + }; + + enum CoordinateFormat { + Degrees, + DegreesWithHemisphere, + DegreesMinutes, + DegreesMinutesWithHemisphere, + DegreesMinutesSeconds, + DegreesMinutesSecondsWithHemisphere + }; + + QGeoCoordinate(); + QGeoCoordinate(double latitude, double longitude); + QGeoCoordinate(double latitude, double longitude, double altitude); + QGeoCoordinate(const QGeoCoordinate &other); + ~QGeoCoordinate(); + + QGeoCoordinate &operator=(const QGeoCoordinate &other); + + bool operator==(const QGeoCoordinate &other) const; + inline bool operator!=(const QGeoCoordinate &other) const { + return !operator==(other); + } + + bool isValid() const; + CoordinateType type() const; + + void setLatitude(double latitude); + double latitude() const; + + void setLongitude(double longitude); + double longitude() const; + + void setAltitude(double altitude); + double altitude() const; + + Q_INVOKABLE qreal distanceTo(const QGeoCoordinate &other) const; + Q_INVOKABLE qreal azimuthTo(const QGeoCoordinate &other) const; + + Q_INVOKABLE QGeoCoordinate atDistanceAndAzimuth(qreal distance, qreal azimuth, qreal distanceUp = 0.0) const; + + Q_INVOKABLE QString toString(CoordinateFormat format = DegreesMinutesSecondsWithHemisphere) const; + +private: + QSharedDataPointer d; + + friend class QGeoCoordinatePrivate; +}; + +Q_DECLARE_TYPEINFO(QGeoCoordinate, Q_MOVABLE_TYPE); + +#ifndef QT_NO_DEBUG_STREAM +Q_POSITIONING_EXPORT QDebug operator<<(QDebug, const QGeoCoordinate &); +#endif + +#ifndef QT_NO_DATASTREAM +Q_POSITIONING_EXPORT QDataStream &operator<<(QDataStream &stream, const QGeoCoordinate &coordinate); +Q_POSITIONING_EXPORT QDataStream &operator>>(QDataStream &stream, QGeoCoordinate &coordinate); +#endif + +QT_END_NAMESPACE + +Q_DECLARE_METATYPE(QGeoCoordinate) + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qgeocoordinate_p.h b/src/QtLocationPlugin/qtlocation/src/positioning/qgeocoordinate_p.h new file mode 100644 index 0000000..b9304b0 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qgeocoordinate_p.h @@ -0,0 +1,71 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOCOORDINATE_P_H +#define QGEOCOORDINATE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include "qgeocoordinate.h" + +QT_BEGIN_NAMESPACE + +class QGeoCoordinatePrivate : public QSharedData +{ +public: + QGeoCoordinatePrivate(); + QGeoCoordinatePrivate(const QGeoCoordinatePrivate &other); + ~QGeoCoordinatePrivate(); + + double lat; + double lng; + double alt; + + static void atDistanceAndAzimuth(const QGeoCoordinate &coord, + qreal distance, qreal azimuth, + double *lon, double *lat); +}; + +QT_END_NAMESPACE + +#endif // QGEOCOORDINATE_P_H diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qgeolocation.h b/src/QtLocationPlugin/qtlocation/src/positioning/qgeolocation.h new file mode 100644 index 0000000..579a2a4 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qgeolocation.h @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOLOCATION_H +#define QGEOLOCATION_H + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoAddress; +class QGeoCoordinate; +class QGeoRectangle; +class QGeoLocationPrivate; + +class Q_POSITIONING_EXPORT QGeoLocation +{ +public: + QGeoLocation(); + QGeoLocation(const QGeoLocation &other); + + ~QGeoLocation(); + + QGeoLocation &operator=(const QGeoLocation &other); + + bool operator==(const QGeoLocation &other) const; + bool operator!=(const QGeoLocation &other) const { + return !(other == *this); + } + + QGeoAddress address() const; + void setAddress(const QGeoAddress &address); + QGeoCoordinate coordinate() const; + void setCoordinate(const QGeoCoordinate &position); + QGeoRectangle boundingBox() const; + void setBoundingBox(const QGeoRectangle &box); + + bool isEmpty() const; + +private: + QSharedDataPointer d; +}; + +Q_DECLARE_TYPEINFO(QGeoLocation, Q_MOVABLE_TYPE); + +QT_END_NAMESPACE + +Q_DECLARE_METATYPE(QGeoLocation) + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qgeolocation_p.h b/src/QtLocationPlugin/qtlocation/src/positioning/qgeolocation_p.h new file mode 100644 index 0000000..cafcafe --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qgeolocation_p.h @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOLOCATION_P_H +#define QGEOLOCATION_P_H + +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoLocationPrivate : public QSharedData +{ +public: + QGeoLocationPrivate(); + QGeoLocationPrivate(const QGeoLocationPrivate &other); + + ~QGeoLocationPrivate(); + + bool operator==(const QGeoLocationPrivate &other) const; + + bool isEmpty() const; + + QGeoAddress address; + QGeoCoordinate coordinate; + QGeoRectangle viewport; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qgeopositioninfo.h b/src/QtLocationPlugin/qtlocation/src/positioning/qgeopositioninfo.h new file mode 100644 index 0000000..0d17f70 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qgeopositioninfo.h @@ -0,0 +1,107 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QGEOPOSITIONINFO_H +#define QGEOPOSITIONINFO_H + +#include + +#include + +QT_BEGIN_NAMESPACE + +class QDebug; +class QDataStream; + +class QGeoPositionInfoPrivate; +class Q_POSITIONING_EXPORT QGeoPositionInfo +{ +public: + enum Attribute { + Direction, + GroundSpeed, + VerticalSpeed, + MagneticVariation, + HorizontalAccuracy, + VerticalAccuracy + }; + + QGeoPositionInfo(); + QGeoPositionInfo(const QGeoCoordinate &coordinate, const QDateTime &updateTime); + QGeoPositionInfo(const QGeoPositionInfo &other); + ~QGeoPositionInfo(); + + QGeoPositionInfo &operator=(const QGeoPositionInfo &other); + + bool operator==(const QGeoPositionInfo &other) const; + inline bool operator!=(const QGeoPositionInfo &other) const { + return !operator==(other); + } + + bool isValid() const; + + void setTimestamp(const QDateTime ×tamp); + QDateTime timestamp() const; + + void setCoordinate(const QGeoCoordinate &coordinate); + QGeoCoordinate coordinate() const; + + void setAttribute(Attribute attribute, qreal value); + qreal attribute(Attribute attribute) const; + void removeAttribute(Attribute attribute); + bool hasAttribute(Attribute attribute) const; + +private: +#ifndef QT_NO_DEBUG_STREAM + friend Q_POSITIONING_EXPORT QDebug operator<<(QDebug dbg, const QGeoPositionInfo &info); +#endif +#ifndef QT_NO_DATASTREAM + friend Q_POSITIONING_EXPORT QDataStream &operator<<(QDataStream &stream, const QGeoPositionInfo &info); + friend Q_POSITIONING_EXPORT QDataStream &operator>>(QDataStream &stream, QGeoPositionInfo &info); +#endif + QGeoPositionInfoPrivate *d; +}; + +#ifndef QT_NO_DEBUG_STREAM +Q_POSITIONING_EXPORT QDebug operator<<(QDebug dbg, const QGeoPositionInfo &info); +#endif + +#ifndef QT_NO_DATASTREAM +Q_POSITIONING_EXPORT QDataStream &operator<<(QDataStream &stream, QGeoPositionInfo::Attribute attr); +Q_POSITIONING_EXPORT QDataStream &operator>>(QDataStream &stream, QGeoPositionInfo::Attribute &attr); +Q_POSITIONING_EXPORT QDataStream &operator<<(QDataStream &stream, const QGeoPositionInfo &info); +Q_POSITIONING_EXPORT QDataStream &operator>>(QDataStream &stream, QGeoPositionInfo &info); +#endif + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qgeopositioninfosource.h b/src/QtLocationPlugin/qtlocation/src/positioning/qgeopositioninfosource.h new file mode 100644 index 0000000..18f2fb0 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qgeopositioninfosource.h @@ -0,0 +1,108 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QGEOPOSITIONINFOSOURCE_H +#define QGEOPOSITIONINFOSOURCE_H + +#include + +#include + +QT_BEGIN_NAMESPACE + +class QGeoPositionInfoSourcePrivate; +class Q_POSITIONING_EXPORT QGeoPositionInfoSource : public QObject +{ + Q_OBJECT + Q_PROPERTY(int updateInterval READ updateInterval WRITE setUpdateInterval) + Q_PROPERTY(int minimumUpdateInterval READ minimumUpdateInterval) + Q_PROPERTY(QString sourceName READ sourceName) + +public: + enum Error { + AccessError = 0, + ClosedError = 1, + UnknownSourceError = 2, + NoError = 3 + }; + Q_ENUM(Error) + + enum PositioningMethod { + NoPositioningMethods = 0x00000000, + SatellitePositioningMethods = 0x000000ff, + NonSatellitePositioningMethods = 0xffffff00, + AllPositioningMethods = 0xffffffff + }; + Q_DECLARE_FLAGS(PositioningMethods, PositioningMethod) + + explicit QGeoPositionInfoSource(QObject *parent); + virtual ~QGeoPositionInfoSource(); + + virtual void setUpdateInterval(int msec); + int updateInterval() const; + + virtual void setPreferredPositioningMethods(PositioningMethods methods); + PositioningMethods preferredPositioningMethods() const; + + virtual QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const = 0; + + virtual PositioningMethods supportedPositioningMethods() const = 0; + virtual int minimumUpdateInterval() const = 0; + + QString sourceName() const; + + static QGeoPositionInfoSource *createDefaultSource(QObject *parent); + static QGeoPositionInfoSource *createSource(const QString &sourceName, QObject *parent); + static QStringList availableSources(); + virtual Error error() const = 0; + +public Q_SLOTS: + virtual void startUpdates() = 0; + virtual void stopUpdates() = 0; + + virtual void requestUpdate(int timeout = 0) = 0; + +Q_SIGNALS: + void positionUpdated(const QGeoPositionInfo &update); + void updateTimeout(); + void error(QGeoPositionInfoSource::Error); + +private: + Q_DISABLE_COPY(QGeoPositionInfoSource) + QGeoPositionInfoSourcePrivate *d; +}; + +Q_DECLARE_OPERATORS_FOR_FLAGS(QGeoPositionInfoSource::PositioningMethods) + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qgeopositioninfosource_p.h b/src/QtLocationPlugin/qtlocation/src/positioning/qgeopositioninfosource_p.h new file mode 100644 index 0000000..aedf331 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qgeopositioninfosource_p.h @@ -0,0 +1,65 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOPOSITIONINFOSOURCE_P_H +#define QGEOPOSITIONINFOSOURCE_P_H + +#include "qgeopositioninfosource.h" +#include "qgeopositioninfosourcefactory.h" +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoPositionInfoSourcePrivate +{ +public: + int interval; + QGeoPositionInfoSource::PositioningMethods methods; + QJsonObject metaData; + QGeoPositionInfoSourceFactory *factory; + QString providerName; + + void loadMeta(); + void loadPlugin(); + + static QHash plugins(bool reload = false); + static void loadPluginMetadata(QHash &list); + static QList pluginsSorted(); +}; + +QT_END_NAMESPACE + +#endif // QGEOPOSITIONINFOSOURCE_P_H diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qgeopositioninfosourcefactory.h b/src/QtLocationPlugin/qtlocation/src/positioning/qgeopositioninfosourcefactory.h new file mode 100644 index 0000000..34c644f --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qgeopositioninfosourcefactory.h @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOPOSITIONINFOSOURCEFACTORY_H +#define QGEOPOSITIONINFOSOURCEFACTORY_H + +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Q_POSITIONING_EXPORT QGeoPositionInfoSourceFactory +{ +public: + virtual ~QGeoPositionInfoSourceFactory(); + + virtual QGeoPositionInfoSource *positionInfoSource(QObject *parent) = 0; + virtual QGeoSatelliteInfoSource *satelliteInfoSource(QObject *parent) = 0; + virtual QGeoAreaMonitorSource *areaMonitor(QObject *parent) = 0; +}; + +#define QT_POSITION_SOURCE_INTERFACE +Q_DECLARE_INTERFACE(QGeoPositionInfoSourceFactory, + "org.qt-project.qt.position.sourcefactory/5.0") + +QT_END_NAMESPACE + +#endif // QGEOPOSITIONINFOSOURCEFACTORY_H diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qgeoprojection_p.h b/src/QtLocationPlugin/qtlocation/src/positioning/qgeoprojection_p.h new file mode 100644 index 0000000..f1b3252 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qgeoprojection_p.h @@ -0,0 +1,77 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QGEOPROJECTION_P_H +#define QGEOPROJECTION_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#ifndef M_PI +#define M_PI (3.14159265358979323846) +#endif + +#include +#include +#include "qpositioningglobal.h" + +QT_BEGIN_NAMESPACE + +class QGeoCoordinate; +class QDoubleVector2D; + +Q_POSITIONING_EXPORT QVariant geoCoordinateInterpolator(const QGeoCoordinate &from, + const QGeoCoordinate &to, + qreal progress); + +class Q_POSITIONING_EXPORT QGeoProjection +{ +public: + static QDoubleVector2D coordToMercator(const QGeoCoordinate &coord); + static QGeoCoordinate mercatorToCoord(const QDoubleVector2D &mercator); + static QGeoCoordinate coordinateInterpolation(const QGeoCoordinate &from, const QGeoCoordinate &to, qreal progress); + +private: + static double realmod(const double a, const double b); +}; + +QT_END_NAMESPACE + +#endif // QGEOPROJECTION_P_H diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qgeorectangle.h b/src/QtLocationPlugin/qtlocation/src/positioning/qgeorectangle.h new file mode 100644 index 0000000..b39b532 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qgeorectangle.h @@ -0,0 +1,124 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEORECTANGLE_H +#define QGEORECTANGLE_H + +#include + +QT_BEGIN_NAMESPACE + +class QGeoCoordinate; +class QGeoRectanglePrivate; + +class Q_POSITIONING_EXPORT QGeoRectangle : public QGeoShape +{ + Q_GADGET + Q_PROPERTY(QGeoCoordinate bottomLeft READ bottomLeft WRITE setBottomLeft) + Q_PROPERTY(QGeoCoordinate bottomRight READ bottomRight WRITE setBottomRight) + Q_PROPERTY(QGeoCoordinate topLeft READ topLeft WRITE setTopLeft) + Q_PROPERTY(QGeoCoordinate topRight READ topRight WRITE setTopRight) + Q_PROPERTY(QGeoCoordinate center READ center WRITE setCenter) + Q_PROPERTY(double height READ height WRITE setHeight) + Q_PROPERTY(double width READ width WRITE setWidth) + +public: + QGeoRectangle(); + QGeoRectangle(const QGeoCoordinate ¢er, double degreesWidth, double degreesHeight); + QGeoRectangle(const QGeoCoordinate &topLeft, const QGeoCoordinate &bottomRight); + QGeoRectangle(const QList &coordinates); + QGeoRectangle(const QGeoRectangle &other); + QGeoRectangle(const QGeoShape &other); + + ~QGeoRectangle(); + + QGeoRectangle &operator=(const QGeoRectangle &other); + + using QGeoShape::operator==; + bool operator==(const QGeoRectangle &other) const; + + using QGeoShape::operator!=; + bool operator!=(const QGeoRectangle &other) const; + + void setTopLeft(const QGeoCoordinate &topLeft); + QGeoCoordinate topLeft() const; + + void setTopRight(const QGeoCoordinate &topRight); + QGeoCoordinate topRight() const; + + void setBottomLeft(const QGeoCoordinate &bottomLeft); + QGeoCoordinate bottomLeft() const; + + void setBottomRight(const QGeoCoordinate &bottomRight); + QGeoCoordinate bottomRight() const; + + void setCenter(const QGeoCoordinate ¢er); + QGeoCoordinate center() const; + + void setWidth(double degreesWidth); + double width() const; + + void setHeight(double degreesHeight); + double height() const; + + using QGeoShape::contains; + bool contains(const QGeoRectangle &rectangle) const; + bool intersects(const QGeoRectangle &rectangle) const; + + void translate(double degreesLatitude, double degreesLongitude); + QGeoRectangle translated(double degreesLatitude, double degreesLongitude) const; + + QGeoRectangle united(const QGeoRectangle &rectangle) const; + QGeoRectangle operator|(const QGeoRectangle &rectangle) const; + QGeoRectangle &operator|=(const QGeoRectangle &rectangle); + + Q_INVOKABLE QString toString() const; + +private: + inline QGeoRectanglePrivate *d_func(); + inline const QGeoRectanglePrivate *d_func() const; +}; + +Q_DECLARE_TYPEINFO(QGeoRectangle, Q_MOVABLE_TYPE); + +inline QGeoRectangle QGeoRectangle::operator|(const QGeoRectangle &rectangle) const +{ + return united(rectangle); +} + +QT_END_NAMESPACE + +Q_DECLARE_METATYPE(QGeoRectangle) + +#endif + diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qgeorectangle_p.h b/src/QtLocationPlugin/qtlocation/src/positioning/qgeorectangle_p.h new file mode 100644 index 0000000..36c79b1 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qgeorectangle_p.h @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEORECTANGLE_P_H +#define QGEORECTANGLE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qgeoshape_p.h" +#include "qgeocoordinate.h" + +QT_BEGIN_NAMESPACE + +class QGeoRectanglePrivate : public QGeoShapePrivate +{ +public: + QGeoRectanglePrivate(); + QGeoRectanglePrivate(const QGeoCoordinate &topLeft, const QGeoCoordinate &bottomRight); + QGeoRectanglePrivate(const QGeoRectanglePrivate &other); + ~QGeoRectanglePrivate(); + + bool isValid() const Q_DECL_OVERRIDE; + bool isEmpty() const Q_DECL_OVERRIDE; + bool contains(const QGeoCoordinate &coordinate) const Q_DECL_OVERRIDE; + + QGeoCoordinate center() const Q_DECL_OVERRIDE; + + void extendShape(const QGeoCoordinate &coordinate) Q_DECL_OVERRIDE; + + QGeoShapePrivate *clone() const Q_DECL_OVERRIDE; + + bool operator==(const QGeoShapePrivate &other) const Q_DECL_OVERRIDE; + + QGeoCoordinate topLeft; + QGeoCoordinate bottomRight; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qgeosatelliteinfo.h b/src/QtLocationPlugin/qtlocation/src/positioning/qgeosatelliteinfo.h new file mode 100644 index 0000000..0c203a5 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qgeosatelliteinfo.h @@ -0,0 +1,106 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QGEOSATELLITEINFO_H +#define QGEOSATELLITEINFO_H + +#include + +QT_BEGIN_NAMESPACE + +class QDebug; +class QDataStream; + +class QGeoSatelliteInfoPrivate; +class Q_POSITIONING_EXPORT QGeoSatelliteInfo +{ +public: + enum Attribute { + Elevation, + Azimuth + }; + + enum SatelliteSystem { + Undefined = 0x00, + GPS = 0x01, + GLONASS = 0x02 + }; + + QGeoSatelliteInfo(); + QGeoSatelliteInfo(const QGeoSatelliteInfo &other); + ~QGeoSatelliteInfo(); + + QGeoSatelliteInfo &operator=(const QGeoSatelliteInfo &other); + + bool operator==(const QGeoSatelliteInfo &other) const; + inline bool operator!=(const QGeoSatelliteInfo &other) const { + return !operator==(other); + } + + void setSatelliteSystem(SatelliteSystem system); + SatelliteSystem satelliteSystem() const; + + void setSatelliteIdentifier(int satId); + int satelliteIdentifier() const; + + void setSignalStrength(int signalStrength); + int signalStrength() const; + + void setAttribute(Attribute attribute, qreal value); + qreal attribute(Attribute attribute) const; + void removeAttribute(Attribute attribute); + + bool hasAttribute(Attribute attribute) const; + +private: +#ifndef QT_NO_DEBUG_STREAM + friend Q_POSITIONING_EXPORT QDebug operator<<(QDebug dbg, const QGeoSatelliteInfo &info); +#endif +#ifndef QT_NO_DATASTREAM + friend Q_POSITIONING_EXPORT QDataStream &operator<<(QDataStream &stream, const QGeoSatelliteInfo &info); + friend Q_POSITIONING_EXPORT QDataStream &operator>>(QDataStream &stream, QGeoSatelliteInfo &info); +#endif + QGeoSatelliteInfoPrivate *d; +}; + +#ifndef QT_NO_DEBUG_STREAM +Q_POSITIONING_EXPORT QDebug operator<<(QDebug dbg, const QGeoSatelliteInfo &info); +#endif + +#ifndef QT_NO_DATASTREAM +Q_POSITIONING_EXPORT QDataStream &operator<<(QDataStream &stream, const QGeoSatelliteInfo &info); +Q_POSITIONING_EXPORT QDataStream &operator>>(QDataStream &stream, QGeoSatelliteInfo &info); +#endif + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qgeosatelliteinfosource.h b/src/QtLocationPlugin/qtlocation/src/positioning/qgeosatelliteinfosource.h new file mode 100644 index 0000000..07121c7 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qgeosatelliteinfosource.h @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QGEOSATELLITEINFOSOURCE_H +#define QGEOSATELLITEINFOSOURCE_H + +#include + +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoSatelliteInfoSourcePrivate; +class Q_POSITIONING_EXPORT QGeoSatelliteInfoSource : public QObject +{ + Q_OBJECT + Q_PROPERTY(int updateInterval READ updateInterval WRITE setUpdateInterval) + Q_PROPERTY(int minimumUpdateInterval READ minimumUpdateInterval) + +public: + enum Error { + AccessError = 0, + ClosedError = 1, + NoError = 2, + UnknownSourceError = -1 + }; + Q_ENUM(Error) + + explicit QGeoSatelliteInfoSource(QObject *parent); + virtual ~QGeoSatelliteInfoSource(); + + static QGeoSatelliteInfoSource *createDefaultSource(QObject *parent); + static QGeoSatelliteInfoSource *createSource(const QString &sourceName, QObject *parent); + static QStringList availableSources(); + + QString sourceName() const; + + virtual void setUpdateInterval(int msec); + int updateInterval() const; + virtual int minimumUpdateInterval() const = 0; + virtual Error error() const = 0; + +public Q_SLOTS: + virtual void startUpdates() = 0; + virtual void stopUpdates() = 0; + + virtual void requestUpdate(int timeout = 0) = 0; + +Q_SIGNALS: + void satellitesInViewUpdated(const QList &satellites); + void satellitesInUseUpdated(const QList &satellites); + void requestTimeout(); + void error(QGeoSatelliteInfoSource::Error); + +private: + Q_DISABLE_COPY(QGeoSatelliteInfoSource) + QGeoSatelliteInfoSourcePrivate *d; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qgeoshape.h b/src/QtLocationPlugin/qtlocation/src/positioning/qgeoshape.h new file mode 100644 index 0000000..23d9de2 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qgeoshape.h @@ -0,0 +1,106 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOSHAPE_H +#define QGEOSHAPE_H + +#include +#include + +QT_BEGIN_NAMESPACE + +class QDebug; +class QGeoShapePrivate; + +class Q_POSITIONING_EXPORT QGeoShape +{ + Q_GADGET + Q_PROPERTY(ShapeType type READ type) + Q_PROPERTY(bool isValid READ isValid) + Q_PROPERTY(bool isEmpty READ isEmpty) + Q_ENUM(ShapeType) + +public: + QGeoShape(); + QGeoShape(const QGeoShape &other); + ~QGeoShape(); + + enum ShapeType { + UnknownType, + RectangleType, + CircleType + }; + + ShapeType type() const; + + bool isValid() const; + bool isEmpty() const; + Q_INVOKABLE bool contains(const QGeoCoordinate &coordinate) const; + + QGeoCoordinate center() const; + + void extendShape(const QGeoCoordinate &coordinate); + + bool operator==(const QGeoShape &other) const; + bool operator!=(const QGeoShape &other) const; + + QGeoShape &operator=(const QGeoShape &other); + + Q_INVOKABLE QString toString() const; +protected: + QGeoShape(QGeoShapePrivate *d); + + QSharedDataPointer d_ptr; + +private: + inline QGeoShapePrivate *d_func(); + inline const QGeoShapePrivate *d_func() const; +}; + +Q_DECLARE_TYPEINFO(QGeoShape, Q_MOVABLE_TYPE); + +#ifndef QT_NO_DEBUG_STREAM +Q_POSITIONING_EXPORT QDebug operator<<(QDebug, const QGeoShape &); +#endif + +#ifndef QT_NO_DATASTREAM +Q_POSITIONING_EXPORT QDataStream &operator<<(QDataStream &stream, const QGeoShape &shape); +Q_POSITIONING_EXPORT QDataStream &operator>>(QDataStream &stream, QGeoShape &shape); +#endif + +QT_END_NAMESPACE + +Q_DECLARE_METATYPE(QGeoShape) + +#endif + diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qgeoshape_p.h b/src/QtLocationPlugin/qtlocation/src/positioning/qgeoshape_p.h new file mode 100644 index 0000000..ef6f400 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qgeoshape_p.h @@ -0,0 +1,86 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOSHAPE_P_H +#define QGEOSHAPE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include + +#include "qgeoshape.h" + +QT_BEGIN_NAMESPACE + +class QGeoShapePrivate : public QSharedData +{ +public: + explicit QGeoShapePrivate(QGeoShape::ShapeType type); + virtual ~QGeoShapePrivate(); + + virtual bool isValid() const = 0; + virtual bool isEmpty() const = 0; + virtual bool contains(const QGeoCoordinate &coordinate) const = 0; + + virtual QGeoCoordinate center() const = 0; + + virtual void extendShape(const QGeoCoordinate &coordinate) = 0; + + virtual QGeoShapePrivate *clone() const = 0; + + virtual bool operator==(const QGeoShapePrivate &other) const; + + QGeoShape::ShapeType type; +}; + +// don't use the copy constructor when detaching from a QSharedDataPointer, use virtual clone() +// call instead. +template <> +Q_INLINE_TEMPLATE QGeoShapePrivate *QSharedDataPointer::clone() +{ + return d->clone(); +} + +QT_END_NAMESPACE + +#endif + diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qlocationutils_p.h b/src/QtLocationPlugin/qtlocation/src/positioning/qlocationutils_p.h new file mode 100644 index 0000000..8c39463 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qlocationutils_p.h @@ -0,0 +1,112 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QLOCATIONUTILS_P_H +#define QLOCATIONUTILS_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include + +QT_BEGIN_NAMESPACE +class QTime; +class QByteArray; + +class QGeoPositionInfo; +class QLocationUtils +{ +public: + inline static bool isValidLat(double lat) { + return lat >= -90 && lat <= 90; + } + inline static bool isValidLong(double lng) { + return lng >= -180 && lng <= 180; + } + + inline static double clipLat(double lat) { + if (lat > 90) + lat = 90; + else if (lat < -90) + lat = -90; + return lat; + } + + inline static double wrapLong(double lng) { + if (lng > 180) + lng -= 360; + else if (lng < -180) + lng += 360; + return lng; + } + + /* + Creates a QGeoPositionInfo from a GGA, GLL, RMC, VTG or ZDA sentence. + + Note: + - GGA and GLL sentences have time but not date so the update's + QDateTime object will have an invalid date. + - RMC reports date with a two-digit year so in this case the year + is assumed to be after the year 2000. + */ + Q_AUTOTEST_EXPORT static bool getPosInfoFromNmea(const char *data, int size, + QGeoPositionInfo *info, double uere, + bool *hasFix = 0); + + /* + Returns true if the given NMEA sentence has a valid checksum. + */ + Q_AUTOTEST_EXPORT static bool hasValidNmeaChecksum(const char *data, int size); + + /* + Returns time from a string in hhmmss or hhmmss.z+ format. + */ + Q_AUTOTEST_EXPORT static bool getNmeaTime(const QByteArray &bytes, QTime *time); + + /* + Accepts for example ("2734.7964", 'S', "15306.0124", 'E') and returns the + lat-long values. Fails if lat or long fail isValidLat() or isValidLong(). + */ + Q_AUTOTEST_EXPORT static bool getNmeaLatLong(const QByteArray &latString, char latDirection, const QByteArray &lngString, char lngDirection, double *lat, double *lon); +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qnmeapositioninfosource.h b/src/QtLocationPlugin/qtlocation/src/positioning/qnmeapositioninfosource.h new file mode 100644 index 0000000..9bb67c9 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qnmeapositioninfosource.h @@ -0,0 +1,91 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QNMEAPOSITIONINFOSOURCE_H +#define QNMEAPOSITIONINFOSOURCE_H + +#include + +QT_BEGIN_NAMESPACE + +class QIODevice; + +class QNmeaPositionInfoSourcePrivate; +class Q_POSITIONING_EXPORT QNmeaPositionInfoSource : public QGeoPositionInfoSource +{ + Q_OBJECT +public: + enum UpdateMode { + RealTimeMode = 1, + SimulationMode + }; + + explicit QNmeaPositionInfoSource(UpdateMode updateMode, QObject *parent = 0); + ~QNmeaPositionInfoSource(); + + void setUserEquivalentRangeError(double uere); + double userEquivalentRangeError() const; + + UpdateMode updateMode() const; + + void setDevice(QIODevice *source); + QIODevice *device() const; + + void setUpdateInterval(int msec); + + QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const; + PositioningMethods supportedPositioningMethods() const; + int minimumUpdateInterval() const; + Error error() const; + + +public Q_SLOTS: + void startUpdates(); + void stopUpdates(); + void requestUpdate(int timeout = 0); + +protected: + virtual bool parsePosInfoFromNmeaData(const char *data, + int size, + QGeoPositionInfo *posInfo, + bool *hasFix); + +private: + Q_DISABLE_COPY(QNmeaPositionInfoSource) + friend class QNmeaPositionInfoSourcePrivate; + QNmeaPositionInfoSourcePrivate *d; + void setError(QGeoPositionInfoSource::Error positionError); +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qnmeapositioninfosource_p.h b/src/QtLocationPlugin/qtlocation/src/positioning/qnmeapositioninfosource_p.h new file mode 100644 index 0000000..069f9d2 --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qnmeapositioninfosource_p.h @@ -0,0 +1,171 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QNMEAPOSITIONINFOSOURCE_P_H +#define QNMEAPOSITIONINFOSOURCE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qnmeapositioninfosource.h" +#include "qgeopositioninfo.h" + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QBasicTimer; +class QTimerEvent; +class QTimer; + +class QNmeaReader; +struct QPendingGeoPositionInfo +{ + QGeoPositionInfo info; + bool hasFix; +}; + + +class QNmeaPositionInfoSourcePrivate : public QObject +{ + Q_OBJECT +public: + QNmeaPositionInfoSourcePrivate(QNmeaPositionInfoSource *parent, QNmeaPositionInfoSource::UpdateMode updateMode); + ~QNmeaPositionInfoSourcePrivate(); + + void startUpdates(); + void stopUpdates(); + void requestUpdate(int msec); + + bool parsePosInfoFromNmeaData(const char *data, + int size, + QGeoPositionInfo *posInfo, + bool *hasFix); + + void notifyNewUpdate(QGeoPositionInfo *update, bool fixStatus); + + QNmeaPositionInfoSource::UpdateMode m_updateMode; + QPointer m_device; + QGeoPositionInfo m_lastUpdate; + bool m_invokedStart; + QGeoPositionInfoSource::Error m_positionError; + double m_userEquivalentRangeError; + +public Q_SLOTS: + void readyRead(); + +protected: + void timerEvent(QTimerEvent *event); + +private Q_SLOTS: + void emitPendingUpdate(); + void sourceDataClosed(); + void updateRequestTimeout(); + +private: + bool openSourceDevice(); + bool initialize(); + void prepareSourceDevice(); + void emitUpdated(const QGeoPositionInfo &update); + + QNmeaPositionInfoSource *m_source; + QNmeaReader *m_nmeaReader; + QBasicTimer *m_updateTimer; + QGeoPositionInfo m_pendingUpdate; + QDate m_currentDate; + QTimer *m_requestTimer; + qreal m_horizontalAccuracy; + qreal m_verticalAccuracy; + bool m_noUpdateLastInterval; + bool m_updateTimeoutSent; + bool m_connectedReadyRead; +}; + + +class QNmeaReader +{ +public: + explicit QNmeaReader(QNmeaPositionInfoSourcePrivate *sourcePrivate) + : m_proxy(sourcePrivate) {} + virtual ~QNmeaReader() {} + + virtual void readAvailableData() = 0; + +protected: + QNmeaPositionInfoSourcePrivate *m_proxy; +}; + + +class QNmeaRealTimeReader : public QNmeaReader +{ +public: + explicit QNmeaRealTimeReader(QNmeaPositionInfoSourcePrivate *sourcePrivate); + virtual void readAvailableData(); +}; + + +class QNmeaSimulatedReader : public QObject, public QNmeaReader +{ + Q_OBJECT +public: + explicit QNmeaSimulatedReader(QNmeaPositionInfoSourcePrivate *sourcePrivate); + ~QNmeaSimulatedReader(); + virtual void readAvailableData(); + +protected: + virtual void timerEvent(QTimerEvent *event); + +private Q_SLOTS: + void simulatePendingUpdate(); + +private: + bool setFirstDateTime(); + void processNextSentence(); + + QQueue m_pendingUpdates; + int m_currTimerId; + bool m_hasValidDateTime; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/QtLocationPlugin/qtlocation/src/positioning/qpositioningglobal.h b/src/QtLocationPlugin/qtlocation/src/positioning/qpositioningglobal.h new file mode 100644 index 0000000..6e1e65e --- /dev/null +++ b/src/QtLocationPlugin/qtlocation/src/positioning/qpositioningglobal.h @@ -0,0 +1,54 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the QtPositioning module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QPOSITIONINGGLOBAL_H +#define QPOSITIONINGGLOBAL_H + +#include + +QT_BEGIN_NAMESPACE + +#ifndef QT_STATIC +# if defined(QT_BUILD_POSITIONING_LIB) +# define Q_POSITIONING_EXPORT Q_DECL_EXPORT +# else +# define Q_POSITIONING_EXPORT Q_DECL_IMPORT +# endif +#else +# define Q_POSITIONING_EXPORT +#endif + + +QT_END_NAMESPACE + +#endif // QPOSITIONINGGLOBAL_H + diff --git a/src/Settings/App.SettingsGroup.json b/src/Settings/App.SettingsGroup.json index fe58bb3..115e321 100644 --- a/src/Settings/App.SettingsGroup.json +++ b/src/Settings/App.SettingsGroup.json @@ -174,18 +174,10 @@ { "name": "savePath", "shortDesc": "Application save directory", - "longDesc": "Directory to which all data files are saved/loaded from", + "longDesc": "Directory to which all data files are saved/loaded from", "type": "string", "default": "" }, -{ - "name": "androidSaveToSDCard", - "shortDesc": "Save to SD card", - "longDesc": "Application data is saved to the sd card", - "type": "bool", - "default": false, - "qgcRebootRequired": true -}, { "name": "userBrandImageIndoor", "shortDesc": "User-selected brand image", @@ -288,7 +280,7 @@ "name": "qLocaleLanguage", "shortDesc": "Language", "type": "uint32", - "enumStrings": "System,Azerbaijani (Azerbaijani),български (Bulgarian),中文 (Chinese),Nederlands (Dutch),English,Suomi (Finnish),Français (French),Deutsche (German),Ελληνικά (Greek), עברית (Hebrew),Italiano (Italian),日本語 (Japanese),한국어 (Korean),Norsk (Norwegian),Polskie (Polish),Português (Portuguese),Pусский (Russian),Español (Spanish),Svenska (Swedish),Türk (Turkish)", + "enumStrings": "System,Azerbaijani (Azerbaijani),български (Bulgarian),中文 (Chinese),Nederlands (Dutch),English,Suomi (Finnish),Français (French),Deutsche (German),Ελληνικά (Greek), עברית (Hebrew),Italiano (Italian),日本人 (Japanese),한국어 (Korean),Norsk (Norwegian),Polskie (Polish),Português (Portuguese),Pусский (Russian),Español (Spanish),Svenska (Swedish),Türk (Turkish)", "enumValues": "0,12,20,25,30,31,36,37,42,43,48,58,59,66,85,90,91,96,111,114,125", "comment": "enumValues uses Qt QLocale::Language values", "default": 0 @@ -333,13 +325,6 @@ "longDesc": "Host name to forward mavlink to. i.e: localhost:14445", "type": "string", "default": "localhost:14445" -}, -{ - "name": "forwardMavlinkAPMSupportHostName", - "shortDesc": "Ardupilot Support Host name", - "longDesc": "Ardupilot Support server to forward mavlink to. i.e: support.ardupilot.org:xxxx", - "type": "string", - "default": "support.ardupilot.org:xxxx" } ] } diff --git a/src/Settings/AppSettings.cc b/src/Settings/AppSettings.cc index 6da0652..c5b5956 100644 --- a/src/Settings/AppSettings.cc +++ b/src/Settings/AppSettings.cc @@ -12,10 +12,6 @@ #include "QGCApplication.h" #include "ParameterManager.h" -#ifdef __android__ -#include "AndroidInterface.h" -#endif - #include #include #include @@ -38,7 +34,6 @@ const char* AppSettings::logDirectory = QT_TRANSLATE_NOOP("AppSettin const char* AppSettings::videoDirectory = QT_TRANSLATE_NOOP("AppSettings", "Video"); const char* AppSettings::photoDirectory = QT_TRANSLATE_NOOP("AppSettings", "Photo"); const char* AppSettings::crashDirectory = QT_TRANSLATE_NOOP("AppSettings", "CrashLogs"); -const char* AppSettings::customActionsDirectory = QT_TRANSLATE_NOOP("AppSettings", "CustomActions"); // Release languages are 90%+ complete QList AppSettings::_rgReleaseLanguages = { @@ -99,26 +94,10 @@ DECLARE_SETTINGGROUP(App, "") QDir rootDir = QDir(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)); savePathFact->setRawValue(rootDir.absolutePath()); #else - QString rootDirPath; - #ifdef __android__ - if (androidSaveToSDCard()->rawValue().toBool()) { - rootDirPath = AndroidInterface::getSDCardPath(); - qDebug() << "AndroidInterface::getSDCardPath();" << rootDirPath; - if (rootDirPath.isEmpty() || !QDir(rootDirPath).exists()) { - rootDirPath.clear(); - qgcApp()->showAppMessage(tr("Save to SD card specified for application data. But no SD card present. Using internal storage.")); - } else if (!QFileInfo(rootDirPath).isWritable()) { - rootDirPath.clear(); - qgcApp()->showAppMessage(tr("Save to SD card specified for application data. But SD card is write protected. Using internal storage.")); - } - } - #endif - if (rootDirPath.isEmpty()) { - rootDirPath = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation); - } - savePathFact->setRawValue(QDir(rootDirPath).filePath(appName)); + QDir rootDir = QDir(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)); + savePathFact->setRawValue(rootDir.filePath(appName)); #endif - savePathFact->setVisible(false); + savePathFact->setVisible(false); #else QDir rootDir = QDir(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)); savePathFact->setRawValue(rootDir.filePath(appName)); @@ -148,7 +127,6 @@ DECLARE_SETTINGSFACT(AppSettings, virtualJoystickAutoCenterThrottle) DECLARE_SETTINGSFACT(AppSettings, appFontPointSize) DECLARE_SETTINGSFACT(AppSettings, showLargeCompass) DECLARE_SETTINGSFACT(AppSettings, savePath) -DECLARE_SETTINGSFACT(AppSettings, androidSaveToSDCard) DECLARE_SETTINGSFACT(AppSettings, useChecklist) DECLARE_SETTINGSFACT(AppSettings, enforceChecklist) DECLARE_SETTINGSFACT(AppSettings, mapboxToken) @@ -170,7 +148,6 @@ DECLARE_SETTINGSFACT(AppSettings, saveCsvTelemetry) DECLARE_SETTINGSFACT(AppSettings, firstRunPromptIdsShown) DECLARE_SETTINGSFACT(AppSettings, forwardMavlink) DECLARE_SETTINGSFACT(AppSettings, forwardMavlinkHostName) -DECLARE_SETTINGSFACT(AppSettings, forwardMavlinkAPMSupportHostName) DECLARE_SETTINGSFACT_NO_FUNC(AppSettings, indoorPalette) { @@ -240,7 +217,6 @@ void AppSettings::_checkSavePathDirectories(void) savePathDir.mkdir(videoDirectory); savePathDir.mkdir(photoDirectory); savePathDir.mkdir(crashDirectory); - savePathDir.mkdir(customActionsDirectory); } } @@ -319,16 +295,6 @@ QString AppSettings::crashSavePath(void) return QString(); } -QString AppSettings::customActionsSavePath(void) -{ - QString path = savePath()->rawValue().toString(); - if (!path.isEmpty() && QDir(path).exists()) { - QDir dir(path); - return dir.filePath(customActionsDirectory); - } - return QString(); -} - QList AppSettings::firstRunPromptsIdsVariantToList(const QVariant& firstRunPromptIds) { QList rgIds; @@ -369,7 +335,7 @@ QLocale::Language AppSettings::_qLocaleLanguageID(void) // We need to convert to the new settings key/values #if 0 // Old vales - "enumStrings": "System,български (Bulgarian),中文 (Chinese),Nederlands (Dutch),English,Suomi (Finnish),Français (French),Deutsche (German),Ελληνικά (Greek), עברית (Hebrew),Italiano (Italian),日本語 (Japanese),한국어 (Korean),Norsk (Norwegian),Polskie (Polish),Português (Portuguese),Pусский (Russian),Español (Spanish),Svenska (Swedish),Türk (Turkish),Azerbaijani (Azerbaijani)", + "enumStrings": "System,български (Bulgarian),中文 (Chinese),Nederlands (Dutch),English,Suomi (Finnish),Français (French),Deutsche (German),Ελληνικά (Greek), עברית (Hebrew),Italiano (Italian),日本人 (Japanese),한국어 (Korean),Norsk (Norwegian),Polskie (Polish),Português (Portuguese),Pусский (Russian),Español (Spanish),Svenska (Swedish),Türk (Turkish),Azerbaijani (Azerbaijani)", "enumValues": "0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", #endif static QList rgNewValues = { 0,20,25,30,31,36,37,42,43,48,58,59,66,85,90,91,96,111,114,125,15 }; diff --git a/src/Settings/AppSettings.h b/src/Settings/AppSettings.h index c2e1901..0dea191 100644 --- a/src/Settings/AppSettings.h +++ b/src/Settings/AppSettings.h @@ -44,7 +44,6 @@ public: DEFINE_SETTINGFACT(indoorPalette) DEFINE_SETTINGFACT(showLargeCompass) DEFINE_SETTINGFACT(savePath) - DEFINE_SETTINGFACT(androidSaveToSDCard) DEFINE_SETTINGFACT(useChecklist) DEFINE_SETTINGFACT(enforceChecklist) DEFINE_SETTINGFACT(mapboxToken) @@ -66,20 +65,18 @@ public: DEFINE_SETTINGFACT(firstRunPromptIdsShown) DEFINE_SETTINGFACT(forwardMavlink) DEFINE_SETTINGFACT(forwardMavlinkHostName) - DEFINE_SETTINGFACT(forwardMavlinkAPMSupportHostName) // Although this is a global setting it only affects ArduPilot vehicle since PX4 automatically starts the stream from the vehicle side DEFINE_SETTINGFACT(apmStartMavlinkStreams) - Q_PROPERTY(QString missionSavePath READ missionSavePath NOTIFY savePathsChanged) - Q_PROPERTY(QString parameterSavePath READ parameterSavePath NOTIFY savePathsChanged) - Q_PROPERTY(QString telemetrySavePath READ telemetrySavePath NOTIFY savePathsChanged) - Q_PROPERTY(QString logSavePath READ logSavePath NOTIFY savePathsChanged) - Q_PROPERTY(QString videoSavePath READ videoSavePath NOTIFY savePathsChanged) - Q_PROPERTY(QString photoSavePath READ photoSavePath NOTIFY savePathsChanged) - Q_PROPERTY(QString crashSavePath READ crashSavePath NOTIFY savePathsChanged) - Q_PROPERTY(QString customActionsSavePath READ customActionsSavePath NOTIFY savePathsChanged) + Q_PROPERTY(QString missionSavePath READ missionSavePath NOTIFY savePathsChanged) + Q_PROPERTY(QString parameterSavePath READ parameterSavePath NOTIFY savePathsChanged) + Q_PROPERTY(QString telemetrySavePath READ telemetrySavePath NOTIFY savePathsChanged) + Q_PROPERTY(QString logSavePath READ logSavePath NOTIFY savePathsChanged) + Q_PROPERTY(QString videoSavePath READ videoSavePath NOTIFY savePathsChanged) + Q_PROPERTY(QString photoSavePath READ photoSavePath NOTIFY savePathsChanged) + Q_PROPERTY(QString crashSavePath READ crashSavePath NOTIFY savePathsChanged) Q_PROPERTY(QString planFileExtension MEMBER planFileExtension CONSTANT) Q_PROPERTY(QString missionFileExtension MEMBER missionFileExtension CONSTANT) @@ -90,14 +87,13 @@ public: Q_PROPERTY(QString shpFileExtension MEMBER shpFileExtension CONSTANT) Q_PROPERTY(QString logFileExtension MEMBER logFileExtension CONSTANT) - QString missionSavePath (); - QString parameterSavePath (); - QString telemetrySavePath (); - QString logSavePath (); - QString videoSavePath (); - QString photoSavePath (); - QString crashSavePath (); - QString customActionsSavePath (); + QString missionSavePath (); + QString parameterSavePath (); + QString telemetrySavePath (); + QString logSavePath (); + QString videoSavePath (); + QString photoSavePath (); + QString crashSavePath (); // Helper methods for working with firstRunPromptIds QVariant settings string list static QList firstRunPromptsIdsVariantToList (const QVariant& firstRunPromptIds); @@ -124,7 +120,6 @@ public: static const char* videoDirectory; static const char* photoDirectory; static const char* crashDirectory; - static const char* customActionsDirectory; // Returns the current qLocaleLanguage setting bypassing the standard SettingsGroup path. This should only be used // by QGCApplication::setLanguage to query the language setting as early in the boot process as possible. diff --git a/src/Settings/CMakeLists.txt b/src/Settings/CMakeLists.txt index c06f941..55abf6a 100644 --- a/src/Settings/CMakeLists.txt +++ b/src/Settings/CMakeLists.txt @@ -30,8 +30,6 @@ add_library(Settings UnitsSettings.h VideoSettings.cc VideoSettings.h - RemoteIDSettings.h - RemoteIDSettings.cc ) target_link_libraries(Settings diff --git a/src/Settings/FlyView.SettingsGroup.json b/src/Settings/FlyView.SettingsGroup.json index e1a82f0..c5bbeb5 100644 --- a/src/Settings/FlyView.SettingsGroup.json +++ b/src/Settings/FlyView.SettingsGroup.json @@ -66,25 +66,6 @@ "units": "m", "default": 1000, "min": 1 -}, -{ - "name": "updateHomePosition", - "shortDesc": "Send updated GCS' home position to autopilot in case of change of the home position", - "type": "bool", - "default": false -}, -{ - "name": "enableCustomActions", - "shortDesc": "Enable Custom Actions", - "type": "bool", - "default": false -}, -{ - "name": "customActionDefinitions", - "shortDesc": "Custom Action Definitions", - "longDesc": "File that defines custom actions to send connected vehicle", - "type": "string", - "default": "" } ] } diff --git a/src/Settings/FlyViewSettings.cc b/src/Settings/FlyViewSettings.cc index c88dd0d..5b8fb41 100644 --- a/src/Settings/FlyViewSettings.cc +++ b/src/Settings/FlyViewSettings.cc @@ -27,7 +27,3 @@ DECLARE_SETTINGSFACT(FlyViewSettings, maxGoToLocationDistance) DECLARE_SETTINGSFACT(FlyViewSettings, keepMapCenteredOnVehicle) DECLARE_SETTINGSFACT(FlyViewSettings, showSimpleCameraControl) DECLARE_SETTINGSFACT(FlyViewSettings, showObstacleDistanceOverlay) -DECLARE_SETTINGSFACT(FlyViewSettings, updateHomePosition) -DECLARE_SETTINGSFACT(FlyViewSettings, enableCustomActions) -DECLARE_SETTINGSFACT(FlyViewSettings, customActionDefinitions) - diff --git a/src/Settings/FlyViewSettings.h b/src/Settings/FlyViewSettings.h index f9eeb2c..237ad32 100644 --- a/src/Settings/FlyViewSettings.h +++ b/src/Settings/FlyViewSettings.h @@ -29,7 +29,4 @@ public: DEFINE_SETTINGFACT(keepMapCenteredOnVehicle) DEFINE_SETTINGFACT(showSimpleCameraControl) DEFINE_SETTINGFACT(showObstacleDistanceOverlay) - DEFINE_SETTINGFACT(updateHomePosition) - DEFINE_SETTINGFACT(enableCustomActions) - DEFINE_SETTINGFACT(customActionDefinitions) }; diff --git a/src/Settings/RemoteID.SettingsGroup.json b/src/Settings/RemoteID.SettingsGroup.json deleted file mode 100644 index 4e23486..0000000 --- a/src/Settings/RemoteID.SettingsGroup.json +++ /dev/null @@ -1,169 +0,0 @@ -{ - "version": 1, - "fileType": "FactMetaData", - "QGC.MetaData.Facts": -[ -{ - "name": "enable", - "shortDesc": "Show Drone ID settings page when enabled", - "type": "bool", - "default": false -}, -{ - "name": "operatorID", - "shortDesc": "Operator ID", - "longDesc": "Operator ID. Maximum 20 characters.", - "type": "string", - "default": "" -}, -{ - "name": "operatorIDType", - "shortDesc": "Operator ID type", - "type": "uint8", - "enumStrings": "CAA", - "enumValues": "0", - "default": 0 -}, -{ - "name": "sendOperatorID", - "shortDesc": "Send Operator ID", - "longDesc": "When enabled, sends operator ID message", - "type": "bool", - "default": false -}, -{ - "name": "selfIDFree", - "shortDesc": "Self ID", - "longDesc": "Optional plain text for operator to specify operations data (Free Text). Maximum 23 characters.", - "type": "string", - "default": "" -}, -{ - "name": "selfIDEmergency", - "shortDesc": "Self ID", - "longDesc": "Optional plain text for operator to specify operations data (Emergency Text). Maximum 23 characters.", - "type": "string", - "default": "Pilot Emergency Status" -}, -{ - "name": "selfIDExtended", - "shortDesc": "Self ID", - "longDesc": "Optional plain text for operator to specify operations data (Extended Text). Maximum 23 characters.", - "type": "string", - "default": "" -}, -{ - "name": "selfIDType", - "shortDesc": "Self ID type", - "type": "uint8", - "enumStrings": "Free Text,Emergency,Extended Status", - "enumValues": "0,1,2", - "default": 0 -}, -{ - "name": "sendSelfID", - "shortDesc": "Send Self ID", - "longDesc": "When enabled, sends self ID message", - "type": "bool", - "default": false -}, -{ - "name": "basicID", - "shortDesc": "Basic ID", - "type": "string", - "default": "" -}, -{ - "name": "basicIDType", - "shortDesc": "Basic ID Type", - "type": "uint8", - "enumStrings": "None, SerialNumber(ANSI/CTA-2063), CAA, UTM(RFC4122), Specific", - "enumValues": "0,1,2,3,4", - "default": 2 -}, -{ - "name": "basicIDUaType", - "shortDesc": "UA type", - "type": "uint8", - "enumStrings": "Undefined,Airplane/FixedWing,Helicopter/Multirrotor, Gyroplane, VTOL, Ornithopter, Glider, Kite, Free Ballon, Captive Ballon, Airship, Parachute, Rocket, Tethered powered aircraft, Ground Obstacle, Other", - "enumValues": "0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15", - "default": 0 -}, -{ - "name": "sendBasicID", - "shortDesc": "Send Basic ID", - "longDesc": "When enabled, sends basic ID message", - "type": "bool", - "default": false -}, -{ - "name": "region", - "shortDesc": "Region of operation", - "longDesc": "The region of operation the mission will take place in", - "type": "uint8", - "enumStrings": "FAA,EU", - "enumValues": "0,1", - "default": 0 -}, -{ - "name": "locationType", - "shortDesc": "Location Type", - "longDesc": "Operator location Type", - "type": "uint8", - "enumStrings": "Takeoff(Not Supported),Live GNNS, Fixed", - "enumValues": "0,1,2", - "default": 1 -}, -{ - "name": "latitudeFixed", - "shortDesc": "Latitude Fixed", - "longDesc": "Fixed latitude to send on SYSTEM message", - "type": "double", - "decimalPlaces":7, - "default": 0 -}, -{ - "name": "longitudeFixed", - "shortDesc": "Longitude Fixed", - "longDesc": "Fixed Longitude to send on SYSTEM message", - "type": "double", - "decimalPlaces":7, - "default": 0 -}, -{ - "name": "altitudeFixed", - "shortDesc": "Altitude Fixed", - "longDesc": "Fixed Altitude to send on SYSTEM message", - "type": "double", - "decimalPlaces":7, - "default": 0 -}, -{ - "name": "classificationType", - "shortDesc": "Classification Type", - "longDesc": "Classification Type of UA", - "type": "uint8", - "enumStrings": "Undefined,EU", - "enumValues": "0,1", - "default": 0 -}, -{ - "name": "categoryEU", - "shortDesc": "Category EU", - "longDesc": "Category of the UAS in the EU region", - "type": "uint8", - "enumStrings": "Undeclared,Open, Specific, Certified", - "enumValues": "0,1,2,3", - "default": 0 -}, -{ - "name": "classEU", - "shortDesc": "Class EU", - "longDesc": "Class of the UAS in the EU region", - "type": "uint8", - "enumStrings": "Undeclared,Class 0, Class 1, Class 2, Class 3, Class 4, Class 5, Class 6", - "enumValues": "0,1,2,3,4,5,6,7", - "default": 0 -} -] -} \ No newline at end of file diff --git a/src/Settings/RemoteIDSettings.cc b/src/Settings/RemoteIDSettings.cc deleted file mode 100644 index ef405b7..0000000 --- a/src/Settings/RemoteIDSettings.cc +++ /dev/null @@ -1,40 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2022 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -#include "RemoteIDSettings.h" - -#include -#include - -DECLARE_SETTINGGROUP(RemoteID, "RemoteID") -{ - qmlRegisterUncreatableType("QGroundControl.SettingsManager", 1, 0, "RemoteIDSettings", "Reference only"); \ -} - -DECLARE_SETTINGSFACT(RemoteIDSettings, enable) -DECLARE_SETTINGSFACT(RemoteIDSettings, operatorID) -DECLARE_SETTINGSFACT(RemoteIDSettings, operatorIDType) -DECLARE_SETTINGSFACT(RemoteIDSettings, sendOperatorID) -DECLARE_SETTINGSFACT(RemoteIDSettings, selfIDFree) -DECLARE_SETTINGSFACT(RemoteIDSettings, selfIDEmergency) -DECLARE_SETTINGSFACT(RemoteIDSettings, selfIDExtended) -DECLARE_SETTINGSFACT(RemoteIDSettings, selfIDType) -DECLARE_SETTINGSFACT(RemoteIDSettings, sendSelfID) -DECLARE_SETTINGSFACT(RemoteIDSettings, basicID) -DECLARE_SETTINGSFACT(RemoteIDSettings, basicIDType) -DECLARE_SETTINGSFACT(RemoteIDSettings, basicIDUaType) -DECLARE_SETTINGSFACT(RemoteIDSettings, sendBasicID) -DECLARE_SETTINGSFACT(RemoteIDSettings, region) -DECLARE_SETTINGSFACT(RemoteIDSettings, locationType) -DECLARE_SETTINGSFACT(RemoteIDSettings, latitudeFixed) -DECLARE_SETTINGSFACT(RemoteIDSettings, longitudeFixed) -DECLARE_SETTINGSFACT(RemoteIDSettings, altitudeFixed) -DECLARE_SETTINGSFACT(RemoteIDSettings, classificationType) -DECLARE_SETTINGSFACT(RemoteIDSettings, categoryEU) -DECLARE_SETTINGSFACT(RemoteIDSettings, classEU) \ No newline at end of file diff --git a/src/Settings/RemoteIDSettings.h b/src/Settings/RemoteIDSettings.h deleted file mode 100644 index 28e8d32..0000000 --- a/src/Settings/RemoteIDSettings.h +++ /dev/null @@ -1,42 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2022 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -#pragma once - -#include "SettingsGroup.h" - -class RemoteIDSettings : public SettingsGroup -{ - Q_OBJECT -public: - RemoteIDSettings(QObject* parent = nullptr); - DEFINE_SETTING_NAME_GROUP() - - DEFINE_SETTINGFACT(enable) - DEFINE_SETTINGFACT(operatorID) - DEFINE_SETTINGFACT(operatorIDType) - DEFINE_SETTINGFACT(sendOperatorID) - DEFINE_SETTINGFACT(selfIDFree) - DEFINE_SETTINGFACT(selfIDEmergency) - DEFINE_SETTINGFACT(selfIDExtended) - DEFINE_SETTINGFACT(selfIDType) - DEFINE_SETTINGFACT(sendSelfID) - DEFINE_SETTINGFACT(basicID) - DEFINE_SETTINGFACT(basicIDType) - DEFINE_SETTINGFACT(basicIDUaType) - DEFINE_SETTINGFACT(sendBasicID) - DEFINE_SETTINGFACT(region) - DEFINE_SETTINGFACT(locationType) - DEFINE_SETTINGFACT(latitudeFixed) - DEFINE_SETTINGFACT(longitudeFixed) - DEFINE_SETTINGFACT(altitudeFixed) - DEFINE_SETTINGFACT(classificationType) - DEFINE_SETTINGFACT(categoryEU) - DEFINE_SETTINGFACT(classEU) -}; \ No newline at end of file diff --git a/src/Settings/SettingsManager.cc b/src/Settings/SettingsManager.cc index 41d8ce9..e0a1a4a 100644 --- a/src/Settings/SettingsManager.cc +++ b/src/Settings/SettingsManager.cc @@ -14,6 +14,9 @@ SettingsManager::SettingsManager(QGCApplication* app, QGCToolbox* toolbox) : QGCTool(app, toolbox) +#if defined(QGC_AIRMAP_ENABLED) + , _airMapSettings (nullptr) +#endif , _appSettings (nullptr) , _unitsSettings (nullptr) , _autoConnectSettings (nullptr) @@ -29,7 +32,6 @@ SettingsManager::SettingsManager(QGCApplication* app, QGCToolbox* toolbox) #if !defined(NO_ARDUPILOT_DIALECT) , _apmMavlinkStreamRateSettings (nullptr) #endif - , _remoteIDSettings (nullptr) { } @@ -55,5 +57,7 @@ void SettingsManager::setToolbox(QGCToolbox *toolbox) #if !defined(NO_ARDUPILOT_DIALECT) _apmMavlinkStreamRateSettings = new APMMavlinkStreamRateSettings(this); #endif - _remoteIDSettings = new RemoteIDSettings (this); +#if defined(QGC_AIRMAP_ENABLED) + _airMapSettings = new AirMapSettings (this); +#endif } diff --git a/src/Settings/SettingsManager.h b/src/Settings/SettingsManager.h index 3e8044a..dcaba86 100644 --- a/src/Settings/SettingsManager.h +++ b/src/Settings/SettingsManager.h @@ -27,8 +27,10 @@ #include "APMMavlinkStreamRateSettings.h" #include "FirmwareUpgradeSettings.h" #include "ADSBVehicleManagerSettings.h" +#if defined(QGC_AIRMAP_ENABLED) +#include "AirMapSettings.h" +#endif #include -#include "RemoteIDSettings.h" /// Provides access to all app settings class SettingsManager : public QGCTool @@ -38,6 +40,9 @@ class SettingsManager : public QGCTool public: SettingsManager(QGCApplication* app, QGCToolbox* toolbox); +#if defined(QGC_AIRMAP_ENABLED) + Q_PROPERTY(QObject* airMapSettings READ airMapSettings CONSTANT) +#endif Q_PROPERTY(QObject* appSettings READ appSettings CONSTANT) Q_PROPERTY(QObject* unitsSettings READ unitsSettings CONSTANT) Q_PROPERTY(QObject* autoConnectSettings READ autoConnectSettings CONSTANT) @@ -53,10 +58,12 @@ public: #if !defined(NO_ARDUPILOT_DIALECT) Q_PROPERTY(QObject* apmMavlinkStreamRateSettings READ apmMavlinkStreamRateSettings CONSTANT) #endif - Q_PROPERTY(QObject* remoteIDSettings READ remoteIDSettings CONSTANT) // Override from QGCTool virtual void setToolbox(QGCToolbox *toolbox); +#if defined(QGC_AIRMAP_ENABLED) + AirMapSettings* airMapSettings (void) { return _airMapSettings; } +#endif AppSettings* appSettings (void) { return _appSettings; } UnitsSettings* unitsSettings (void) { return _unitsSettings; } AutoConnectSettings* autoConnectSettings (void) { return _autoConnectSettings; } @@ -72,8 +79,10 @@ public: #if !defined(NO_ARDUPILOT_DIALECT) APMMavlinkStreamRateSettings* apmMavlinkStreamRateSettings(void) { return _apmMavlinkStreamRateSettings; } #endif - RemoteIDSettings* remoteIDSettings (void) { return _remoteIDSettings; } private: +#if defined(QGC_AIRMAP_ENABLED) + AirMapSettings* _airMapSettings; +#endif AppSettings* _appSettings; UnitsSettings* _unitsSettings; AutoConnectSettings* _autoConnectSettings; @@ -89,7 +98,6 @@ private: #if !defined(NO_ARDUPILOT_DIALECT) APMMavlinkStreamRateSettings* _apmMavlinkStreamRateSettings; #endif - RemoteIDSettings* _remoteIDSettings; }; #endif diff --git a/src/Settings/UnitsSettings.cc b/src/Settings/UnitsSettings.cc index e290c17..90d496d 100644 --- a/src/Settings/UnitsSettings.cc +++ b/src/Settings/UnitsSettings.cc @@ -155,7 +155,7 @@ DECLARE_SETTINGSFACT_NO_FUNC(UnitsSettings, temperatureUnits) // Units settings can't be loaded from json since it creates an infinite loop of meta data loading. QStringList enumStrings; QVariantList enumValues; - enumStrings << "Celsius" << "Fahrenheit"; + enumStrings << "Celsius" << "Farenheit"; enumValues << QVariant::fromValue(static_cast(TemperatureUnitsCelsius)) << QVariant::fromValue(static_cast(TemperatureUnitsFarenheit)); FactMetaData* metaData = new FactMetaData(FactMetaData::valueTypeUint32, this); metaData->setName(temperatureUnitsName); diff --git a/src/Settings/Video.SettingsGroup.json b/src/Settings/Video.SettingsGroup.json index 805d60c..1fa43bf 100644 --- a/src/Settings/Video.SettingsGroup.json +++ b/src/Settings/Video.SettingsGroup.json @@ -106,7 +106,7 @@ "type": "uint32", "min": 1, "units": "s", - "default": 8 + "default": 2 }, { "name": "streamEnabled", diff --git a/src/Settings/VideoSettings.cc b/src/Settings/VideoSettings.cc index 89e8a6b..a6abdd1 100644 --- a/src/Settings/VideoSettings.cc +++ b/src/Settings/VideoSettings.cc @@ -29,8 +29,6 @@ const char* VideoSettings::videoSourceMPEGTS = QT_TRANSLATE_NOOP("Vid const char* VideoSettings::videoSource3DRSolo = QT_TRANSLATE_NOOP("VideoSettings", "3DR Solo (requires restart)"); const char* VideoSettings::videoSourceParrotDiscovery = QT_TRANSLATE_NOOP("VideoSettings", "Parrot Discovery"); const char* VideoSettings::videoSourceYuneecMantisG = QT_TRANSLATE_NOOP("VideoSettings", "Yuneec Mantis G"); -const char* VideoSettings::videoSourceHerelinkAirUnit = QT_TRANSLATE_NOOP("VideoSettings", "Herelink AirUnit"); -const char* VideoSettings::videoSourceHerelinkHotspot = QT_TRANSLATE_NOOP("VideoSettings", "Herelink Hotspot"); DECLARE_SETTINGGROUP(Video, "Video") { @@ -50,13 +48,6 @@ DECLARE_SETTINGGROUP(Video, "Video") videoSourceList.append(videoSourceParrotDiscovery); videoSourceList.append(videoSourceYuneecMantisG); #endif - -#ifdef QGC_HERELINK_AIRUNIT_VIDEO - videoSourceList.append(videoSourceHerelinkAirUnit); -#else - videoSourceList.append(videoSourceHerelinkHotspot); -#endif - #ifndef QGC_DISABLE_UVC QList cameras = QCameraInfo::availableCameras(); for (const QCameraInfo &cameraInfo: cameras) { @@ -90,12 +81,6 @@ DECLARE_SETTINGGROUP(Video, "Video") #ifdef Q_OS_MAC VideoDecoderOptions::ForceVideoDecoderDirectX3D, VideoDecoderOptions::ForceVideoDecoderVAAPI, -#endif -#ifdef Q_OS_ANDROID - VideoDecoderOptions::ForceVideoDecoderDirectX3D, - VideoDecoderOptions::ForceVideoDecoderVideoToolbox, - VideoDecoderOptions::ForceVideoDecoderVAAPI, - VideoDecoderOptions::ForceVideoDecoderNVIDIA, #endif }; @@ -153,8 +138,12 @@ DECLARE_SETTINGSFACT_NO_FUNC(VideoSettings, forceVideoDecoder) _forceVideoDecoderFact->setVisible( #ifdef Q_OS_IOS false +#else +#ifdef Q_OS_ANDROID + false #else true +#endif #endif ); @@ -225,16 +214,6 @@ bool VideoSettings::streamConfigured(void) qCDebug(VideoManagerLog) << "Testing configuration for MPEG-TS Stream:" << udpPort()->rawValue().toInt(); return udpPort()->rawValue().toInt() != 0; } - //-- If Herelink Air unit, good to go - if(vSource == videoSourceHerelinkAirUnit) { - qCDebug(VideoManagerLog) << "Stream configured for Herelink Air Unit"; - return true; - } - //-- If Herelink Hotspot, good to go - if(vSource == videoSourceHerelinkHotspot) { - qCDebug(VideoManagerLog) << "Stream configured for Herelink Hotspot"; - return true; - } return false; } diff --git a/src/Settings/VideoSettings.h b/src/Settings/VideoSettings.h index f947577..3a2bd5e 100644 --- a/src/Settings/VideoSettings.h +++ b/src/Settings/VideoSettings.h @@ -73,8 +73,6 @@ public: static const char* videoSource3DRSolo; static const char* videoSourceParrotDiscovery; static const char* videoSourceYuneecMantisG; - static const char* videoSourceHerelinkAirUnit; - static const char* videoSourceHerelinkHotspot; signals: void streamConfiguredChanged (bool configured); diff --git a/src/Terrain/TerrainQuery.cc b/src/Terrain/TerrainQuery.cc index 4da3986..8e32d00 100644 --- a/src/Terrain/TerrainQuery.cc +++ b/src/Terrain/TerrainQuery.cc @@ -10,7 +10,6 @@ #include "TerrainQuery.h" #include "QGCMapEngine.h" #include "QGeoMapReplyQGC.h" -#include "QGCFileDownload.h" #include "QGCApplication.h" #include @@ -33,8 +32,6 @@ QGC_LOGGING_CATEGORY(TerrainQueryVerboseLog, "TerrainQueryVerboseLog") Q_GLOBAL_STATIC(TerrainAtCoordinateBatchManager, _TerrainAtCoordinateBatchManager) Q_GLOBAL_STATIC(TerrainTileManager, _terrainTileManager) -static const auto kMapType = UrlFactory::kCopernicusElevationProviderKey; - TerrainAirMapQuery::TerrainAirMapQuery(QObject* parent) : TerrainQueryInterface(parent) { @@ -126,7 +123,7 @@ void TerrainAirMapQuery::_sendQuery(const QString& path, const QUrlQuery& urlQue _requestFailed(); return; } - QGCFileDownload::setIgnoreSSLErrorsIfNeeded(*networkReply); + networkReply->ignoreSslErrors(); connect(networkReply, &QNetworkReply::finished, this, &TerrainAirMapQuery::_requestFinished); connect(networkReply, &QNetworkReply::sslErrors, this, &TerrainAirMapQuery::_sslErrors); @@ -445,17 +442,13 @@ bool TerrainTileManager::getAltitudesForCoordinates(const QList& altitudes.push_back(elevation); } else { if (_state != State::Downloading) { - QNetworkRequest request = getQGCMapEngine()->urlFactory()->getTileURL( - kMapType, getQGCMapEngine()->urlFactory()->long2tileX(kMapType, coordinate.longitude(), 1), - getQGCMapEngine()->urlFactory()->lat2tileY(kMapType, coordinate.latitude(), 1), - 1, - &_networkManager); + QNetworkRequest request = getQGCMapEngine()->urlFactory()->getTileURL("Airmap Elevation", getQGCMapEngine()->urlFactory()->long2tileX("Airmap Elevation",coordinate.longitude(), 1), getQGCMapEngine()->urlFactory()->lat2tileY("Airmap Elevation", coordinate.latitude(), 1), 1, &_networkManager); qCDebug(TerrainQueryLog) << "TerrainTileManager::getAltitudesForCoordinates query from database" << request.url(); QGeoTileSpec spec; - spec.setX(getQGCMapEngine()->urlFactory()->long2tileX(kMapType, coordinate.longitude(), 1)); - spec.setY(getQGCMapEngine()->urlFactory()->lat2tileY(kMapType, coordinate.latitude(), 1)); + spec.setX(getQGCMapEngine()->urlFactory()->long2tileX("Airmap Elevation", coordinate.longitude(), 1)); + spec.setY(getQGCMapEngine()->urlFactory()->lat2tileY("Airmap Elevation", coordinate.latitude(), 1)); spec.setZoom(1); - spec.setMapId(getQGCMapEngine()->urlFactory()->getIdFromType(kMapType)); + spec.setMapId(getQGCMapEngine()->urlFactory()->getIdFromType("Airmap Elevation")); QGeoTiledMapReplyQGC* reply = new QGeoTiledMapReplyQGC(&_networkManager, request, spec); connect(reply, &QGeoTiledMapReplyQGC::terrainDone, this, &TerrainTileManager::_terrainDone); _state = State::Downloading; @@ -472,7 +465,7 @@ bool TerrainTileManager::getAltitudesForCoordinates(const QList& void TerrainTileManager::_tileFailed(void) { - QList noAltitudes; + QList noAltitudes; for (const QueuedRequestInfo_t& requestInfo: _requestQueue) { if (requestInfo.queryMode == QueryMode::QueryModeCoordinates) { @@ -496,7 +489,7 @@ void TerrainTileManager::_terrainDone(QByteArray responseBytes, QNetworkReply::N // remove from download queue QGeoTileSpec spec = reply->tileSpec(); - QString hash = QGCMapEngine::getTileHash(kMapType, spec.x(), spec.y(), spec.zoom()); + QString hash = QGCMapEngine::getTileHash("Airmap Elevation", spec.x(), spec.y(), spec.zoom()); // handle potential errors if (error != QNetworkReply::NoError) { @@ -563,9 +556,9 @@ void TerrainTileManager::_terrainDone(QByteArray responseBytes, QNetworkReply::N QString TerrainTileManager::_getTileHash(const QGeoCoordinate& coordinate) { QString ret = QGCMapEngine::getTileHash( - kMapType, - getQGCMapEngine()->urlFactory()->long2tileX(kMapType, coordinate.longitude(), 1), - getQGCMapEngine()->urlFactory()->lat2tileY(kMapType, coordinate.latitude(), 1), + "Airmap Elevation", + getQGCMapEngine()->urlFactory()->long2tileX("Airmap Elevation", coordinate.longitude(), 1), + getQGCMapEngine()->urlFactory()->lat2tileY("Airmap Elevation", coordinate.latitude(), 1), 1); qCDebug(TerrainQueryVerboseLog) << "Computing unique tile hash for " << coordinate << ret; diff --git a/src/TerrainTile.cc b/src/TerrainTile.cc index c651f2b..654847f 100644 --- a/src/TerrainTile.cc +++ b/src/TerrainTile.cc @@ -31,120 +31,140 @@ const char* TerrainTile::_jsonMinElevationKey = "min"; const char* TerrainTile::_jsonAvgElevationKey = "avg"; const char* TerrainTile::_jsonCarpetKey = "carpet"; -TerrainTile::TerrainTile(const QByteArray& byteArray) +TerrainTile::TerrainTile() + : _minElevation(-1.0) + , _maxElevation(-1.0) + , _avgElevation(-1.0) + , _data(nullptr) + , _gridSizeLat(-1) + , _gridSizeLon(-1) + , _isValid(false) { - // Copy tile info - _tileInfo = *reinterpret_cast(byteArray.constData()); - // Check feasibility - if ((_tileInfo.neLon - _tileInfo.swLon) < 0.0 || (_tileInfo.neLat - _tileInfo.swLat) < 0.0) { - qCWarning(TerrainTileLog) << this << "Tile extent is infeasible"; - _isValid = false; - return; +} + +TerrainTile::~TerrainTile() +{ + if (_data) { + for (int i = 0; i < _gridSizeLat; i++) { + delete[] _data[i]; + } + delete[] _data; + _data = nullptr; } +} - _cellSizeLat = (_tileInfo.neLat - _tileInfo.swLat) / _tileInfo.gridSizeLat; - _cellSizeLon = (_tileInfo.neLon - _tileInfo.swLon) / _tileInfo.gridSizeLon; - - qCDebug(TerrainTileLog) << this << "TileInfo: south west: " << _tileInfo.swLat << _tileInfo.swLon; - qCDebug(TerrainTileLog) << this << "TileInfo: north east: " << _tileInfo.neLat << _tileInfo.neLon; - qCDebug(TerrainTileLog) << this << "TileInfo: dimensions: " << _tileInfo.gridSizeLat << "by" << _tileInfo.gridSizeLat; - qCDebug(TerrainTileLog) << this << "TileInfo: min, max, avg: " << _tileInfo.minElevation << _tileInfo.maxElevation << _tileInfo.avgElevation; - qCDebug(TerrainTileLog) << this << "TileInfo: cell size: " << _cellSizeLat << _cellSizeLon; - +TerrainTile::TerrainTile(QByteArray byteArray) + : _minElevation(-1.0) + , _maxElevation(-1.0) + , _avgElevation(-1.0) + , _data(nullptr) + , _gridSizeLat(-1) + , _gridSizeLon(-1) + , _isValid(false) +{ int cTileHeaderBytes = static_cast(sizeof(TileInfo_t)); int cTileBytesAvailable = byteArray.size(); if (cTileBytesAvailable < cTileHeaderBytes) { - qCWarning(TerrainTileLog) << "Terrain tile binary data too small for TileInfo_s header"; + qWarning() << "Terrain tile binary data too small for TileInfo_s header"; return; } - int cTileDataBytes = static_cast(sizeof(int16_t)) * _tileInfo.gridSizeLat * _tileInfo.gridSizeLon; + const TileInfo_t* tileInfo = reinterpret_cast(byteArray.constData()); + _southWest.setLatitude(tileInfo->swLat); + _southWest.setLongitude(tileInfo->swLon); + _northEast.setLatitude(tileInfo->neLat); + _northEast.setLongitude(tileInfo->neLon); + _minElevation = tileInfo->minElevation; + _maxElevation = tileInfo->maxElevation; + _avgElevation = tileInfo->avgElevation; + _gridSizeLat = tileInfo->gridSizeLat; + _gridSizeLon = tileInfo->gridSizeLon; + + qCDebug(TerrainTileLog) << "Loading terrain tile: " << _southWest << " - " << _northEast; + qCDebug(TerrainTileLog) << "min:max:avg:sizeLat:sizeLon" << _minElevation << _maxElevation << _avgElevation << _gridSizeLat << _gridSizeLon; + + int cTileDataBytes = static_cast(sizeof(int16_t)) * _gridSizeLat * _gridSizeLon; if (cTileBytesAvailable < cTileHeaderBytes + cTileDataBytes) { - qCWarning(TerrainTileLog) << "Terrain tile binary data too small for tile data"; + qWarning() << "Terrain tile binary data too small for tile data"; return; } - _data = new int16_t*[_tileInfo.gridSizeLat]; - for (int k = 0; k < _tileInfo.gridSizeLat; k++) { - _data[k] = new int16_t[_tileInfo.gridSizeLon]; + _data = new int16_t*[_gridSizeLat]; + for (int k = 0; k < _gridSizeLat; k++) { + _data[k] = new int16_t[_gridSizeLon]; } int valueIndex = 0; const int16_t* pTileData = reinterpret_cast(&reinterpret_cast(byteArray.constData())[cTileHeaderBytes]); - for (int i = 0; i < _tileInfo.gridSizeLat; i++) { - for (int j = 0; j < _tileInfo.gridSizeLon; j++) { + for (int i = 0; i < _gridSizeLat; i++) { + for (int j = 0; j < _gridSizeLon; j++) { _data[i][j] = pTileData[valueIndex++]; } } _isValid = true; -} -TerrainTile::~TerrainTile() -{ - if (!_data) { - return; - } - - for (unsigned i = 0; i < static_cast(_tileInfo.gridSizeLat); i++) { - delete[] _data[i]; - } - - delete[] _data; + return; } double TerrainTile::elevation(const QGeoCoordinate& coordinate) const { - if (!_isValid || !_data) { - qCWarning(TerrainTileLog) << this << "Request for elevation, but tile is invalid."; + if (_isValid && _southWest.isValid() && _northEast.isValid()) { + qCDebug(TerrainTileLog) << "elevation: " << coordinate << " , in sw " << _southWest << " , ne " << _northEast; + + // The lat/lon values in _northEast and _southWest coordinates can have rounding errors such that the coordinate + // request may be slightly outside the tile box specified by these values. So we clamp the incoming values to the + // edges of the tile if needed. + + double clampedLon = qMax(coordinate.longitude(), _southWest.longitude()); + double clampedLat = qMax(coordinate.latitude(), _southWest.latitude()); + + // Calc the index of the southernmost and westernmost index data value + int lonIndex = qFloor((clampedLon - _southWest.longitude()) / tileValueSpacingDegrees); + int latIndex = qFloor((clampedLat - _southWest.latitude()) / tileValueSpacingDegrees); + + // Calc how far along in between the known values the requested lat/lon is fractionally + double lonIndexLongitude = _southWest.longitude() + (static_cast(lonIndex) * tileValueSpacingDegrees); + double lonFraction = (clampedLon - lonIndexLongitude) / tileValueSpacingDegrees; + double latIndexLatitude = _southWest.latitude() + (static_cast(latIndex) * tileValueSpacingDegrees); + double latFraction = (clampedLat - latIndexLatitude) / tileValueSpacingDegrees; + + // Calc the elevation as the average across the four known points + double known00 = _data[latIndex][lonIndex]; + double known01 = _data[latIndex][lonIndex+1]; + double known10 = _data[latIndex+1][lonIndex]; + double known11 = _data[latIndex+1][lonIndex+1]; + double lonValue1 = known00 + ((known01 - known00) * lonFraction); + double lonValue2 = known10 + ((known11 - known10) * lonFraction); + double latValue = lonValue1 + ((lonValue2 - lonValue1) * latFraction); + + return latValue; + } else { + qCWarning(TerrainTileLog) << "elevation: Internal error - invalid tile"; return qQNaN(); } - - const double latDeltaSw = coordinate.latitude() - _tileInfo.swLat; - const double lonDeltaSw = coordinate.longitude() - _tileInfo.swLon; - - const int16_t latIndex = qFloor(latDeltaSw / _cellSizeLat); - const int16_t lonIndex = qFloor(lonDeltaSw / _cellSizeLon); - - const bool latIndexInvalid = latIndex < 0 || latIndex > (_tileInfo.gridSizeLat - 1); - const bool lonIndexInvalid = lonIndex < 0 || lonIndex > (_tileInfo.gridSizeLon - 1); - - if (latIndexInvalid || lonIndexInvalid) { - qCWarning(TerrainTileLog) << this << "Internal error: coordinate" << coordinate << "outside tile bounds"; - return qQNaN(); - } - - const auto elevation = _data[latIndex][lonIndex]; - - // Print warning if elevation is outside min/max of tile meta data - if (elevation < _tileInfo.minElevation) { - qCWarning(TerrainTileLog) << this << "Warning: elevation read is below min elevation in tile:" << elevation << "<" << _tileInfo.minElevation; - } - else if (elevation > _tileInfo.maxElevation) { - qCWarning(TerrainTileLog) << this << "Warning: elevation read is above max elevation in tile:" << elevation << ">" << _tileInfo.maxElevation; - } - -#ifdef QT_DEBUG - qCDebug(TerrainTileLog) << this << "latIndex, lonIndex:" << latIndex << lonIndex << "elevation:" << elevation; -#endif - - return static_cast(elevation); } -QByteArray TerrainTile::serializeFromAirMapJson(const QByteArray& input) +QGeoCoordinate TerrainTile::centerCoordinate(void) const +{ + return _southWest.atDistanceAndAzimuth(_southWest.distanceTo(_northEast) / 2.0, _southWest.azimuthTo(_northEast)); +} + +QByteArray TerrainTile::serializeFromAirMapJson(QByteArray input) { QJsonParseError parseError; QJsonDocument document = QJsonDocument::fromJson(input, &parseError); if (parseError.error != QJsonParseError::NoError) { - qCWarning(TerrainTileLog) << "TerrainTile::serializeFromAirMapJson: Terrain tile json doc parse error" << parseError.errorString(); - return QByteArray(); + QByteArray emptyArray; + return emptyArray; } if (!document.isObject()) { - qCWarning(TerrainTileLog) << "TerrainTile::serializeFromAirMapJson: Terrain tile json doc is no object"; - return QByteArray(); + qCDebug(TerrainTileLog) << "Terrain tile json doc is no object"; + QByteArray emptyArray; + return emptyArray; } QJsonObject rootObject = document.object(); @@ -154,13 +174,15 @@ QByteArray TerrainTile::serializeFromAirMapJson(const QByteArray& input) { _jsonDataKey, QJsonValue::Object, true }, }; if (!JsonHelper::validateKeys(rootObject, rootVersionKeyInfoList, errorString)) { - qCWarning(TerrainTileLog) << "TerrainTile::serializeFromAirMapJson: Error in reading json: " << errorString; - return QByteArray(); + qCDebug(TerrainTileLog) << "Error in reading json: " << errorString; + QByteArray emptyArray; + return emptyArray; } if (rootObject[_jsonStatusKey].toString() != "success") { - qCWarning(TerrainTileLog) << "TerrainTile::serializeFromAirMapJson: Invalid terrain tile."; - return QByteArray(); + qCDebug(TerrainTileLog) << "Invalid terrain tile."; + QByteArray emptyArray; + return emptyArray; } const QJsonObject& dataObject = rootObject[_jsonDataKey].toObject(); QList dataVersionKeyInfoList = { @@ -169,8 +191,9 @@ QByteArray TerrainTile::serializeFromAirMapJson(const QByteArray& input) { _jsonCarpetKey, QJsonValue::Array, true }, }; if (!JsonHelper::validateKeys(dataObject, dataVersionKeyInfoList, errorString)) { - qCWarning(TerrainTileLog) << "TerrainTile::serializeFromAirMapJson: Error in reading json: " << errorString; - return QByteArray(); + qCDebug(TerrainTileLog) << "Error in reading json: " << errorString; + QByteArray emptyArray; + return emptyArray; } // Bounds @@ -180,24 +203,18 @@ QByteArray TerrainTile::serializeFromAirMapJson(const QByteArray& input) { _jsonNorthEastKey, QJsonValue::Array, true }, }; if (!JsonHelper::validateKeys(boundsObject, boundsVersionKeyInfoList, errorString)) { - qCWarning(TerrainTileLog) << "TerrainTile::serializeFromAirMapJson: Error in reading json: " << errorString; - return QByteArray(); + qCDebug(TerrainTileLog) << "Error in reading json: " << errorString; + QByteArray emptyArray; + return emptyArray; } const QJsonArray& swArray = boundsObject[_jsonSouthWestKey].toArray(); const QJsonArray& neArray = boundsObject[_jsonNorthEastKey].toArray(); if (swArray.count() < 2 || neArray.count() < 2 ) { - qCWarning(TerrainTileLog) << "TerrainTile::serializeFromAirMapJson: Incomplete bounding location"; - return QByteArray(); + qCDebug(TerrainTileLog) << "Incomplete bounding location"; + QByteArray emptyArray; + return emptyArray; } - const double swLat = swArray[0].toDouble(); - const double swLon = swArray[1].toDouble(); - const double neLat = neArray[0].toDouble(); - const double neLon = neArray[1].toDouble(); - - qCDebug(TerrainTileLog) << "Serialize: swArray: south west: " << (40.42 - swLat) << (-3.23 - swLon); - qCDebug(TerrainTileLog) << "Serialize: neArray: north east: " << neLat << neLon; - // Stats const QJsonObject& statsObject = dataObject[_jsonStatsKey].toObject(); QList statsVersionKeyInfoList = { @@ -206,14 +223,18 @@ QByteArray TerrainTile::serializeFromAirMapJson(const QByteArray& input) { _jsonAvgElevationKey, QJsonValue::Double, true }, }; if (!JsonHelper::validateKeys(statsObject, statsVersionKeyInfoList, errorString)) { - qCWarning(TerrainTileLog) << "TerrainTile::serializeFromAirMapJson: Error in reading json: " << errorString; - return QByteArray(); + qCDebug(TerrainTileLog) << "Error in reading json: " << errorString; + QByteArray emptyArray; + return emptyArray; } + // Carpet const QJsonArray& carpetArray = dataObject[_jsonCarpetKey].toArray(); + int gridSizeLat = carpetArray.count(); + int gridSizeLon = carpetArray[0].toArray().count(); + + TileInfo_t tileInfo; - // Tile meta data - TerrainTile::TileInfo_t tileInfo; tileInfo.swLat = swArray[0].toDouble(); tileInfo.swLon = swArray[1].toDouble(); tileInfo.neLat = neArray[0].toDouble(); @@ -221,34 +242,41 @@ QByteArray TerrainTile::serializeFromAirMapJson(const QByteArray& input) tileInfo.minElevation = static_cast(statsObject[_jsonMinElevationKey].toInt()); tileInfo.maxElevation = static_cast(statsObject[_jsonMaxElevationKey].toInt()); tileInfo.avgElevation = statsObject[_jsonAvgElevationKey].toDouble(); - tileInfo.gridSizeLat = static_cast(carpetArray.count()); - tileInfo.gridSizeLon = static_cast(carpetArray[0].toArray().count()); + tileInfo.gridSizeLat = static_cast(gridSizeLat); + tileInfo.gridSizeLon = static_cast(gridSizeLon); - qCDebug(TerrainTileLog) << "Serialize: TileInfo: south west: " << tileInfo.swLat << tileInfo.swLon; - qCDebug(TerrainTileLog) << "Serialize: TileInfo: north east: " << tileInfo.neLat << tileInfo.neLon; + // We require 1-arc second value spacing + double neCornerLatExpected = tileInfo.swLat + ((tileInfo.gridSizeLat - 1) * tileValueSpacingDegrees); + double neCornerLonExpected = tileInfo.swLon + ((tileInfo.gridSizeLon - 1) * tileValueSpacingDegrees); + if (!QGC::fuzzyCompare(tileInfo.neLat, neCornerLatExpected) || !QGC::fuzzyCompare(tileInfo.neLon, neCornerLonExpected)) { + qCWarning(TerrainTileLog) << QStringLiteral("serialize: Internal error - distance between values incorrect neExpected(%1, %2) neActual(%3, %4) sw(%5, %6) gridSize(%7, %8)") + .arg(neCornerLatExpected).arg(neCornerLonExpected).arg(tileInfo.neLat).arg(tileInfo.neLon).arg(tileInfo.swLat).arg(tileInfo.swLon).arg(tileInfo.gridSizeLat).arg(tileInfo.gridSizeLon); + QByteArray emptyArray; + return emptyArray; + } - const auto cTileNumHeaderBytes = static_cast(sizeof(TileInfo_t)); - const auto cTileNumDataBytes = static_cast(sizeof(int16_t)) * tileInfo.gridSizeLat * tileInfo.gridSizeLon; + int cTileHeaderBytes = static_cast(sizeof(TileInfo_t)); + int cTileDataBytes = static_cast(sizeof(int16_t)) * gridSizeLat * gridSizeLon; - QByteArray res; - res.resize(cTileNumHeaderBytes + cTileNumDataBytes); + QByteArray byteArray(cTileHeaderBytes + cTileDataBytes, 0); - TileInfo_t* pTileInfo = reinterpret_cast(res.data()); - int16_t* pTileData = reinterpret_cast(&reinterpret_cast(res.data())[cTileNumHeaderBytes]); + TileInfo_t* pTileInfo = reinterpret_cast(byteArray.data()); + int16_t* pTileData = reinterpret_cast(&reinterpret_cast(byteArray.data())[cTileHeaderBytes]); *pTileInfo = tileInfo; int valueIndex = 0; - for (unsigned i = 0; i < static_cast(tileInfo.gridSizeLat); i++) { + for (int i = 0; i < gridSizeLat; i++) { const QJsonArray& row = carpetArray[i].toArray(); - if (row.count() < tileInfo.gridSizeLon) { - qCDebug(TerrainTileLog) << "Expected row array of " << tileInfo.gridSizeLon << ", instead got " << row.count(); - return QByteArray(); + if (row.count() < gridSizeLon) { + qCDebug(TerrainTileLog) << "Expected row array of " << gridSizeLon << ", instead got " << row.count(); + QByteArray emptyArray; + return emptyArray; } - for (unsigned j = 0; j < static_cast(tileInfo.gridSizeLon); j++) { + for (int j = 0; j < gridSizeLon; j++) { pTileData[valueIndex++] = static_cast(row[j].toDouble()); } } - return res; + return byteArray; } diff --git a/src/TerrainTile.h b/src/TerrainTile.h index 0134593..bd1417d 100644 --- a/src/TerrainTile.h +++ b/src/TerrainTile.h @@ -16,7 +16,7 @@ Q_DECLARE_LOGGING_CATEGORY(TerrainTileLog) class TerrainTile { public: - TerrainTile() = default; + TerrainTile(); ~TerrainTile(); /** @@ -24,7 +24,7 @@ public: * * @param document */ - TerrainTile(const QByteArray& byteArray); + TerrainTile(QByteArray byteArray); /** * Check whether valid data is loaded @@ -46,29 +46,30 @@ public: * * @return minimum elevation */ - double minElevation(void) const { return _isValid ? static_cast(_tileInfo.minElevation) : qQNaN(); } + double minElevation(void) const { return _minElevation; } /** * Accessor for the maximum elevation of the tile * * @return maximum elevation */ - double maxElevation(void) const { return _isValid ? static_cast(_tileInfo.maxElevation) : qQNaN(); } + double maxElevation(void) const { return _maxElevation; } /** * Accessor for the average elevation of the tile * * @return average elevation */ - double avgElevation(void) const { return _isValid ? _tileInfo.avgElevation : qQNaN(); } + double avgElevation(void) const { return _avgElevation; } /** * Accessor for the center coordinate * * @return center coordinate */ + QGeoCoordinate centerCoordinate(void) const; - static QByteArray serializeFromAirMapJson(const QByteArray& input); + static QByteArray serializeFromAirMapJson(QByteArray input); static constexpr double tileSizeDegrees = 0.01; ///< Each terrain tile represents a square area .01 degrees in lat/lon static constexpr double tileValueSpacingDegrees = 1.0 / 3600; ///< 1 Arc-Second spacing of elevation values @@ -76,7 +77,7 @@ public: private: typedef struct { - double swLat, swLon, neLat, neLon; + double swLat,swLon, neLat, neLon; int16_t minElevation; int16_t maxElevation; double avgElevation; @@ -84,10 +85,16 @@ private: int16_t gridSizeLon; } TileInfo_t; - TileInfo_t _tileInfo; + QGeoCoordinate _southWest; /// South west corner of the tile + QGeoCoordinate _northEast; /// North east corner of the tile + + int16_t _minElevation; /// Minimum elevation in tile + int16_t _maxElevation; /// Maximum elevation in tile + double _avgElevation; /// Average elevation of the tile + int16_t** _data; /// 2D elevation data array - double _cellSizeLat; /// data grid size in latitude direction - double _cellSizeLon; /// data grid size in longitude direction + int16_t _gridSizeLat; /// data grid size in latitude direction + int16_t _gridSizeLon; /// data grid size in longitude direction bool _isValid; /// data loaded is valid // Json keys diff --git a/src/Vehicle/Actuators/ActuatorActions.cc b/src/Vehicle/Actuators/ActuatorActions.cc index 555ac42..81259ae 100644 --- a/src/Vehicle/Actuators/ActuatorActions.cc +++ b/src/Vehicle/Actuators/ActuatorActions.cc @@ -39,10 +39,11 @@ void Action::trigger() sendMavlinkRequest(); } -void Action::ackHandlerEntry(void* resultHandlerData, int /*compId*/, const mavlink_command_ack_t& ack, Vehicle::MavCmdResultFailureCode_t failureCode) +void Action::ackHandlerEntry(void* resultHandlerData, int compId, MAV_RESULT commandResult, uint8_t progress, + Vehicle::MavCmdResultFailureCode_t failureCode) { Action* action = (Action*)resultHandlerData; - action->ackHandler(static_cast(ack.result), failureCode); + action->ackHandler(commandResult, failureCode); } void Action::ackHandler(MAV_RESULT commandResult, Vehicle::MavCmdResultFailureCode_t failureCode) @@ -57,12 +58,9 @@ void Action::sendMavlinkRequest() { qCDebug(ActuatorsConfigLog) << "Sending actuator action, function:" << _outputFunction << "type:" << (int)_type; - Vehicle::MavCmdAckHandlerInfo_t handlerInfo = {}; - handlerInfo.resultHandler = ackHandlerEntry; - handlerInfo.resultHandlerData = this; - _vehicle->sendMavCommandWithHandler( - &handlerInfo, + ackHandlerEntry, // Ack callback + this, // Ack callback data MAV_COMP_ID_AUTOPILOT1, // the ID of the autopilot MAV_CMD_CONFIGURE_ACTUATOR, // the mavlink command (int)_type, // action type diff --git a/src/Vehicle/Actuators/ActuatorActions.h b/src/Vehicle/Actuators/ActuatorActions.h index ff27065..c96c502 100644 --- a/src/Vehicle/Actuators/ActuatorActions.h +++ b/src/Vehicle/Actuators/ActuatorActions.h @@ -48,7 +48,8 @@ public: Q_INVOKABLE void trigger(); private: - static void ackHandlerEntry(void* resultHandlerData, int compId, const mavlink_command_ack_t& ack, Vehicle::MavCmdResultFailureCode_t failureCode); + static void ackHandlerEntry(void* resultHandlerData, int compId, MAV_RESULT commandResult, uint8_t progress, + Vehicle::MavCmdResultFailureCode_t failureCode); void ackHandler(MAV_RESULT commandResult, Vehicle::MavCmdResultFailureCode_t failureCode); void sendMavlinkRequest(); diff --git a/src/Vehicle/Actuators/ActuatorTesting.cc b/src/Vehicle/Actuators/ActuatorTesting.cc index ad648b9..bee1fd3 100644 --- a/src/Vehicle/Actuators/ActuatorTesting.cc +++ b/src/Vehicle/Actuators/ActuatorTesting.cc @@ -120,10 +120,11 @@ void ActuatorTest::setActive(bool active) _active = active; } -void ActuatorTest::ackHandlerEntry(void* resultHandlerData, int /*compId*/, const mavlink_command_ack_t& ack, Vehicle::MavCmdResultFailureCode_t failureCode) +void ActuatorTest::ackHandlerEntry(void* resultHandlerData, int compId, MAV_RESULT commandResult, uint8_t progress, + Vehicle::MavCmdResultFailureCode_t failureCode) { ActuatorTest* actuatorTest = (ActuatorTest*)resultHandlerData; - actuatorTest->ackHandler(static_cast(ack.result), failureCode); + actuatorTest->ackHandler(commandResult, failureCode); } void ActuatorTest::ackHandler(MAV_RESULT commandResult, Vehicle::MavCmdResultFailureCode_t failureCode) @@ -189,12 +190,9 @@ void ActuatorTest::sendMavlinkRequest(int function, float value, float timeout) // TODO: consider using a lower command timeout - Vehicle::MavCmdAckHandlerInfo_t handlerInfo = {}; - handlerInfo.resultHandler = ackHandlerEntry; - handlerInfo.resultHandlerData = this; - _vehicle->sendMavCommandWithHandler( - &handlerInfo, + ackHandlerEntry, // Ack callback + this, // Ack callback data MAV_COMP_ID_AUTOPILOT1, // the ID of the autopilot MAV_CMD_ACTUATOR_TEST, // the mavlink command value, // value diff --git a/src/Vehicle/Actuators/ActuatorTesting.h b/src/Vehicle/Actuators/ActuatorTesting.h index de75249..1c52f38 100644 --- a/src/Vehicle/Actuators/ActuatorTesting.h +++ b/src/Vehicle/Actuators/ActuatorTesting.h @@ -110,7 +110,8 @@ private: void resetStates(); - static void ackHandlerEntry(void* resultHandlerData, int compId, const mavlink_command_ack_t& ack, Vehicle::MavCmdResultFailureCode_t failureCode); + static void ackHandlerEntry(void* resultHandlerData, int compId, MAV_RESULT commandResult, uint8_t progress, + Vehicle::MavCmdResultFailureCode_t failureCode); void ackHandler(MAV_RESULT commandResult, Vehicle::MavCmdResultFailureCode_t failureCode); void sendMavlinkRequest(int function, float value, float timeout); diff --git a/src/Vehicle/Actuators/Actuators.cc b/src/Vehicle/Actuators/Actuators.cc index 01231d4..06cd17e 100644 --- a/src/Vehicle/Actuators/Actuators.cc +++ b/src/Vehicle/Actuators/Actuators.cc @@ -103,9 +103,6 @@ void Actuators::updateGeometryImage() _imageRefreshFlag = !_imageRefreshFlag; emit imageRefreshFlagChanged(); - - _motorAssignmentEnabled = provider->numMotors() > 0; - emit motorAssignmentEnabledChanged(); } bool Actuators::isMultirotor() const @@ -239,7 +236,7 @@ void Actuators::parametersChanged() _actuatorTest.updateFunctions(actuators); // check if there are required functions, but not set on any output - QSet requiredFunctions = _mixer.getFunctions(true); + QSet requiredFunctions = _mixer.requiredFunctions(); _hasUnsetRequiredFunctions = false; for (int requiredFunction : requiredFunctions) { if (uniqueConfiguredFunctions.find(requiredFunction) == uniqueConfiguredFunctions.end()) { @@ -248,92 +245,11 @@ void Actuators::parametersChanged() } emit hasUnsetRequiredFunctionsChanged(); - updateFunctionMetadata(); - updateActuatorActions(); updateGeometryImage(); } -void Actuators::updateFunctionMetadata() -{ - // Update the function parameter metadata: - // - remove the mixer functions that are unused with the current configration (e.g. if 4 motors -> remove motors 5-N) - // - use the specific labels - QSet usedMixerFunctions = _mixer.getFunctions(false); - - QMap usedMixerLabels; - for (int usedMixerFunction : usedMixerFunctions) { - usedMixerLabels[usedMixerFunction] = _mixer.getSpecificLabelForFunction(usedMixerFunction); - } - - if (_usedMixerLabels == usedMixerLabels) { - // no update required - return; - } - _usedMixerLabels = usedMixerLabels; - - // Get the unused mixer functions - QSet removedMixerFunctions; - for(Mixer::ActuatorTypes::const_iterator iter = _mixer.actuatorTypes().constBegin(); - iter != _mixer.actuatorTypes().constEnd(); ++iter) { - if (iter.key() == "DEFAULT") - continue; - - for (int i = iter.value().functionMin; i <= iter.value().functionMax; ++i) { - if (!usedMixerFunctions.contains(i)) { - removedMixerFunctions.insert(i); - } - } - } - - // Now update all function facts (we need to treat them individually, as some might have extra functions) - for (int groupIdx = 0; groupIdx < _actuatorOutputs->count(); groupIdx++) { - ActuatorOutput* group = qobject_cast(_actuatorOutputs->get(groupIdx)); - - group->forEachOutputFunction([&](ActuatorOutputSubgroup* subgroup, ChannelConfigInstance*, Fact* fact) { - QStringList enumStrings = fact->enumStrings(); - if (!enumStrings.empty()) { - QVariantList enumValues = fact->enumValues(); - - // Replace or add - for (int usedMixerFunction : usedMixerFunctions) { - QString label = usedMixerLabels[usedMixerFunction]; - int index = enumValues.indexOf(usedMixerFunction); - if (index == -1) { - // Insert at the right place - bool inserted = false; - for (index = 0; index < enumValues.count() && !inserted; ++index) { - if (enumValues[index].toInt() > usedMixerFunction) { - enumValues.insert(index, usedMixerFunction); - enumStrings.insert(index, label); - inserted = true; - } - } - if (!inserted) { - enumValues.append(usedMixerFunction); - enumStrings.append(label); - } - } else { - enumStrings[index] = label; - } - } - - // Remove - for (int removedMixerFunction : removedMixerFunctions) { - int index = enumValues.indexOf(removedMixerFunction); - if (index != -1) { - enumValues.removeAt(index); - enumStrings.removeAt(index); - } - } - - fact->setEnumInfo(enumStrings, enumValues); - } - }); - } -} - void Actuators::updateActuatorActions() { _actuatorActions->clearAndDeleteContents(); @@ -399,7 +315,7 @@ bool Actuators::parseJson(const QJsonDocument &json) // parse outputs QJsonArray outputs = outputsJson.toArray(); - for (const auto &&outputJson : outputs) { + for (const auto &outputJson : outputs) { QJsonValue output = outputJson.toObject(); QString label = output["label"].toString(); @@ -428,12 +344,12 @@ bool Actuators::parseJson(const QJsonDocument &json) }; QJsonArray parameters = output["parameters"].toArray(); - for (const auto&& parameterJson : parameters) { + for (const auto& parameterJson : parameters) { currentActuatorOutput->addConfigParam(parseParam(parameterJson.toObject())); } QJsonArray subgroups = output["subgroups"].toArray(); - for (const auto&& subgroupJson : subgroups) { + for (const auto& subgroupJson : subgroups) { QJsonValue subgroup = subgroupJson.toObject(); QString subgroupLabel = subgroup["label"].toString(); ActuatorOutputSubgroup* actuatorSubgroup = new ActuatorOutputSubgroup(this, subgroupLabel); @@ -462,7 +378,7 @@ bool Actuators::parseJson(const QJsonDocument &json) } if (knownAction) { QJsonArray actuatorTypesArr = actionObj["actuator-types"].toArray(); - for (const auto&& type : actuatorTypesArr) { + for (const auto &type : actuatorTypesArr) { action.actuatorTypes.insert(type.toString()); } action.condition = Condition(actionObj["supported-if"].toString(), _vehicle->parameterManager()); @@ -473,12 +389,12 @@ bool Actuators::parseJson(const QJsonDocument &json) } QJsonArray parameters = subgroup["parameters"].toArray(); - for (const auto&& parameterJson : parameters) { + for (const auto& parameterJson : parameters) { actuatorSubgroup->addConfigParam(parseParam(parameterJson.toObject())); } QJsonArray channelParameters = subgroup["per-channel-parameters"].toArray(); - for (const auto&& channelParametersJson : channelParameters) { + for (const auto& channelParametersJson : channelParameters) { QJsonValue channelParameter = channelParametersJson.toObject(); Parameter param; param.parse(channelParameter); @@ -507,7 +423,7 @@ bool Actuators::parseJson(const QJsonDocument &json) } QJsonArray channels = subgroup["channels"].toArray(); - for (const auto&& channelJson : channels) { + for (const auto& channelJson : channels) { QJsonValue channel = channelJson.toObject(); QString channelLabel = channel["label"].toString(); int paramIndex = channel["param-index"].toInt(); @@ -563,7 +479,7 @@ bool Actuators::parseJson(const QJsonDocument &json) actuatorType.values.reversible = values["reversible"].toBool(); QJsonArray perItemParametersJson = actuatorTypeVal["per-item-parameters"].toArray(); - for (const auto&& perItemParameterJson : perItemParametersJson) { + for (const auto& perItemParameterJson : perItemParametersJson) { QJsonValue perItemParameter = perItemParameterJson.toObject(); Parameter param{}; param.parse(perItemParameter); @@ -589,15 +505,13 @@ bool Actuators::parseJson(const QJsonDocument &json) Mixer::MixerOptions mixerOptions{}; QJsonValue mixerConfigJson = mixerJson.toObject().value("config"); QJsonArray mixerConfigJsonArr = mixerConfigJson.toArray(); - for (const auto&& mixerConfigJson : mixerConfigJsonArr) { + for (const auto& mixerConfigJson : mixerConfigJsonArr) { QJsonValue mixerConfig = mixerConfigJson.toObject(); Mixer::MixerOption option{}; option.option = mixerConfig["option"].toString(); option.type = mixerConfig["type"].toString(); - option.title = mixerConfig["title"].toString(); - option.helpUrl = mixerConfig["help-url"].toString(); QJsonArray actuatorsJson = mixerConfig["actuators"].toArray(); - for (const auto&& actuatorJson : actuatorsJson) { + for (const auto& actuatorJson : actuatorsJson) { QJsonValue actuatorJsonVal = actuatorJson.toObject(); Mixer::MixerOption::ActuatorGroup actuator{}; actuator.groupLabel = actuatorJsonVal["group-label"].toString(); @@ -609,7 +523,7 @@ bool Actuators::parseJson(const QJsonDocument &json) actuator.actuatorType = actuatorJsonVal["actuator-type"].toString(); actuator.required = actuatorJsonVal["required"].toBool(false); QJsonArray parametersJson = actuatorJsonVal["parameters"].toArray(); - for (const auto&& parameterJson : parametersJson) { + for (const auto& parameterJson : parametersJson) { QJsonValue parameter = parameterJson.toObject(); Parameter mixerParameter{}; mixerParameter.parse(parameter); @@ -617,7 +531,7 @@ bool Actuators::parseJson(const QJsonDocument &json) } QJsonArray perItemParametersJson = actuatorJsonVal["per-item-parameters"].toArray(); - for (const auto&& parameterJson : perItemParametersJson) { + for (const auto& parameterJson : perItemParametersJson) { QJsonValue parameter = parameterJson.toObject(); Mixer::MixerParameter mixerParameter{}; mixerParameter.param.parse(parameter); @@ -646,7 +560,7 @@ bool Actuators::parseJson(const QJsonDocument &json) bool invalid = false; if (mixerParameter.param.name == "") { QJsonArray valuesJson = parameter["value"].toArray(); - for (const auto&& valueJson : valuesJson) { + for (const auto& valueJson : valuesJson) { mixerParameter.values.append(valueJson.toDouble()); } @@ -664,7 +578,7 @@ bool Actuators::parseJson(const QJsonDocument &json) actuator.itemLabelPrefix.append(actuatorJsonVal["item-label-prefix"].toString()); } else { QJsonArray itemLabelPrefixJson = actuatorJsonVal["item-label-prefix"].toArray(); - for (const auto&& itemLabelPrefix : itemLabelPrefixJson) { + for (const auto& itemLabelPrefix : itemLabelPrefixJson) { actuator.itemLabelPrefix.append(itemLabelPrefix.toString()); } if (actuator.fixedCount != actuator.itemLabelPrefix.size() && actuator.itemLabelPrefix.size() > 1) { @@ -681,13 +595,13 @@ bool Actuators::parseJson(const QJsonDocument &json) QList rules; QJsonValue mixerRulesJson = mixerJson.toObject().value("rules"); QJsonArray mixerRulesJsonArr = mixerRulesJson.toArray(); - for (const auto&& mixerRuleJson : mixerRulesJsonArr) { + for (const auto& mixerRuleJson : mixerRulesJsonArr) { QJsonValue mixerRule = mixerRuleJson.toObject(); Mixer::Rule rule{}; rule.selectIdentifier = mixerRule["select-identifier"].toString(); QJsonArray identifiersJson = mixerRule["apply-identifiers"].toArray(); - for (const auto&& identifierJson : identifiersJson) { + for (const auto& identifierJson : identifiersJson) { rule.applyIdentifiers.append(identifierJson.toString()); } @@ -698,7 +612,7 @@ bool Actuators::parseJson(const QJsonDocument &json) if (ok) { QJsonArray itemsArr = itemsJson.value(itemKey).toArray(); QList items{}; - for (const auto&& itemJson : itemsArr) { + for (const auto& itemJson : itemsArr) { QJsonObject itemObj = itemJson.toObject(); Mixer::Rule::RuleItem item{}; @@ -760,7 +674,13 @@ bool Actuators::showUi() const bool Actuators::initMotorAssignment() { GeometryImage::VehicleGeometryImageProvider* provider = GeometryImage::VehicleGeometryImageProvider::instance(); - int numMotors = provider->numMotors(); + int numMotors = 0; + QList& actuators = provider->actuators(); + for (const auto& actuator : actuators) { + if (actuator.type == ActuatorGeometry::Type::Motor) { + ++numMotors; + } + } // get the minimum function for motors bool ret = false; diff --git a/src/Vehicle/Actuators/Actuators.h b/src/Vehicle/Actuators/Actuators.h index 4e1e54b..2f552a6 100644 --- a/src/Vehicle/Actuators/Actuators.h +++ b/src/Vehicle/Actuators/Actuators.h @@ -33,7 +33,6 @@ public: Q_PROPERTY(bool imageRefreshFlag READ imageRefreshFlag NOTIFY imageRefreshFlagChanged) Q_PROPERTY(bool hasUnsetRequiredFunctions READ hasUnsetRequiredFunctions NOTIFY hasUnsetRequiredFunctionsChanged) Q_PROPERTY(bool motorAssignmentActive READ motorAssignmentActive NOTIFY motorAssignmentActiveChanged) - Q_PROPERTY(bool motorAssignmentEnabled READ motorAssignmentEnabled NOTIFY motorAssignmentEnabledChanged) Q_PROPERTY(QString motorAssignmentMessage READ motorAssignmentMessage NOTIFY motorAssignmentMessageChanged) Q_PROPERTY(ActuatorTesting::ActuatorTest* actuatorTest READ actuatorTest CONSTANT) @@ -76,7 +75,6 @@ public: Q_INVOKABLE void spinCurrentMotor() { _motorAssignment.spinCurrentMotor(); } Q_INVOKABLE void abortMotorAssignment(); bool motorAssignmentActive() const { return _motorAssignment.active(); } - bool motorAssignmentEnabled() const { return _motorAssignmentEnabled; } const QString& motorAssignmentMessage() const { return _motorAssignment.message(); } public slots: @@ -88,7 +86,6 @@ signals: void imageRefreshFlagChanged(); void hasUnsetRequiredFunctionsChanged(); void motorAssignmentActiveChanged(); - void motorAssignmentEnabledChanged(); void motorAssignmentMessageChanged(); void actuatorActionsChanged(); @@ -106,8 +103,6 @@ private: void highlightActuators(bool highlight); - void updateFunctionMetadata(); - QSet _subscribedFacts{}; QJsonDocument _jsonMetadata; bool _init{false}; @@ -117,11 +112,9 @@ private: ActuatorTesting::ActuatorTest _actuatorTest; Mixer::Mixers _mixer; MotorAssignment _motorAssignment; - bool _motorAssignmentEnabled{false}; bool _hasUnsetRequiredFunctions{false}; bool _imageRefreshFlag{false}; ///< indicator to QML to reload the image int _selectedActuatorOutput{0}; Vehicle* _vehicle{nullptr}; - QMap _usedMixerLabels; }; diff --git a/src/Vehicle/Actuators/GeometryImage.cc b/src/Vehicle/Actuators/GeometryImage.cc index e83c2b4..bd7a819 100644 --- a/src/Vehicle/Actuators/GeometryImage.cc +++ b/src/Vehicle/Actuators/GeometryImage.cc @@ -415,14 +415,3 @@ int VehicleGeometryImageProvider::getHighlightedMotorIndexAtPos(const QPointF &p } return -1; } - -int VehicleGeometryImageProvider::numMotors() const -{ - int numMotors = 0; - for (const auto& actuator : _actuators) { - if (actuator.type == ActuatorGeometry::Type::Motor) { - ++numMotors; - } - } - return numMotors; -} diff --git a/src/Vehicle/Actuators/GeometryImage.h b/src/Vehicle/Actuators/GeometryImage.h index 5e0021c..34a0b1b 100644 --- a/src/Vehicle/Actuators/GeometryImage.h +++ b/src/Vehicle/Actuators/GeometryImage.h @@ -50,8 +50,6 @@ public: QList& actuators() { return _actuators; } - int numMotors() const; - private: VehicleGeometryImageProvider(); ~VehicleGeometryImageProvider() = default; diff --git a/src/Vehicle/Actuators/Mixer.cc b/src/Vehicle/Actuators/Mixer.cc index e81bdda..952fcc9 100644 --- a/src/Vehicle/Actuators/Mixer.cc +++ b/src/Vehicle/Actuators/Mixer.cc @@ -15,215 +15,6 @@ using namespace Mixer; -ChannelConfigInstance* ChannelConfig::instantiate(int paramIndex, int actuatorTypeIndex, - ParameterManager* parameterManager, std::function factAddedCb) -{ - QString param = _parameter.param.name; - int usedParamIndex; - if (_isActuatorTypeConfig) { - usedParamIndex = actuatorTypeIndex + indexOffset(); - } else { - usedParamIndex = paramIndex + indexOffset(); - } - param.replace("${i}", QString::number(usedParamIndex)); - - Fact* fact = nullptr; - if (param == "" && !_isActuatorTypeConfig) { // constant value - float value = 0.f; - if (fixedValues().size() == 1) { - value = fixedValues()[0]; - } else if (paramIndex < fixedValues().size()) { - value = fixedValues()[paramIndex]; - } - - FactMetaData* metaData = new FactMetaData(FactMetaData::valueTypeFloat, "", this); - metaData->setReadOnly(true); - metaData->setDecimalPlaces(4); - fact = new Fact("", metaData, this); - fact->setRawValue(value); - - } else if (parameterManager->parameterExists(FactSystem::defaultComponentId, param)) { - fact = parameterManager->getParameter(FactSystem::defaultComponentId, param); - if (displayOption() == Parameter::DisplayOption::Bitset) { - fact = new FactBitset(this, fact, usedParamIndex); - } else if (displayOption() == Parameter::DisplayOption::BoolTrueIfPositive) { - fact = new FactFloatAsBool(this, fact); - } - factAddedCb(function(), fact); - } else { - qCDebug(ActuatorsConfigLog) << "ActuatorOutputChannel: Param does not exist:" << param; - } - - ChannelConfigInstance* instance = new ChannelConfigInstance(this, fact, *this); - channelInstanceCreated(instance); - return instance; -} - -void ChannelConfig::channelInstanceCreated(ChannelConfigInstance* instance) -{ - _instances.append(instance); - connect(instance, &ChannelConfigInstance::visibleChanged, - this, &ChannelConfig::instanceVisibleChanged); -} - -void ChannelConfig::instanceVisibleChanged() -{ - bool visible = false; - for (const auto& instance : _instances) { - if (instance->visible()) { - visible = true; - } - } - - if (visible != _visible) { - _visible = visible; - emit visibleChanged(); - } -} - -ChannelConfigInstance* ChannelConfigVirtualAxis::instantiate(int paramIndex, int actuatorTypeIndex, - ParameterManager* parameterManager, std::function factAddedCb) -{ - ChannelConfigInstance* instance = new ChannelConfigInstanceVirtualAxis(this, *this); - channelInstanceCreated(instance); - return instance; -} - -void ChannelConfigInstanceVirtualAxis::allInstancesInitialized(QmlObjectListModel* configInstances) -{ - for (int i = 0; i < configInstances->count(); ++i) { - auto channelConfigInstance = configInstances->value(i); - if (channelConfigInstance->channelConfig()->function() == Function::AxisX) { - _axes[0] = channelConfigInstance; - } else if (channelConfigInstance->channelConfig()->function() == Function::AxisY) { - _axes[1] = channelConfigInstance; - } else if (channelConfigInstance->channelConfig()->function() == Function::AxisZ) { - _axes[2] = channelConfigInstance; - } - } - Q_ASSERT(_axes[0] && _axes[1] && _axes[2]); - - for (int i = 0; i < 3; ++i) { - if (!_axes[i]->fact()) - return; - } - - // Initialize fact - QStringList enumStrings{tr("Custom"), tr("Upwards"), tr("Downwards"), tr("Forwards"), tr("Backwards"), - tr("Leftwards"), tr("Rightwards")}; - QVariantList enumValues{0, 1, 2, 3, 4, 5, 6}; - FactMetaData* metaData = new FactMetaData(FactMetaData::valueTypeUint32, this); - metaData->setEnumInfo(enumStrings, enumValues); - _fact = new Fact("", metaData, this); - setFactFromAxes(); - - connect(_fact, &Fact::rawValueChanged, this, &ChannelConfigInstanceVirtualAxis::setAxesFromFact); - for (int i=0; i < 3; ++i) { - connect(_axes[i]->fact(), &Fact::rawValueChanged, - this, [this](){ ChannelConfigInstanceVirtualAxis::setFactFromAxes(true); }); - } - // Inherit visibility & enabled from the first axis - connect(_axes[0], &ChannelConfigInstance::visibleChanged, - this, &ChannelConfigInstanceVirtualAxis::axisVisibleChanged); - connect(_axes[0], &ChannelConfigInstance::enabledChanged, - this, &ChannelConfigInstanceVirtualAxis::axisEnableChanged); - axisVisibleChanged(); - axisEnableChanged(); -} - -void ChannelConfigInstanceVirtualAxis::axisVisibleChanged() -{ - if (_axes[0]->visibleRule() != visibleRule()) { - setVisibleRule(_axes[0]->visibleRule()); - } -} - -void ChannelConfigInstanceVirtualAxis::axisEnableChanged() -{ - if (_axes[0]->enabledRule() != enabledRule()) { - setEnabledRule(_axes[0]->enabledRule()); - } -} - -void ChannelConfigInstanceVirtualAxis::setFactFromAxes(bool keepVisible) -{ - if (_ignoreChange) { - return; - } - _ignoreChange = true; - float x = _axes[0]->fact()->rawValue().toFloat(); - float y = _axes[1]->fact()->rawValue().toFloat(); - float z = _axes[2]->fact()->rawValue().toFloat(); - Direction direction{Direction::Custom}; // set to custom if no match - const float eps = 0.00001f; - if (fabsf(x) < eps && fabsf(y) < eps && fabsf(z + 1.f) < eps) { - direction = Direction::Upwards; - } else if (fabsf(x) < eps && fabsf(y) < eps && fabsf(z - 1.f) < eps) { - direction = Direction::Downwards; - } else if (fabsf(x - 1.f) < eps && fabsf(y) < eps && fabsf(z) < eps) { - direction = Direction::Forwards; - } else if (fabsf(x + 1.f) < eps && fabsf(y) < eps && fabsf(z) < eps) { - direction = Direction::Backwards; - } else if (fabsf(x) < eps && fabsf(y + 1.f) < eps && fabsf(z) < eps) { - direction = Direction::Leftwards; - } else if (fabsf(x) < eps && fabsf(y - 1.f) < eps && fabsf(z) < eps) { - direction = Direction::Rightwards; - } - _fact->setRawValue((uint32_t)direction); - - bool visible = direction == Direction::Custom || keepVisible; - for(int i=0; i < 3; ++i) { - _axes[i]->setVisibleAxis(visible); - } - _ignoreChange = false; -} - -void ChannelConfigInstanceVirtualAxis::setAxesFromFact() -{ - if (_ignoreChange) { - return; - } - _ignoreChange = true; - int directionIdx = _fact->rawValue().toInt(); - - if (directionIdx > 0) { - Direction direction = (Direction)directionIdx; - float x{}, y{}, z{}; - switch (direction) { - case Direction::Upwards: - x = 0.f; y = 0.f; z = -1.f; - break; - case Direction::Downwards: - x = 0.f; y = 0.f; z = 1.f; - break; - case Direction::Forwards: - x = 1.f; y = 0.f; z = 0.f; - break; - case Direction::Backwards: - x = -1.f; y = 0.f; z = 0.f; - break; - case Direction::Leftwards: - x = 0.f; y = -1.f; z = 0.f; - break; - case Direction::Rightwards: - x = 0.f; y = 1.f; z = 0.f; - break; - case Direction::Custom: - break; - } - _axes[0]->fact()->setRawValue(x); - _axes[1]->fact()->setRawValue(y); - _axes[2]->fact()->setRawValue(z); - } - - - bool visible = directionIdx == 0; - for(int i=0; i < 3; ++i) { - _axes[i]->setVisibleAxis(visible); - } - _ignoreChange = false; -} - MixerChannel::MixerChannel(QObject *parent, const QString &label, int actuatorFunction, int paramIndex, int actuatorTypeIndex, QmlObjectListModel &channelConfigs, ParameterManager* parameterManager, const Rule* rule, std::function factAddedCb) @@ -232,11 +23,44 @@ MixerChannel::MixerChannel(QObject *parent, const QString &label, int actuatorFu { for (int i = 0; i < channelConfigs.count(); ++i) { auto channelConfig = channelConfigs.value(i); + QString param = channelConfig->parameter(); + int usedParamIndex; + if (channelConfig->isActuatorTypeConfig()) { + usedParamIndex = actuatorTypeIndex + channelConfig->indexOffset(); + } else { + usedParamIndex = paramIndex + channelConfig->indexOffset(); + } + param.replace("${i}", QString::number(usedParamIndex)); - ChannelConfigInstance* instance = channelConfig->instantiate(paramIndex, actuatorTypeIndex, parameterManager, factAddedCb); - Fact* fact = instance->fact(); + Fact* fact = nullptr; + if (param == "" && !channelConfig->isActuatorTypeConfig()) { // constant value + float value = 0.f; + if (channelConfig->fixedValues().size() == 1) { + value = channelConfig->fixedValues()[0]; + } else if (paramIndex < channelConfig->fixedValues().size()) { + value = channelConfig->fixedValues()[paramIndex]; + } + + FactMetaData* metaData = new FactMetaData(FactMetaData::valueTypeFloat, "", this); + metaData->setReadOnly(true); + metaData->setDecimalPlaces(4); + fact = new Fact("", metaData, this); + fact->setRawValue(value); + + } else if (parameterManager->parameterExists(FactSystem::defaultComponentId, param)) { + fact = parameterManager->getParameter(FactSystem::defaultComponentId, param); + if (channelConfig->displayOption() == Parameter::DisplayOption::Bitset) { + fact = new FactBitset(channelConfig, fact, usedParamIndex); + } else if (channelConfig->displayOption() == Parameter::DisplayOption::BoolTrueIfPositive) { + fact = new FactFloatAsBool(channelConfig, fact); + } + factAddedCb(channelConfig->function(), fact); + } else { + qCDebug(ActuatorsConfigLog) << "ActuatorOutputChannel: Param does not exist:" << param; + } // if we have a valid rule, check the identifiers + int applyIdentifierIdx = -1; if (rule) { if (channelConfig->identifier() == rule->selectIdentifier) { _ruleSelectIdentifierIdx = _configInstances->count(); @@ -246,7 +70,7 @@ MixerChannel::MixerChannel(QObject *parent, const QString &label, int actuatorFu } else { for (int i = 0; i < rule->applyIdentifiers.size(); ++i) { if (channelConfig->identifier() == rule->applyIdentifiers[i]) { - instance->setRuleApplyIdentifierIdx(i); + applyIdentifierIdx = i; } } } @@ -256,14 +80,10 @@ MixerChannel::MixerChannel(QObject *parent, const QString &label, int actuatorFu } } + ChannelConfigInstance* instance = new ChannelConfigInstance(this, fact, *channelConfig, applyIdentifierIdx); _configInstances->append(instance); } - for (int i = 0; i < _configInstances->count(); ++i) { - auto channelConfigInstance = _configInstances->value(i); - channelConfigInstance->allInstancesInitialized(_configInstances); - } - applyRule(true); } @@ -302,8 +122,8 @@ void MixerChannel::applyRule(bool noConstraints) // here we could notify the user that a constraint got applied... configInstance->fact()->setRawValue(factValue); } - configInstance->setVisibleRule(!ruleItem.hidden); - configInstance->setEnabledRule(!ruleItem.disabled); + configInstance->setVisible(!ruleItem.hidden); + configInstance->setEnabled(!ruleItem.disabled); } } @@ -311,8 +131,8 @@ void MixerChannel::applyRule(bool noConstraints) // no rule set for this value, just reset for (int i = 0; i < _configInstances->count(); ++i) { ChannelConfigInstance* configInstance = _configInstances->value(i); - configInstance->setVisibleRule(true); - configInstance->setEnabledRule(true); + configInstance->setVisible(true); + configInstance->setEnabled(true); } } _currentSelectIdentifierValue = value; @@ -460,18 +280,9 @@ void Mixers::update() } const Rule* selectedRule{nullptr}; // at most 1 rule can be applied - int axisIdx[3]{-1, -1, -1}; for (const auto& perItemParam : actuatorGroup.perItemParameters) { currentMixerGroup->addChannelConfig(new ChannelConfig(currentMixerGroup, perItemParam, false)); - if (perItemParam.function == Function::AxisX) { - axisIdx[0] = currentMixerGroup->channelConfigs()->count() - 1; - } else if (perItemParam.function == Function::AxisY) { - axisIdx[1] = currentMixerGroup->channelConfigs()->count() - 1; - } else if (perItemParam.function == Function::AxisZ) { - axisIdx[2] = currentMixerGroup->channelConfigs()->count() - 1; - } - if (!perItemParam.identifier.isEmpty()) { for (const auto& rule : _rules) { if (rule.selectIdentifier == perItemParam.identifier) { @@ -481,18 +292,6 @@ void Mixers::update() } } - // Add virtual axis dropdown configuration param if all 3 axes are found - if (axisIdx[0] >= 0 && axisIdx[1] >= 0 && axisIdx[2] >= 0) { - ChannelConfig* axisXConfig = currentMixerGroup->channelConfigs()->value(axisIdx[0]); - MixerParameter parameter = axisXConfig->config(); // use axisX as base (somewhat arbitrary) - parameter.function = Function::Unspecified; - parameter.param.name = ""; - parameter.param.label = tr("Axis"); - parameter.identifier = ""; - ChannelConfig* virtualChannelConfig = new ChannelConfigVirtualAxis(currentMixerGroup, parameter); - currentMixerGroup->channelConfigs()->insert(axisIdx[0], virtualChannelConfig); - } - // 'count' param if (actuatorGroup.count != "") { currentMixerGroup->setCountParam(new ConfigParameter(currentMixerGroup, getFact(actuatorGroup.count), @@ -518,7 +317,7 @@ void Mixers::update() } if (itemLabelPrefix != "") { label = itemLabelPrefix + " (" + label + ")"; - _functionsSpecificLabel[actuatorFunction] = itemLabelPrefix; + _functionsSpecificLabel[actuatorFunction] = label; } } auto factAdded = [this](Function function, Fact* fact) { @@ -549,37 +348,20 @@ void Mixers::update() QString Mixers::getSpecificLabelForFunction(int function) const { // Try to get it from the actuator type param - Fact* typeFact = nullptr; - for (int mixerGroupIdx = 0; !typeFact && mixerGroupIdx < _groups->count(); ++mixerGroupIdx) { + for (int mixerGroupIdx = 0; mixerGroupIdx < _groups->count(); ++mixerGroupIdx) { Mixer::MixerConfigGroup* mixerGroup = _groups->value(mixerGroupIdx); - for (int mixerChannelIdx = 0; !typeFact && mixerChannelIdx < mixerGroup->channels()->count(); ++mixerChannelIdx) { + for (int mixerChannelIdx = 0; mixerChannelIdx < mixerGroup->channels()->count(); ++mixerChannelIdx) { Mixer::MixerChannel* mixerChannel = mixerGroup->channels()->value(mixerChannelIdx); if (mixerChannel->actuatorFunction() != function) { continue; } - typeFact = mixerChannel->getFact(Function::Type); - } - } - if (typeFact) { - // Now check if we have multiple functions configured with the same type. - // If so, add the function label to disambiguate - for (int mixerGroupIdx = 0; mixerGroupIdx < _groups->count(); ++mixerGroupIdx) { - Mixer::MixerConfigGroup* mixerGroup = _groups->value(mixerGroupIdx); - for (int mixerChannelIdx = 0; mixerChannelIdx < mixerGroup->channels()->count(); ++mixerChannelIdx) { - Mixer::MixerChannel* mixerChannel = mixerGroup->channels()->value(mixerChannelIdx); - - if (mixerChannel->actuatorFunction() == function) { - continue; - } - Fact* typeFactOther = mixerChannel->getFact(Function::Type); - if (typeFactOther && typeFactOther->rawValue() == typeFact->rawValue()) { - return typeFact->enumOrValueString() + " (" + _functions.value(function).label +")"; - } + Fact* typeFact = mixerChannel->getFact(Function::Type); + if (typeFact) { + return typeFact->enumOrValueString() + " (" + _functions.value(function).label +")"; } } - return typeFact->enumOrValueString(); } const auto iter = _functionsSpecificLabel.find(function); @@ -589,12 +371,12 @@ QString Mixers::getSpecificLabelForFunction(int function) const return *iter; } -QSet Mixers::getFunctions(bool requiredOnly) const +QSet Mixers::requiredFunctions() const { QSet ret; for (int mixerGroupIdx = 0; mixerGroupIdx < _groups->count(); ++mixerGroupIdx) { Mixer::MixerConfigGroup* mixerGroup = _groups->value(mixerGroupIdx); - if (!requiredOnly || mixerGroup->group().required) { + if (mixerGroup->group().required) { for (int mixerChannelIdx = 0; mixerChannelIdx < mixerGroup->channels()->count(); ++mixerChannelIdx) { const Mixer::MixerChannel* mixerChannel = mixerGroup->channels()->value(mixerChannelIdx); if (mixerChannel->actuatorFunction() != 0) { @@ -615,21 +397,6 @@ QString Mixers::configuredType() const return _mixerOptions[_selectedMixer].type; } -QString Mixers::title() const -{ - if (_selectedMixer == -1) { - return ""; - } - return _mixerOptions[_selectedMixer].title; -} -QString Mixers::helpUrl() const -{ - if (_selectedMixer == -1) { - return ""; - } - return _mixerOptions[_selectedMixer].helpUrl; -} - Fact* Mixers::getFact(const QString& paramName) { if (!_parameterManager->parameterExists(FactSystem::defaultComponentId, paramName)) { diff --git a/src/Vehicle/Actuators/Mixer.h b/src/Vehicle/Actuators/Mixer.h index 955b519..08bb6e6 100644 --- a/src/Vehicle/Actuators/Mixer.h +++ b/src/Vehicle/Actuators/Mixer.h @@ -78,8 +78,6 @@ struct MixerOption }; QString option{}; QString type{}; ///< Mixer type, e.g. multirotor - QString title{}; - QString helpUrl{}; QList actuators{}; }; @@ -128,8 +126,6 @@ private: const bool _advanced; }; -class ChannelConfigInstance; - /** * Config parameters that apply to individual channels */ @@ -142,15 +138,16 @@ public: : QObject(parent), _parameter(parameter), _isActuatorTypeConfig(isActuatorTypeConfig) {} Q_PROPERTY(QString label READ label CONSTANT) - Q_PROPERTY(bool visible READ visible NOTIFY visibleChanged) + Q_PROPERTY(bool visible READ visible CONSTANT) Q_PROPERTY(bool advanced READ advanced CONSTANT) const QString& label() const { return _parameter.param.label; } + const QString& parameter() const { return _parameter.param.name; } Function function() const { return _parameter.function; } bool advanced() const { return _parameter.param.advanced; } bool isActuatorTypeConfig() const { return _isActuatorTypeConfig; } - bool visible() const { return _visible; } + bool visible() const { return true; } const QList& fixedValues() const { return _parameter.values; } @@ -158,37 +155,9 @@ public: int indexOffset() const { return _parameter.param.indexOffset; } const QString& identifier() const { return _parameter.identifier; } - - const MixerParameter& config() const { return _parameter; } - - virtual ChannelConfigInstance* instantiate(int paramIndex, int actuatorTypeIndex, - ParameterManager* parameterManager, std::function factAddedCb); - -signals: - void visibleChanged(); -protected: - void channelInstanceCreated(ChannelConfigInstance* instance); - -private slots: - void instanceVisibleChanged(); - private: const MixerParameter _parameter; const bool _isActuatorTypeConfig; ///< actuator type config instead of mixer channel config - bool _visible{true}; ///< this is false if none of the instances is visible - QList _instances; -}; - -class ChannelConfigVirtualAxis : public ChannelConfig -{ - Q_OBJECT -public: - ChannelConfigVirtualAxis(QObject* parent, const MixerParameter& parameter) - : ChannelConfig(parent, parameter) {} - - ChannelConfigInstance* instantiate(int paramIndex, int actuatorTypeIndex, - ParameterManager* parameterManager, std::function factAddedCb) override; -private: }; /** @@ -198,8 +167,8 @@ class ChannelConfigInstance : public QObject { Q_OBJECT public: - ChannelConfigInstance(QObject* parent, Fact* fact, ChannelConfig& config) - : QObject(parent), _fact(fact), _config(config) {} + ChannelConfigInstance(QObject* parent, Fact* fact, ChannelConfig& config, int ruleApplyIdentifierIdx) + : QObject(parent), _fact(fact), _config(config), _ruleApplyIdentifierIdx(ruleApplyIdentifierIdx) {} Q_PROPERTY(ChannelConfig* config READ channelConfig CONSTANT) Q_PROPERTY(Fact* fact READ fact CONSTANT) @@ -210,66 +179,26 @@ public: Fact* fact() { return _fact; } - bool visible() const { return _visibleRule && _visibleAxis; } - bool enabled() const { return _enabledRule; } + bool visible() const { return _visible; } + bool enabled() const { return _enabled; } - bool visibleRule() const { return _visibleRule; } - bool enabledRule() const { return _enabledRule; } - - void setVisibleRule(bool visible) { _visibleRule = visible; emit visibleChanged(); } - void setEnabledRule(bool enabled) { _enabledRule = enabled; emit enabledChanged(); } - - void setVisibleAxis(bool visible) { _visibleAxis = visible; emit visibleChanged(); } + // controlled via rules + void setVisible(bool visible) { _visible = visible; emit visibleChanged(); } + void setEnabled(bool enabled) { _enabled = enabled; emit enabledChanged(); } int ruleApplyIdentifierIdx() const { return _ruleApplyIdentifierIdx; } - void setRuleApplyIdentifierIdx(int idx) { _ruleApplyIdentifierIdx = idx; } - - virtual void allInstancesInitialized(QmlObjectListModel* configInstances) {} signals: void visibleChanged(); void enabledChanged(); +private: -protected: Fact* _fact{nullptr}; - -private: ChannelConfig& _config; - int _ruleApplyIdentifierIdx{-1}; + const int _ruleApplyIdentifierIdx; - bool _visibleRule{true}; - bool _enabledRule{true}; - - bool _visibleAxis{true}; -}; - -class ChannelConfigInstanceVirtualAxis : public ChannelConfigInstance -{ - Q_OBJECT -public: - enum class Direction { - Custom = 0, - Upwards = 1, - Downwards = 2, - Forwards = 3, - Backwards = 4, - Leftwards = 5, - Rightwards = 6, - }; - ChannelConfigInstanceVirtualAxis(QObject* parent, ChannelConfig& config) - : ChannelConfigInstance(parent, nullptr, config) {} - - void allInstancesInitialized(QmlObjectListModel* configInstances) override; - -private slots: - void setFactFromAxes(bool keepVisible = false); - void setAxesFromFact(); - void axisVisibleChanged(); - void axisEnableChanged(); - -private: - ChannelConfigInstance* _axes[3]{}; - bool _ignoreChange{false}; + bool _visible{true}; + bool _enabled{true}; }; class MixerChannel : public QObject @@ -377,14 +306,9 @@ public: const QMap& functions, const Rules& rules); Q_PROPERTY(QmlObjectListModel* groups READ groups NOTIFY groupsChanged) - Q_PROPERTY(QString title READ title NOTIFY groupsChanged) - Q_PROPERTY(QString helpUrl READ helpUrl NOTIFY groupsChanged) QmlObjectListModel* groups() { return _groups; } - QString title() const; - QString helpUrl() const; - const ActuatorTypes& actuatorTypes() const { return _actuatorTypes; } /** @@ -397,9 +321,9 @@ public: QString getSpecificLabelForFunction(int function) const; /** - * Get the set of all (required) actuator functions + * Get the set of all required actuator functions */ - QSet getFunctions(bool requiredOnly) const; + QSet requiredFunctions() const; QString configuredType() const; diff --git a/src/Vehicle/Actuators/MotorAssignment.cc b/src/Vehicle/Actuators/MotorAssignment.cc index ea64793..7682ef8 100644 --- a/src/Vehicle/Actuators/MotorAssignment.cc +++ b/src/Vehicle/Actuators/MotorAssignment.cc @@ -17,7 +17,7 @@ MotorAssignment::MotorAssignment(QObject* parent, Vehicle* vehicle, QmlObjectListModel* actuators) : QObject(parent), _vehicle(vehicle), _actuators(actuators) { - _spinTimer.setInterval(_spinTimeoutDefaultSec); + _spinTimer.setInterval(1000); _spinTimer.setSingleShot(true); connect(&_spinTimer, &QTimer::timeout, this, &MotorAssignment::spinTimeout); } @@ -141,7 +141,6 @@ void MotorAssignment::start() } _state = State::Running; emit activeChanged(); - _spinTimer.setInterval(_assignMotors ? _spinTimeoutHighSec : _spinTimeoutDefaultSec); _spinTimer.start(); } @@ -170,7 +169,6 @@ void MotorAssignment::selectMotor(int motorIndex) emit activeChanged(); } else { // spin the next motor after some time - _spinTimer.setInterval(_spinTimeoutDefaultSec); _spinTimer.start(); } } @@ -197,10 +195,11 @@ void MotorAssignment::spinTimeout() spinCurrentMotor(); } -void MotorAssignment::ackHandlerEntry(void* resultHandlerData, int /*compId*/, const mavlink_command_ack_t& ack, Vehicle::MavCmdResultFailureCode_t failureCode) +void MotorAssignment::ackHandlerEntry(void* resultHandlerData, int compId, MAV_RESULT commandResult, uint8_t progress, + Vehicle::MavCmdResultFailureCode_t failureCode) { MotorAssignment* motorAssignment = (MotorAssignment*)resultHandlerData; - motorAssignment->ackHandler(static_cast(ack.result), failureCode); + motorAssignment->ackHandler(commandResult, failureCode); } void MotorAssignment::ackHandler(MAV_RESULT commandResult, Vehicle::MavCmdResultFailureCode_t failureCode) @@ -216,12 +215,9 @@ void MotorAssignment::sendMavlinkRequest(int function, float value) { qCDebug(ActuatorsConfigLog) << "Sending actuator test function:" << function << "value:" << value; - Vehicle::MavCmdAckHandlerInfo_t handlerInfo = {}; - handlerInfo.resultHandler = ackHandlerEntry; - handlerInfo.resultHandlerData = this; - _vehicle->sendMavCommandWithHandler( - &handlerInfo, + ackHandlerEntry, // Ack callback + this, // Ack callback data MAV_COMP_ID_AUTOPILOT1, // the ID of the autopilot MAV_CMD_ACTUATOR_TEST, // the mavlink command value, // value diff --git a/src/Vehicle/Actuators/MotorAssignment.h b/src/Vehicle/Actuators/MotorAssignment.h index 7b7fb60..6613889 100644 --- a/src/Vehicle/Actuators/MotorAssignment.h +++ b/src/Vehicle/Actuators/MotorAssignment.h @@ -59,10 +59,8 @@ private slots: void spinTimeout(); private: - static constexpr int _spinTimeoutDefaultSec = 1000; - static constexpr int _spinTimeoutHighSec = 3000; ///< wait a bit longer after assigning motors, so ESCs can initialize - - static void ackHandlerEntry(void* resultHandlerData, int compId, const mavlink_command_ack_t& ack, Vehicle::MavCmdResultFailureCode_t failureCode); + static void ackHandlerEntry(void* resultHandlerData, int compId, MAV_RESULT commandResult, uint8_t progress, + Vehicle::MavCmdResultFailureCode_t failureCode); void ackHandler(MAV_RESULT commandResult, Vehicle::MavCmdResultFailureCode_t failureCode); void sendMavlinkRequest(int function, float value); diff --git a/src/Vehicle/Autotune.cpp b/src/Vehicle/Autotune.cpp index 2c7fea1..8b6e18b 100644 --- a/src/Vehicle/Autotune.cpp +++ b/src/Vehicle/Autotune.cpp @@ -41,7 +41,7 @@ void Autotune::autotuneRequest() //----------------------------------------------------------------------------- -void Autotune::ackHandler(void* resultHandlerData, int compId, const mavlink_command_ack_t& ack, Vehicle::MavCmdResultFailureCode_t failureCode) +void Autotune::ackHandler(void* resultHandlerData, int compId, MAV_RESULT commandResult, uint8_t progress, Vehicle::MavCmdResultFailureCode_t failureCode) { Q_UNUSED(compId); Q_UNUSED(failureCode); @@ -49,38 +49,23 @@ void Autotune::ackHandler(void* resultHandlerData, int compId, const mavlink_com auto * autotune = static_cast(resultHandlerData); if (autotune->_autotuneInProgress) { - if (failureCode == Vehicle::MavCmdResultCommandResultOnly) { - if ((ack.result == MAV_RESULT_IN_PROGRESS) || (ack.result == MAV_RESULT_ACCEPTED)) { - autotune->handleAckStatus(ack.progress); - } - else if (ack.result == MAV_RESULT_FAILED) { - autotune->handleAckFailure(); - } - else { - autotune->handleAckError(ack.result); - } - } else { + if ((commandResult == MAV_RESULT_IN_PROGRESS) || (commandResult == MAV_RESULT_ACCEPTED)) { + autotune->handleAckStatus(progress); + } + else if (commandResult == MAV_RESULT_FAILED) { autotune->handleAckFailure(); } + else { + autotune->handleAckError(commandResult); + } + emit autotune->autotuneChanged(); - } else { + } + else { qWarning() << "Ack received for a command different from MAV_CMD_DO_AUTOTUNE_ENABLE ot wrong UI state."; } } -void Autotune::progressHandler(void* progressHandlerData, int compId, const mavlink_command_ack_t& ack) -{ - Q_UNUSED(compId); - - auto * autotune = static_cast(progressHandlerData); - - if (autotune->_autotuneInProgress) { - autotune->handleAckStatus(ack.progress); - emit autotune->autotuneChanged(); - } else { - qWarning() << "Ack received for a command different from MAV_CMD_DO_AUTOTUNE_ENABLE ot wrong UI state."; - } -} //----------------------------------------------------------------------------- bool Autotune::autotuneEnabled() @@ -177,14 +162,9 @@ void Autotune::stopTimers() //----------------------------------------------------------------------------- void Autotune::sendMavlinkRequest() { - Vehicle::MavCmdAckHandlerInfo_t handlerInfo = {}; - handlerInfo.resultHandler = ackHandler; - handlerInfo.resultHandlerData = this; - handlerInfo.progressHandler = progressHandler; - handlerInfo.progressHandlerData = this; - _vehicle->sendMavCommandWithHandler( - &handlerInfo, + ackHandler, // Ack callback + this, // Ack callback data MAV_COMP_ID_AUTOPILOT1, // the ID of the autopilot MAV_CMD_DO_AUTOTUNE_ENABLE, // the mavlink command 1, // request autotune diff --git a/src/Vehicle/Autotune.h b/src/Vehicle/Autotune.h index e7019fd..6da1883 100644 --- a/src/Vehicle/Autotune.h +++ b/src/Vehicle/Autotune.h @@ -28,8 +28,7 @@ public: Q_INVOKABLE void autotuneRequest (); - static void ackHandler (void* resultHandlerData, int compId, const mavlink_command_ack_t& ack, Vehicle::MavCmdResultFailureCode_t failureCode); - static void progressHandler (void* progressHandlerData, int compId, const mavlink_command_ack_t& ack); + static void ackHandler(void* resultHandlerData, int compId, MAV_RESULT commandResult, uint8_t progress, Vehicle::MavCmdResultFailureCode_t failureCode); bool autotuneEnabled (); bool autotuneInProgress () { return _autotuneInProgress; } diff --git a/src/Vehicle/CMakeLists.txt b/src/Vehicle/CMakeLists.txt index b703f7b..e137e7f 100644 --- a/src/Vehicle/CMakeLists.txt +++ b/src/Vehicle/CMakeLists.txt @@ -34,16 +34,14 @@ add_library(Vehicle ComponentInformationCache.h ComponentInformationManager.cc ComponentInformationManager.h - ComponentInformationTranslation.cc - ComponentInformationTranslation.h EventHandler.cc EventHandler.h FTPManager.cc FTPManager.h GPSRTKFactGroup.cc GPSRTKFactGroup.h - HealthAndArmingCheckReport.cc - HealthAndArmingCheckReport.h + HealthAndArmingChecks.cc + HealthAndArmingChecks.h ImageProtocolManager.cc ImageProtocolManager.h InitialConnectStateMachine.cc @@ -56,8 +54,6 @@ add_library(Vehicle MultiVehicleManager.h StateMachine.cc StateMachine.h - StandardModes.cc - StandardModes.h SysStatusSensorInfo.cc SysStatusSensorInfo.h TerrainFactGroup.cc @@ -73,14 +69,10 @@ add_library(Vehicle VehicleClockFactGroup.h VehicleDistanceSensorFactGroup.cc VehicleDistanceSensorFactGroup.h - VehicleEFIFactGroup.cc - VehicleEFIFactGroup.h VehicleEscStatusFactGroup.cc VehicleEscStatusFactGroup.h VehicleEstimatorStatusFactGroup.cc VehicleEstimatorStatusFactGroup.h - VehicleGeneratorFactGroup.cc - VehicleGeneratorFactGroup.h VehicleLocalPositionFactGroup.cc VehicleLocalPositionFactGroup.h VehicleLocalPositionSetpointFactGroup.cc @@ -104,8 +96,6 @@ add_library(Vehicle VehicleWindFactGroup.h VehicleHygrometerFactGroup.cc VehicleHygrometerFactGroup.h - RemoteIDManager.h - RemoteIDManager.cc ${EXTRA_SRC} ) @@ -117,7 +107,6 @@ target_link_libraries(Vehicle compression libevents_generated libevents_parser - libevents_health_and_arming_checks PUBLIC qgc ) diff --git a/src/Vehicle/ClockFact.json b/src/Vehicle/ClockFact.json index aab3552..53c4120 100644 --- a/src/Vehicle/ClockFact.json +++ b/src/Vehicle/ClockFact.json @@ -8,11 +8,6 @@ "shortDesc": "Time", "type": "string" }, -{ - "name": "currentUTCTime", - "shortDesc": "UTC Time", - "type": "string" -}, { "name": "currentDate", "shortDesc": "Date", diff --git a/src/Vehicle/CompInfo.h b/src/Vehicle/CompInfo.h index d5121f9..bcfffd6 100644 --- a/src/Vehicle/CompInfo.h +++ b/src/Vehicle/CompInfo.h @@ -36,10 +36,12 @@ public: uint32_t crcMetaDataFallback() const { return _uris.crcMetaDataFallback; } bool crcMetaDataValid() const { return _uris.crcMetaDataValid; } bool crcMetaDataFallbackValid() const { return _uris.crcMetaDataFallbackValid; } + uint32_t crcTranslation() const { return _uris.crcTranslation; } + bool crcTranslationValid() const { return _uris.crcTranslationValid; } void setUriMetaData(const QString& uri, uint32_t crc); - virtual void setJson(const QString& metaDataJsonFileName) = 0; + virtual void setJson(const QString& metaDataJsonFileName, const QString& translationJsonFileName) = 0; bool available() const { return !_uris.uriMetaData.isEmpty(); } @@ -53,9 +55,13 @@ private: struct Uris { bool crcMetaDataValid = false; bool crcMetaDataFallbackValid = false; + bool crcTranslationValid = false; + bool crcTranslationFallbackValid = false; uint32_t crcMetaData = 0; uint32_t crcMetaDataFallback = 0; + uint32_t crcTranslation = 0; + uint32_t crcTranslationFallback = 0; QString uriMetaData; QString uriMetaDataFallback; diff --git a/src/Vehicle/CompInfoActuators.cc b/src/Vehicle/CompInfoActuators.cc index 9e2f5a4..82d083e 100644 --- a/src/Vehicle/CompInfoActuators.cc +++ b/src/Vehicle/CompInfoActuators.cc @@ -16,10 +16,10 @@ CompInfoActuators::CompInfoActuators(uint8_t compId, Vehicle* vehicle, QObject* } -void CompInfoActuators::setJson(const QString& metadataJsonFileName) +void CompInfoActuators::setJson(const QString& metadataJsonFileName, const QString& translationJsonFileName) { if (!metadataJsonFileName.isEmpty()) { - vehicle->setActuatorsMetadata(compId, metadataJsonFileName); + vehicle->setActuatorsMetadata(compId, metadataJsonFileName, translationJsonFileName); } } diff --git a/src/Vehicle/CompInfoActuators.h b/src/Vehicle/CompInfoActuators.h index 749a000..3f3f1b8 100644 --- a/src/Vehicle/CompInfoActuators.h +++ b/src/Vehicle/CompInfoActuators.h @@ -25,7 +25,7 @@ public: CompInfoActuators(uint8_t compId, Vehicle* vehicle, QObject* parent = nullptr); // Overrides from CompInfo - void setJson(const QString& metadataJsonFileName) override; + void setJson(const QString& metadataJsonFileName, const QString& translationJsonFileName) override; private: }; diff --git a/src/Vehicle/CompInfoEvents.cc b/src/Vehicle/CompInfoEvents.cc index ac993ac..348f42c 100644 --- a/src/Vehicle/CompInfoEvents.cc +++ b/src/Vehicle/CompInfoEvents.cc @@ -16,8 +16,8 @@ CompInfoEvents::CompInfoEvents(uint8_t compId, Vehicle* vehicle, QObject* parent } -void CompInfoEvents::setJson(const QString& metadataJsonFileName) +void CompInfoEvents::setJson(const QString& metadataJsonFileName, const QString& translationJsonFileName) { - vehicle->setEventsMetadata(compId, metadataJsonFileName); + vehicle->setEventsMetadata(compId, metadataJsonFileName, translationJsonFileName); } diff --git a/src/Vehicle/CompInfoEvents.h b/src/Vehicle/CompInfoEvents.h index a66369d..c70d1ad 100644 --- a/src/Vehicle/CompInfoEvents.h +++ b/src/Vehicle/CompInfoEvents.h @@ -25,7 +25,7 @@ public: CompInfoEvents(uint8_t compId, Vehicle* vehicle, QObject* parent = nullptr); // Overrides from CompInfo - void setJson(const QString& metadataJsonFileName) override; + void setJson(const QString& metadataJsonFileName, const QString& translationJsonFileName) override; private: }; diff --git a/src/Vehicle/CompInfoGeneral.cc b/src/Vehicle/CompInfoGeneral.cc index f51aa2a..7a297e2 100644 --- a/src/Vehicle/CompInfoGeneral.cc +++ b/src/Vehicle/CompInfoGeneral.cc @@ -39,7 +39,7 @@ void CompInfoGeneral::setUris(CompInfo &compInfo) const } } -void CompInfoGeneral::setJson(const QString& metadataJsonFileName) +void CompInfoGeneral::setJson(const QString& metadataJsonFileName, const QString& /*translationJsonFileName*/) { if (metadataJsonFileName.isEmpty()) { return; @@ -82,12 +82,14 @@ void CompInfoGeneral::setJson(const QString& metadataJsonFileName) uris.crcMetaDataFallback = typeValue["fileCrcFallback"].toVariant().toLongLong(); uris.crcMetaDataFallbackValid = typeValue.toObject().contains("fileCrcFallback"); uris.uriTranslation = typeValue["translationUri"].toString(); + uris.crcTranslation = typeValue["translationFileCrc"].toVariant().toLongLong(); + uris.crcTranslationValid = typeValue.toObject().contains("translationFileCrc"); uris.uriTranslationFallback = typeValue["translationUriFallback"].toString(); + uris.crcTranslationFallback = typeValue["translationFileCrcFallback"].toVariant().toLongLong(); + uris.crcTranslationFallbackValid = typeValue.toObject().contains("translationFileCrcFallback"); if (uris.uriMetaData.isEmpty() || !uris.crcMetaDataValid) { - // The CRC is optional for dynamically updated metadata, and once we want to support that this logic needs - // to be updated. - qCDebug(CompInfoGeneralLog) << "Metadata missing fields: type:uri:crcValid" << type << + qCWarning(CompInfoGeneralLog) << "Metadata missing required fields: type:uri:crcValid" << type << uris.uriMetaData << uris.crcMetaDataValid; continue; } diff --git a/src/Vehicle/CompInfoGeneral.h b/src/Vehicle/CompInfoGeneral.h index 8969a83..fc7e820 100644 --- a/src/Vehicle/CompInfoGeneral.h +++ b/src/Vehicle/CompInfoGeneral.h @@ -35,7 +35,7 @@ public: void setUris(CompInfo& compInfo) const; // Overrides from CompInfo - void setJson(const QString& metadataJsonFileName) override; + void setJson(const QString& metadataJsonFileName, const QString& translationJsonFileName) override; private: QMap _supportedTypes; diff --git a/src/Vehicle/CompInfoParam.cc b/src/Vehicle/CompInfoParam.cc index 11339dd..84445de 100644 --- a/src/Vehicle/CompInfoParam.cc +++ b/src/Vehicle/CompInfoParam.cc @@ -30,9 +30,9 @@ CompInfoParam::CompInfoParam(uint8_t compId, Vehicle* vehicle, QObject* parent) } -void CompInfoParam::setJson(const QString& metadataJsonFileName) +void CompInfoParam::setJson(const QString& metadataJsonFileName, const QString& translationJsonFileName) { - qCDebug(CompInfoParamLog) << "setJson: metadataJsonFileName" << metadataJsonFileName; + qCDebug(CompInfoParamLog) << "setJson: metadataJsonFileName:translationJsonFileName" << metadataJsonFileName << translationJsonFileName; if (metadataJsonFileName.isEmpty()) { // This will fall back to using the old FirmwarePlugin mechanism for parameter meta data. diff --git a/src/Vehicle/CompInfoParam.h b/src/Vehicle/CompInfoParam.h index 37d1878..ad15c21 100644 --- a/src/Vehicle/CompInfoParam.h +++ b/src/Vehicle/CompInfoParam.h @@ -32,7 +32,7 @@ public: FactMetaData* factMetaDataForName(const QString& name, FactMetaData::ValueType_t type); // Overrides from CompInfo - void setJson(const QString& metadataJsonFileName) override; + void setJson(const QString& metadataJsonFileName, const QString& translationJsonFileName) override; static void _cachePX4MetaDataFile(const QString& metaDataFile); diff --git a/src/Vehicle/ComponentInformationManager.cc b/src/Vehicle/ComponentInformationManager.cc index 20bd1ca..08141f3 100644 --- a/src/Vehicle/ComponentInformationManager.cc +++ b/src/Vehicle/ComponentInformationManager.cc @@ -11,13 +11,17 @@ #include "Vehicle.h" #include "FTPManager.h" #include "QGCLZMA.h" +#include "JsonHelper.h" #include "CompInfoGeneral.h" #include "CompInfoParam.h" #include "CompInfoEvents.h" #include "CompInfoActuators.h" +#include "QGCFileDownload.h" #include "QGCApplication.h" #include +#include +#include QGC_LOGGING_CATEGORY(ComponentInformationManagerLog, "ComponentInformationManagerLog") @@ -34,11 +38,9 @@ const int ComponentInformationManager::_cStates = sizeof(ComponentInformationMan const RequestMetaDataTypeStateMachine::StateFn RequestMetaDataTypeStateMachine::_rgStates[]= { RequestMetaDataTypeStateMachine::_stateRequestCompInfo, - RequestMetaDataTypeStateMachine::_stateRequestCompInfoDeprecated, RequestMetaDataTypeStateMachine::_stateRequestMetaDataJson, RequestMetaDataTypeStateMachine::_stateRequestMetaDataJsonFallback, RequestMetaDataTypeStateMachine::_stateRequestTranslationJson, - RequestMetaDataTypeStateMachine::_stateRequestTranslate, RequestMetaDataTypeStateMachine::_stateRequestComplete, }; @@ -47,9 +49,7 @@ const int RequestMetaDataTypeStateMachine::_cStates = sizeof(RequestMetaDataType ComponentInformationManager::ComponentInformationManager(Vehicle* vehicle) : _vehicle (vehicle) , _requestTypeStateMachine (this) - , _cachedFileDownload(new QGCCachedFileDownload(this, QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + QLatin1String("/QGCCompInfoFileDownloadCache"))) , _fileCache(ComponentInformationCache::defaultInstance()) - , _translation(new ComponentInformationTranslation(this, _cachedFileDownload)) { _compInfoMap[MAV_COMP_ID_AUTOPILOT1][COMP_METADATA_TYPE_GENERAL] = new CompInfoGeneral (MAV_COMP_ID_AUTOPILOT1, vehicle, this); _compInfoMap[MAV_COMP_ID_AUTOPILOT1][COMP_METADATA_TYPE_PARAMETER] = new CompInfoParam (MAV_COMP_ID_AUTOPILOT1, vehicle, this); @@ -233,23 +233,11 @@ static void _requestMessageResultHandler(void* resultHandlerData, MAV_RESULT res { RequestMetaDataTypeStateMachine* requestMachine = static_cast(resultHandlerData); - if (result == MAV_RESULT_ACCEPTED) { - mavlink_component_metadata_t componentMetadata; - mavlink_msg_component_metadata_decode(&message, &componentMetadata); - requestMachine->compInfo()->setUriMetaData(componentMetadata.uri, componentMetadata.file_crc); - } // else: try deprecated COMPONENT_INFORMATION - - requestMachine->advance(); -} - -static void _requestMessageResultHandlerDeprecated(void* resultHandlerData, MAV_RESULT result, Vehicle::RequestMessageResultHandlerFailureCode_t failureCode, const mavlink_message_t &message) -{ - RequestMetaDataTypeStateMachine* requestMachine = static_cast(resultHandlerData); - if (result == MAV_RESULT_ACCEPTED) { mavlink_component_information_t componentInformation; mavlink_msg_component_information_decode(&message, &componentInformation); requestMachine->compInfo()->setUriMetaData(componentInformation.general_metadata_uri, componentInformation.general_metadata_file_crc); + // TODO: handle peripherals } else { switch (failureCode) { case Vehicle::RequestMessageFailureCommandError: @@ -279,41 +267,6 @@ void RequestMetaDataTypeStateMachine::_stateRequestCompInfo(StateMachine* stateM return; } - if (weakLink.expired()) { - qCDebug(ComponentInformationManagerLog) << QStringLiteral("_stateRequestCompInfo Skipping component information %1 request due to no primary link").arg(requestMachine->typeToString()); - stateMachine->advance(); - } else { - SharedLinkInterfacePtr sharedLink = weakLink.lock(); - if (sharedLink->linkConfiguration()->isHighLatency() || sharedLink->isPX4Flow() || sharedLink->isLogReplay()) { - qCDebug(ComponentInformationManagerLog) << QStringLiteral("_stateRequestCompInfo Skipping component information %1 request due to link type").arg(requestMachine->typeToString()); - stateMachine->advance(); - } else { - qCDebug(ComponentInformationManagerLog) << "Requesting component metadata" << requestMachine->typeToString(); - vehicle->requestMessage( - _requestMessageResultHandler, - stateMachine, - MAV_COMP_ID_AUTOPILOT1, - MAVLINK_MSG_ID_COMPONENT_METADATA); - } - } -} - -void RequestMetaDataTypeStateMachine::_stateRequestCompInfoDeprecated(StateMachine* stateMachine) -{ - RequestMetaDataTypeStateMachine* requestMachine = static_cast(stateMachine); - Vehicle* vehicle = requestMachine->_compMgr->vehicle(); - WeakLinkInterfacePtr weakLink = vehicle->vehicleLinkManager()->primaryLink(); - - if (requestMachine->_compInfo->type != COMP_METADATA_TYPE_GENERAL) { - requestMachine->advance(); - return; - } - if (requestMachine->_compInfo->crcMetaDataValid()) { - qCDebug(ComponentInformationManagerLog) << "COMPONENT_METADATA available, skipping COMPONENT_INFORMATION"; - requestMachine->advance(); - return; - } - if (weakLink.expired()) { qCDebug(ComponentInformationManagerLog) << QStringLiteral("_stateRequestCompInfo Skipping component information %1 request due to no primary link").arg(requestMachine->typeToString()); stateMachine->advance(); @@ -325,7 +278,7 @@ void RequestMetaDataTypeStateMachine::_stateRequestCompInfoDeprecated(StateMachi } else { qCDebug(ComponentInformationManagerLog) << "Requesting component information" << requestMachine->typeToString(); vehicle->requestMessage( - _requestMessageResultHandlerDeprecated, + _requestMessageResultHandler, stateMachine, MAV_COMP_ID_AUTOPILOT1, MAVLINK_MSG_ID_COMPONENT_INFORMATION); @@ -391,7 +344,7 @@ void RequestMetaDataTypeStateMachine::_httpDownloadComplete(QString remoteFile, { qCDebug(ComponentInformationManagerLog) << "RequestMetaDataTypeStateMachine::_httpDownloadComplete remoteFile:localFile:errorMsg" << remoteFile << localFile << errorMsg; - disconnect(qobject_cast(sender()), &QGCCachedFileDownload::downloadComplete, this, &RequestMetaDataTypeStateMachine::_httpDownloadComplete); + disconnect(qobject_cast(sender()), &QGCFileDownload::downloadComplete, this, &RequestMetaDataTypeStateMachine::_httpDownloadComplete); if (errorMsg.isEmpty()) { if (_currentFileName) { *_currentFileName = _downloadCompleteJsonWorker(localFile); @@ -419,7 +372,7 @@ void RequestMetaDataTypeStateMachine::_requestFile(const QString& cacheFileTag, qCDebug(ComponentInformationManagerLog) << "Downloading json" << uri; if (_uriIsMAVLinkFTP(uri)) { connect(ftpManager, &FTPManager::downloadComplete, this, &RequestMetaDataTypeStateMachine::_ftpDownloadComplete); - if (ftpManager->download(MAV_COMP_ID_AUTOPILOT1, uri, QStandardPaths::writableLocation(QStandardPaths::TempLocation))) { + if (ftpManager->download(uri, QStandardPaths::writableLocation(QStandardPaths::TempLocation))) { _downloadStartTime.start(); connect(ftpManager, &FTPManager::commandProgress, this, &RequestMetaDataTypeStateMachine::_ftpDownloadProgress); } else { @@ -428,14 +381,13 @@ void RequestMetaDataTypeStateMachine::_requestFile(const QString& cacheFileTag, advance(); } } else { - connect(_compMgr->_cachedFileDownload, &QGCCachedFileDownload::downloadComplete, this, - &RequestMetaDataTypeStateMachine::_httpDownloadComplete); - if (_compMgr->_cachedFileDownload->download(uri, crcValid ? 0 : ComponentInformationManager::cachedFileMaxAgeSec)) { + QGCFileDownload* download = new QGCFileDownload(this); + connect(download, &QGCFileDownload::downloadComplete, this, &RequestMetaDataTypeStateMachine::_httpDownloadComplete); + if (download->download(uri)) { _downloadStartTime.start(); } else { - qCWarning(ComponentInformationManagerLog) << "RequestMetaDataTypeStateMachine::_requestFile QGCCachedFileDownload::download returned failure"; - disconnect(_compMgr->_cachedFileDownload, &QGCCachedFileDownload::downloadComplete, this, - &RequestMetaDataTypeStateMachine::_httpDownloadComplete); + qCWarning(ComponentInformationManagerLog) << "RequestMetaDataTypeStateMachine::_requestFile QGCFileDownload::download returned failure"; + disconnect(download, &QGCFileDownload::downloadComplete, this, &RequestMetaDataTypeStateMachine::_httpDownloadComplete); advance(); } } @@ -483,39 +435,11 @@ void RequestMetaDataTypeStateMachine::_stateRequestTranslationJson(StateMachine* { RequestMetaDataTypeStateMachine* requestMachine = static_cast(stateMachine); CompInfo* compInfo = requestMachine->compInfo(); + const QString fileTag = ComponentInformationManager::_getFileCacheTag( + compInfo->type, compInfo->crcTranslation(), true); const QString uri = compInfo->uriTranslation(); - requestMachine->_requestFile("", false, uri, requestMachine->_jsonTranslationFileName); -} - -void RequestMetaDataTypeStateMachine::_stateRequestTranslate(StateMachine* stateMachine) -{ - RequestMetaDataTypeStateMachine* requestMachine = static_cast(stateMachine); - requestMachine->_jsonMetadataTranslatedFileName = ""; - if (requestMachine->_jsonTranslationFileName.isEmpty()) { - requestMachine->advance(); - } else { - connect(requestMachine->_compMgr->translation(), &ComponentInformationTranslation::downloadComplete, - requestMachine, &RequestMetaDataTypeStateMachine::_downloadAndTranslationComplete); - if (!requestMachine->_compMgr->translation()->downloadAndTranslate(requestMachine->_jsonTranslationFileName, - requestMachine->_jsonMetadataFileName, - ComponentInformationManager::cachedFileMaxAgeSec)) { - disconnect(requestMachine->_compMgr->translation(), &ComponentInformationTranslation::downloadComplete, - requestMachine, &RequestMetaDataTypeStateMachine::_downloadAndTranslationComplete); - qCDebug(ComponentInformationManagerLog) << "downloadAndTranslate() failed"; - requestMachine->advance(); - } - } -} - -void RequestMetaDataTypeStateMachine::_downloadAndTranslationComplete(QString translatedJsonTempFile, QString errorMsg) -{ - disconnect(_compMgr->translation(), &ComponentInformationTranslation::downloadComplete, - this, &RequestMetaDataTypeStateMachine::_downloadAndTranslationComplete); - _jsonMetadataTranslatedFileName = translatedJsonTempFile; - if (!errorMsg.isEmpty()) { - qCWarning(ComponentInformationManagerLog) << "Metadata translation failed:" << errorMsg; - } - advance(); + requestMachine->_jsonTranslationCrcValid = compInfo->crcTranslationValid(); + requestMachine->_requestFile(fileTag, compInfo->crcTranslationValid(), uri, requestMachine->_jsonTranslationFileName); } void RequestMetaDataTypeStateMachine::_stateRequestComplete(StateMachine* stateMachine) @@ -523,12 +447,7 @@ void RequestMetaDataTypeStateMachine::_stateRequestComplete(StateMachine* stateM RequestMetaDataTypeStateMachine* requestMachine = static_cast(stateMachine); CompInfo* compInfo = requestMachine->compInfo(); - if (requestMachine->_jsonMetadataTranslatedFileName.isEmpty()) { - compInfo->setJson(requestMachine->_jsonMetadataFileName); - } else { - compInfo->setJson(requestMachine->_jsonMetadataTranslatedFileName); - QFile(requestMachine->_jsonMetadataTranslatedFileName).remove(); - } + compInfo->setJson(requestMachine->_jsonMetadataFileName, requestMachine->_jsonTranslationFileName); // if we don't have a CRC we didn't cache the file and we need to delete it if (!requestMachine->_jsonMetadataCrcValid && !requestMachine->_jsonMetadataFileName.isEmpty()) { diff --git a/src/Vehicle/ComponentInformationManager.h b/src/Vehicle/ComponentInformationManager.h index 2ecfde6..30170ba 100644 --- a/src/Vehicle/ComponentInformationManager.h +++ b/src/Vehicle/ComponentInformationManager.h @@ -13,7 +13,6 @@ #include "QGCMAVLink.h" #include "StateMachine.h" #include "ComponentInformationCache.h" -#include "ComponentInformationTranslation.h" #include @@ -46,15 +45,12 @@ private slots: void _ftpDownloadProgress (float progress); void _httpDownloadComplete (QString remoteFile, QString localFile, QString errorMsg); QString _downloadCompleteJsonWorker (const QString& jsonFileName); - void _downloadAndTranslationComplete(QString translatedJsonTempFile, QString errorMsg); private: static void _stateRequestCompInfo (StateMachine* stateMachine); - static void _stateRequestCompInfoDeprecated (StateMachine* stateMachine); static void _stateRequestMetaDataJson (StateMachine* stateMachine); static void _stateRequestMetaDataJsonFallback(StateMachine* stateMachine); static void _stateRequestTranslationJson (StateMachine* stateMachine); - static void _stateRequestTranslate (StateMachine* stateMachine); static void _stateRequestComplete (StateMachine* stateMachine); static bool _uriIsMAVLinkFTP (const QString& uri); @@ -63,7 +59,6 @@ private: ComponentInformationManager* _compMgr = nullptr; CompInfo* _compInfo = nullptr; QString _jsonMetadataFileName; - QString _jsonMetadataTranslatedFileName; bool _jsonMetadataCrcValid = false; QString _jsonTranslationFileName; bool _jsonTranslationCrcValid = false; @@ -83,8 +78,6 @@ class ComponentInformationManager : public StateMachine Q_OBJECT public: - static constexpr int cachedFileMaxAgeSec = 3 * 24 * 3600; ///< 3 days - ComponentInformationManager(Vehicle* vehicle); typedef void (*RequestAllCompleteFn)(void* requestAllCompleteFnData); @@ -99,7 +92,6 @@ public: const StateFn* rgStates (void) const final; ComponentInformationCache& fileCache() { return _fileCache; } - ComponentInformationTranslation* translation() { return _translation; } float progress() const; @@ -126,9 +118,7 @@ private: RequestMetaDataTypeStateMachine _requestTypeStateMachine; RequestAllCompleteFn _requestAllCompleteFn = nullptr; void* _requestAllCompleteFnData = nullptr; - QGCCachedFileDownload* _cachedFileDownload = nullptr; ComponentInformationCache& _fileCache; - ComponentInformationTranslation* _translation = nullptr; QMap> _compInfoMap; diff --git a/src/Vehicle/ComponentInformationTranslation.cc b/src/Vehicle/ComponentInformationTranslation.cc deleted file mode 100644 index 382e2bd..0000000 --- a/src/Vehicle/ComponentInformationTranslation.cc +++ /dev/null @@ -1,341 +0,0 @@ -/**************************************************************************** - * - * (c) 2022 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - - -#include "ComponentInformationTranslation.h" -#include "JsonHelper.h" -#include "QGCLZMA.h" - -#include -#include -#include -#include - -QGC_LOGGING_CATEGORY(ComponentInformationTranslationLog, "ComponentInformationTranslationLog") - -ComponentInformationTranslation::ComponentInformationTranslation(QObject* parent, - QGCCachedFileDownload* cachedFileDownload) - : QObject(parent), _cachedFileDownload(cachedFileDownload) -{ -} - -bool ComponentInformationTranslation::downloadAndTranslate(const QString& summaryJsonFile, - const QString& toTranslateJsonFile, int maxCacheAgeSec) -{ - // Parse summary: find url for current locale - _toTranslateJsonFile = toTranslateJsonFile; - QString locale = QLocale::system().name(); - QString url = getUrlFromSummaryJson(summaryJsonFile, locale); - if (url.isEmpty()) { - return false; - } - - // Download file - connect(_cachedFileDownload, &QGCCachedFileDownload::downloadComplete, this, &ComponentInformationTranslation::onDownloadCompleted); - if (!_cachedFileDownload->download(url, maxCacheAgeSec)) { - qCWarning(ComponentInformationTranslationLog) << "Metadata translation download failed"; - disconnect(_cachedFileDownload, &QGCCachedFileDownload::downloadComplete, this, &ComponentInformationTranslation::onDownloadCompleted); - return false; - } - return true; -} - -QString ComponentInformationTranslation::getUrlFromSummaryJson(const QString &summaryJsonFile, const QString &locale) -{ - QString errorString; - QJsonDocument jsonDoc; - - if (!JsonHelper::isJsonFile(summaryJsonFile, jsonDoc, errorString)) { - qCWarning(ComponentInformationTranslationLog) << "Metadata translation summary json file open failed:" << errorString; - return ""; - } - QJsonObject jsonObj = jsonDoc.object(); - - QJsonObject localeObj = jsonObj[locale].toObject(); - if (localeObj.isEmpty()) { - qCWarning(ComponentInformationTranslationLog) << "Locale " << locale << " not found in json"; - return ""; - } - - QString url = localeObj["url"].toString(); - if (url.isEmpty()) { - qCWarning(ComponentInformationTranslationLog) << "Locale " << locale << ": no url set"; - } - return url; -} - -void ComponentInformationTranslation::onDownloadCompleted(QString remoteFile, QString localFile, QString errorMsg) -{ - disconnect(_cachedFileDownload, &QGCCachedFileDownload::downloadComplete, this, &ComponentInformationTranslation::onDownloadCompleted); - - QString tsFileName = localFile; - bool deleteFile = false; - if (errorMsg.isEmpty()) { - - // Decompress if needed - if (localFile.endsWith(".lzma", Qt::CaseInsensitive) || localFile.endsWith(".xz", Qt::CaseInsensitive)) { - tsFileName = QDir(QStandardPaths::writableLocation(QStandardPaths::TempLocation)).absoluteFilePath("qgc_translation_file_decompressed.ts"); - if (QGCLZMA::inflateLZMAFile(localFile, tsFileName)) { - deleteFile = true; - } else { - errorMsg = "Inflate of compressed json failed, " + remoteFile; - } - } - } - - // Translate json file to new temp file - QString translatedJsonFilename; - if (errorMsg.isEmpty()) { - translatedJsonFilename = translateJsonUsingTS(_toTranslateJsonFile, tsFileName); - if (translatedJsonFilename.isEmpty()) { - errorMsg = "Failed to translate json file"; - } - } - - if (deleteFile) { - QFile(localFile).remove(); - } - - emit downloadComplete(translatedJsonFilename, errorMsg); -} - -QString ComponentInformationTranslation::translateJsonUsingTS(const QString &toTranslateJsonFile, const QString &tsFile) -{ - qCInfo(ComponentInformationTranslationLog) << "Translating" << toTranslateJsonFile << "using" << tsFile; - - // Open JSON and get the 'translation' object - QString errorString; - QJsonDocument jsonDoc; - - if (!JsonHelper::isJsonFile(toTranslateJsonFile, jsonDoc, errorString)) { - qCWarning(ComponentInformationTranslationLog) << "Metadata json file to translate open failed:" << errorString; - return ""; - } - QJsonObject jsonObj = jsonDoc.object(); - - QJsonObject translationObj = jsonObj["translation"].toObject(); - if (translationObj.isEmpty()) { - qCWarning(ComponentInformationTranslationLog) << "json file does not contain 'translation' object"; - return ""; - } - - - // Open and parse TS file into a hash table - QHash translations; - QFile xmlFile(tsFile); - if (!xmlFile.open(QIODevice::ReadOnly)) { - qCWarning(ComponentInformationTranslationLog) << "Failed opening TS file"; - return ""; - } - - QXmlStreamReader xml(xmlFile.readAll()); - xmlFile.close(); - if (xml.hasError()) { - qCWarning(ComponentInformationTranslationLog) << "Badly formed TS (XML)" << xml.errorString(); - return ""; - } - - bool insideTS = false; - - while (!xml.atEnd()) { - if (xml.isStartElement()) { - QString elementName = xml.name().toString(); - - if (elementName == "TS") { - insideTS = true; - } else if (insideTS && elementName == "context") { - // Read whole - QString name; - QString translation; - bool insideMessage = false; - while (!xml.atEnd()) { - - if (xml.isStartElement()) { - if (xml.name().toString() == "message") { - insideMessage = true; - } else if (xml.name().toString() == "name" && !insideMessage) { - name = xml.readElementText(); - } else if (xml.name().toString() == "translation" && insideMessage) { - translation = xml.readElementText(); - } - } else if (xml.isEndElement()) { - if (xml.name().toString() == "context") { - break; - } else if (xml.name().toString() == "message") { - insideMessage = false; - } - } - - xml.readNext(); - } - - if (name != "" && translation != "") { - translations[name] = translation; - } - } - - } else if (xml.isEndElement()) { - QString elementName = xml.name().toString(); - - if (elementName == "TS") { - insideTS = false; - } - } - xml.readNext(); - } - - if (translations.isEmpty()) { - qCWarning(ComponentInformationTranslationLog) << "No translations found in TS file"; - return ""; - } - - // Translate the json document - jsonDoc.setObject(translate(translationObj, translations, jsonDoc.object())); - - // Write to file - QString translatedFileName = QDir(QStandardPaths::writableLocation(QStandardPaths::TempLocation)).absoluteFilePath("qgc_translated_metadata.json"); - - QFile translatedFile(translatedFileName); - if (!translatedFile.open(QFile::WriteOnly|QFile::Truncate)) { - errorString = tr("File open failed: file:error %1 %2").arg(translatedFile.fileName()).arg(translatedFile.errorString()); - return ""; - } - translatedFile.write(jsonDoc.toJson()); - translatedFile.close(); - - qCInfo(ComponentInformationTranslationLog) << "JSON file" << toTranslateJsonFile << "successfully translated to" << translatedFileName; - return translatedFileName; -} - -QJsonObject ComponentInformationTranslation::translate(const QJsonObject& translationObj, - const QHash& translations, QJsonObject doc) -{ - QJsonObject defs = translationObj["$defs"].toObject(); - if (translationObj.contains("items")) { - doc = translateItems("", defs, translationObj["items"].toObject(), translations, doc); - } - if (translationObj.contains("$ref")) { - doc = translateItems("", defs, defs[getRefName(translationObj["$ref"].toString())].toObject(), translations, doc); - } - return doc; -} - -QJsonObject ComponentInformationTranslation::translateItems(const QString& prefix, const QJsonObject& defs, - const QJsonObject& translationObj, - const QHash& translations, - QJsonObject jsonData) -{ - for (auto translationItemIter = translationObj.begin(); translationItemIter != translationObj.end(); ++translationItemIter) { - QStringList translationKeys; - if (translationItemIter.key() == "*") { - translationKeys = jsonData.keys(); - } else { - translationKeys.append(translationItemIter.key()); - } - for (const auto& jsonItem : translationKeys) { - QString nextPrefix = prefix + '/' + jsonItem; - QJsonObject nextTranslationObj = translationItemIter.value().toObject(); - if (jsonData.contains(jsonItem)) { - jsonData[jsonItem] = translateTranslationItems(nextPrefix, defs, nextTranslationObj, translations, jsonData[jsonItem]); - } - } - } - return jsonData; -} - -QString ComponentInformationTranslation::getRefName(const QString& ref) -{ - // expected format: '#/$defs/' - return ref.mid(8); -} - -QJsonValue ComponentInformationTranslation::translateTranslationItems(const QString& prefix, const QJsonObject& defs, - const QJsonObject& translationObj, - const QHash& translations, - QJsonValue jsonData) -{ - if (translationObj.contains("list")) { - QJsonObject translationList = translationObj["list"].toObject(); - QString key = translationList["key"].toString(); - int idx = 0; - QJsonArray array = jsonData.toArray(); - for (const auto& listEntry : array) { - QString value; - if (!key.isEmpty() && listEntry.toObject().contains(key)) { - value = listEntry.toObject()[key].toString(); - } else { - value = QString::number(idx); - } - array[idx] = translateTranslationItems(prefix + '/' + value, defs, translationList, translations, listEntry); - ++idx; - } - jsonData = array; - } - if (translationObj.contains("translate")) { - for (const auto& translateName : translationObj["translate"].toArray()) { - QString translateNameStr = translateName.toString(); - if (jsonData.toObject().contains(translateNameStr)) { - if (jsonData[translateNameStr].isString()) { - auto lookupIter = translations.find(prefix + '/' + translateNameStr); - if (lookupIter != translations.end()) { - // We need to copy as there's no way to modify nested elements! See https://bugreports.qt.io/browse/QTBUG-25723 - QJsonObject obj = jsonData.toObject(); - obj.insert(translateNameStr, lookupIter.value()); - jsonData = obj; - } - } else if (jsonData[translateNameStr].isArray()) { // List of strings - QJsonArray jsonArray = jsonData[translateNameStr].toArray(); - for (int i=0; i < jsonArray.count(); ++i) { - auto lookupIter = translations.find(prefix + '/' + translateNameStr + '/' + QString::number(i)); - if (lookupIter != translations.end()) { - jsonArray.replace(i, lookupIter.value()); - } - } - QJsonObject obj = jsonData.toObject(); - obj[translateNameStr] = jsonArray; - jsonData = obj; - } - } - } - } - - if (translationObj.contains("translate-global")) { - for (const auto& translateName : translationObj["translate-global"].toArray()) { - QString translateNameStr = translateName.toString(); - if (jsonData.toObject().contains(translateNameStr)) { - if (jsonData[translateNameStr].isString()) { - auto lookupIter = translations.find("$globals/" + translateNameStr + "/" + jsonData[translateNameStr].toString()); - if (lookupIter != translations.end()) { - QJsonObject obj = jsonData.toObject(); - obj.insert(translateNameStr, lookupIter.value()); - jsonData = obj; - } - } else if (jsonData[translateNameStr].isArray()) { // List of strings - QJsonArray jsonArray = jsonData[translateNameStr].toArray(); - for (int i=0; i < jsonArray.count(); ++i) { - auto lookupIter = translations.find("$globals/" + translateNameStr + '/' + jsonArray[i].toString()); - if (lookupIter != translations.end()) { - jsonArray.replace(i, lookupIter.value()); - } - } - QJsonObject obj = jsonData.toObject(); - obj[translateNameStr] = jsonArray; - jsonData = obj; - } - } - } - } - if (translationObj.contains("items")) { - jsonData = translateItems(prefix, defs, translationObj["items"].toObject(), translations, jsonData.toObject()); - } - if (translationObj.contains("$ref")) { - jsonData = translateTranslationItems(prefix, defs, defs[getRefName(translationObj["$ref"].toString())].toObject(), translations, jsonData); - } - return jsonData; -} diff --git a/src/Vehicle/ComponentInformationTranslation.h b/src/Vehicle/ComponentInformationTranslation.h deleted file mode 100644 index f31ac5a..0000000 --- a/src/Vehicle/ComponentInformationTranslation.h +++ /dev/null @@ -1,55 +0,0 @@ -/**************************************************************************** - * - * (c) 2022 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -#pragma once - -#include -#include - -#include "QGCLoggingCategory.h" -#include "QGCCachedFileDownload.h" - -Q_DECLARE_LOGGING_CATEGORY(ComponentInformationTranslationLog) - -class ComponentInformationTranslation : public QObject -{ - Q_OBJECT - -public: - ComponentInformationTranslation(QObject* parent, QGCCachedFileDownload* cachedFileDownload); - - /// Download translation file according to the currently set locale and translate the json file. - /// emits downloadComplete() when done (with a temporary file that should be deleted) - /// @param summaryJsonFile json file with url's to translation files (.ts) - /// @param toTranslateJsonFile json file to be translated - /// @param maxCacheAgeSec Maximum age of cached item in seconds - /// @return true: Asynchronous download has started, false: Download initialization failed - bool downloadAndTranslate(const QString& summaryJsonFile, const QString& toTranslateJsonFile, int maxCacheAgeSec); - - QString translateJsonUsingTS(const QString& toTranslateJsonFile, const QString& tsFile); - -signals: - void downloadComplete(QString translatedJsonTempFile, QString errorMsg); - -private slots: - void onDownloadCompleted(QString remoteFile, QString localFile, QString errorMsg); -private: - QString getUrlFromSummaryJson(const QString& summaryJsonFile, const QString& locale); - - static QJsonObject translate(const QJsonObject& translationObj, const QHash& translations, QJsonObject doc); - - static QJsonObject translateItems(const QString& prefix, const QJsonObject& defs, const QJsonObject& translationObj, - const QHash& translations, QJsonObject jsonData); - static QJsonValue translateTranslationItems(const QString& prefix, const QJsonObject& defs, const QJsonObject& translationObj, - const QHash& translations, QJsonValue jsonData); - static QString getRefName(const QString& ref); - - QGCCachedFileDownload* _cachedFileDownload = nullptr; - QString _toTranslateJsonFile; -}; diff --git a/src/Vehicle/EFIFact.json b/src/Vehicle/EFIFact.json deleted file mode 100644 index e7c7f3d..0000000 --- a/src/Vehicle/EFIFact.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "version": 1, - "fileType": "FactMetaData", - "QGC.MetaData.Facts": -[ -{ - "name": "health", - "shortDesc": "Health", - "type": "int8" -}, -{ - "name": "ecuIndex", - "shortDesc": "Ecu Index", - "type": "float", - "decimalPlaces": 1, - "units": "A" -}, -{ - "name": "rpm", - "shortDesc": "Rpm", - "type": "float", - "decimalPlaces": 1 -}, -{ - "name": "fuelConsumed", - "shortDesc": "Fuel Consumed", - "type": "float", - "decimalPlaces": 1, - "units": "cm^3" -}, -{ - "name": "fuelFlow", - "shortDesc": "Fuel Flow", - "type": "float", - "decimalPlaces": 1, - "units": "cm^3/min" -}, -{ - "name": "engineLoad", - "shortDesc": "Engine Load", - "type": "float", - "decimalPlaces": 1, - "units": "%" -}, -{ - "name": "throttlePos", - "shortDesc": "Throttle Position", - "type": "float", - "decimalPlaces": 1, - "units": "%" -}, -{ - "name": "sparkTime", - "shortDesc": "Spark dwell time", - "type": "float", - "decimalPlaces": 1, - "units": "ms" -}, -{ - "name": "baroPress", - "shortDesc": "BarometricPressure", - "type": "float", - "decimalPlaces": 1, - "units": "kPa" -}, -{ - "name": "intakePress", - "shortDesc": "Intake mainfold pressure", - "type": "float", - "decimalPlaces": 1, - "units": "kPa" -}, -{ - "name": "intakeTemp", - "shortDesc": "Intake mainfold temperature", - "type": "float", - "decimalPlaces": 1, - "units": "°C" -}, -{ - "name": "cylinderTemp", - "shortDesc": "Cylinder head temperature", - "type": "float", - "decimalPlaces": 1, - "units": "°C" -}, -{ - "name": "ignTime", - "shortDesc": "Ignition Timing", - "type": "float", - "decimalPlaces": 1, - "units": "deg" -}, -{ - "name": "injTime", - "shortDesc": "Injection Time", - "type": "float", - "decimalPlaces": 1, - "units": "ms" -}, -{ - "name": "exGasTemp", - "shortDesc": "Exhaust gas Temperature", - "type": "float", - "decimalPlaces": 1, - "units": "°C" -}, -{ - "name": "throttleOut", - "shortDesc": "Throttle Out", - "type": "float", - "decimalPlaces": 1, - "units": "%" -}, -{ - "name": "ptComp", - "shortDesc": "Pt Compensation", - "type": "float", - "decimalPlaces": 1 -} -] -} \ No newline at end of file diff --git a/src/Vehicle/EventHandler.cc b/src/Vehicle/EventHandler.cc index 0c8f578..7a84141 100644 --- a/src/Vehicle/EventHandler.cc +++ b/src/Vehicle/EventHandler.cc @@ -23,8 +23,7 @@ EventHandler::EventHandler(QObject* parent, const QString& profile, handle_event _sendRequestCB(sendRequestCB), _compid(componentId) { - auto error_cb = [componentId, this](int num_events_lost) { - _healthAndArmingChecks.reset(); + auto error_cb = [componentId](int num_events_lost) { qCWarning(EventsLog) << "Events got lost:" << num_events_lost << "comp_id:" << componentId; }; @@ -42,12 +41,6 @@ EventHandler::EventHandler(QObject* parent, const QString& profile, handle_event _parser.formatters().url = [](const std::string& content, const std::string& link) { return ""+content+""; }; - _parser.formatters().param = [](const std::string& content) { - return ""+content+""; }; - - _parser.formatters().escape = [](const std::string& str) { - return QString::fromStdString(str).toHtmlEscaped().toStdString(); }; - events::ReceiveProtocol::Callbacks callbacks{error_cb, _sendRequestCB, std::bind(&EventHandler::gotEvent, this, std::placeholders::_1), timeout_cb}; _protocol = new events::ReceiveProtocol(callbacks, ourSystemId, ourComponentId, systemId, componentId); @@ -82,10 +75,6 @@ void EventHandler::gotEvent(const mavlink_event_t& event) qCDebug(EventsLog) << "Got Event: ID:" << parsed_event->id() << "namespace:" << parsed_event->eventNamespace().c_str() << "name:" << parsed_event->name().c_str() << "msg:" << parsed_event->message().c_str(); - if (_healthAndArmingChecks.handleEvent(*parsed_event)) { - _healthAndArmingChecksValid = true; - emit healthAndArmingChecksUpdated(); - } _handleEventCB(std::move(parsed_event)); } @@ -94,9 +83,13 @@ void EventHandler::handleEvents(const mavlink_message_t& message) _protocol->processMessage(message); } -void EventHandler::setMetadata(const QString &metadataJsonFileName) +void EventHandler::setMetadata(const QString &metadataJsonFileName, const QString &translationJsonFileName) { - if (_parser.loadDefinitionsFile(metadataJsonFileName.toStdString())) { + auto translate = [](const std::string& s) { + // TODO: use translation file + return s; + }; + if (_parser.loadDefinitionsFile(metadataJsonFileName.toStdString(), translate)) { if (_parser.hasDefinitions()) { // do we have queued events? for (const auto& event : _pendingEvents) { @@ -109,13 +102,3 @@ void EventHandler::setMetadata(const QString &metadataJsonFileName) } } -int EventHandler::getModeGroup(int32_t customMode) -{ - events::parser::Parser::NavigationModeGroups groups = _parser.navigationModeGroups(_compid); - for (auto groupIter : groups.groups) { - if (groupIter.second.find(customMode) != groupIter.second.end()) { - return groupIter.first; - } - } - return -1; -} diff --git a/src/Vehicle/EventHandler.h b/src/Vehicle/EventHandler.h index 0b69f52..ae794f6 100644 --- a/src/Vehicle/EventHandler.h +++ b/src/Vehicle/EventHandler.h @@ -15,8 +15,9 @@ #include +#include "HealthAndArmingChecks.h" + #include -#include #include #include @@ -35,29 +36,16 @@ public: void handleEvents(const mavlink_message_t& message); - void setMetadata(const QString& metadataJsonFileName); - - const events::HealthAndArmingChecks::Results& healthAndArmingCheckResults() const { return _healthAndArmingChecks.results(); } - bool healthAndArmingCheckResultsValid() const { return _healthAndArmingChecksValid; } - - int getModeGroup(int32_t customMode); - - bool healthAndArmingChecksSupported() const { - const auto& protocols = _parser.supportedProtocols(_compid); - return protocols.find("health_and_arming_check") != protocols.end(); - } - -signals: - void healthAndArmingChecksUpdated(); + void setMetadata(const QString& metadataJsonFileName, const QString& translationJsonFileName); + HealthAndArmingCheckHandler& healthAndArmingChecks() { return _healthAndArmingChecks; } private: void gotEvent(const mavlink_event_t& event); events::ReceiveProtocol* _protocol{nullptr}; QTimer _timer; events::parser::Parser _parser; - events::HealthAndArmingChecks _healthAndArmingChecks; - bool _healthAndArmingChecksValid{false}; + HealthAndArmingCheckHandler _healthAndArmingChecks; QVector _pendingEvents; ///< stores incoming events until we have the metadata loaded handle_event_f _handleEventCB; send_request_event_message_f _sendRequestCB; diff --git a/src/Vehicle/FTPManager.cc b/src/Vehicle/FTPManager.cc index 4b3d3c2..4de6048 100644 --- a/src/Vehicle/FTPManager.cc +++ b/src/Vehicle/FTPManager.cc @@ -34,9 +34,9 @@ FTPManager::FTPManager(Vehicle* vehicle) Q_ASSERT(sizeof(MavlinkFTP::RequestHeader) == 12); } -bool FTPManager::download(uint8_t fromCompId, const QString& fromURI, const QString& toDir, const QString& fileName, bool checksize) +bool FTPManager::download(const QString& fromURI, const QString& toDir) { - qCDebug(FTPManagerLog) << "download fromURI:" << fromURI << "to:" << toDir << "fromCompId:" << fromCompId; + qCDebug(FTPManagerLog) << "download fromURI:" << fromURI << "to:" << toDir; if (!_rgStateMachine.isEmpty()) { qCDebug(FTPManagerLog) << "Cannot download. Already in another operation"; @@ -56,9 +56,8 @@ bool FTPManager::download(uint8_t fromCompId, const QString& fromURI, const QStr _downloadState.reset(); _downloadState.toDir.setPath(toDir); - _downloadState.checksize = checksize; - if (!_parseURI(fromCompId, fromURI, _downloadState.fullPathOnVehicle, _ftpCompId)) { + if (!_parseURI(fromURI, _downloadState.fullPathOnVehicle, _ftpCompId)) { qCWarning(FTPManagerLog) << "_parseURI failed"; return false; } @@ -73,11 +72,7 @@ bool FTPManager::download(uint8_t fromCompId, const QString& fromURI, const QStr } lastDirSlashIndex++; // move past slash - if (fileName.isEmpty()) { - _downloadState.fileName = _downloadState.fullPathOnVehicle.right(_downloadState.fullPathOnVehicle.size() - lastDirSlashIndex); - } else { - _downloadState.fileName = fileName; - } + _downloadState.fileName = _downloadState.fullPathOnVehicle.right(_downloadState.fullPathOnVehicle.size() - lastDirSlashIndex); qCDebug(FTPManagerLog) << "_downloadState.fullPathOnVehicle:_downloadState.fileName" << _downloadState.fullPathOnVehicle << _downloadState.fileName; @@ -171,8 +166,7 @@ void FTPManager::_downloadComplete(const QString& errorMsg) void FTPManager::_mavlinkMessageReceived(const mavlink_message_t& message) { - if (message.msgid != MAVLINK_MSG_ID_FILE_TRANSFER_PROTOCOL || - message.sysid != _vehicle->id() || message.compid != _ftpCompId) { + if (message.msgid != MAVLINK_MSG_ID_FILE_TRANSFER_PROTOCOL || message.compid != _ftpCompId) { return; } @@ -300,7 +294,7 @@ void FTPManager::_openFileROAckOrNak(const MavlinkFTP::Request* ackOrNak) } } else if (ackOrNak->hdr.opcode == MavlinkFTP::kRspNak) { qCDebug(FTPManagerLog) << "_handlOpenFileROAck: Nak -" << _errorMsgFromNak(ackOrNak); - _downloadComplete(tr("Download failed") + ": " + _errorMsgFromNak(ackOrNak)); + _downloadComplete(tr("Download failed")); } } @@ -392,22 +386,18 @@ void FTPManager::_burstReadFileAckOrNak(const MavlinkFTP::Request* ackOrNak) emit commandProgress((float)(_downloadState.bytesWritten) / (float)_downloadState.fileSize); } } else if (ackOrNak->hdr.opcode == MavlinkFTP::kRspNak) { + if (ackOrNak->hdr.seqNumber != _expectedIncomingSeqNumber) { + qCDebug(FTPManagerLog) << "_burstReadFileAckOrNak: Disregarding Nak due to incorrect sequence actual:expected" << ackOrNak->hdr.seqNumber << _expectedIncomingSeqNumber; + return; + } + MavlinkFTP::ErrorCode_t errorCode = static_cast(ackOrNak->data[0]); if (errorCode == MavlinkFTP::kErrEOF) { // Burst sequence has gone through the whole file - if (ackOrNak->hdr.seqNumber != _expectedIncomingSeqNumber) { - qCDebug(FTPManagerLog) << "_burstReadFileAckOrNak: EOF Nak" - "with incorrect sequence nr actual:expected" - << ackOrNak->hdr.seqNumber << _expectedIncomingSeqNumber; - /* We have received the EOF Nak but out of sequence, i.e. data is missing */ - _expectedIncomingSeqNumber = ackOrNak->hdr.seqNumber; - _burstReadFileWorker(true); /* Retry from last expected offset */ - } else { - qCDebug(FTPManagerLog) << "_burstReadFileAckOrNak EOF"; - _advanceStateMachine(); - } - } else { /* Don't care is this is out of sequence */ + qCDebug(FTPManagerLog) << "_burstReadFileAckOrNak EOF"; + _advanceStateMachine(); + } else { qCDebug(FTPManagerLog) << "_burstReadFileAckOrNak: Nak -" << _errorMsgFromNak(ackOrNak); _downloadComplete(tr("Download failed")); } @@ -452,7 +442,7 @@ void FTPManager::_fillMissingBlocksWorker(bool firstRequest) _sendRequestExpectAck(&request); } else { // We should have the full file now - if (_downloadState.checksize == false || _downloadState.bytesWritten == _downloadState.fileSize) { + if (_downloadState.bytesWritten == _downloadState.fileSize) { _advanceStateMachine(); } else { qCDebug(FTPManagerLog) << "_fillMissingBlocksWorker: no missing blocks but file still incomplete - bytesWritten:fileSize" << _downloadState.bytesWritten << _downloadState.fileSize; @@ -529,7 +519,7 @@ void FTPManager::_fillMissingBlocksAckOrNak(const MavlinkFTP::Request* ackOrNak) if (errorCode == MavlinkFTP::kErrEOF) { qCDebug(FTPManagerLog) << "_fillMissingBlocksAckOrNak EOF"; - if (_downloadState.checksize == false || _downloadState.bytesWritten == _downloadState.fileSize) { + if (_downloadState.bytesWritten == _downloadState.fileSize) { // We've successfully complete filling in all missing blocks _advanceStateMachine(); return; @@ -627,10 +617,10 @@ void FTPManager::_sendRequestExpectAck(MavlinkFTP::Request* request) } } -bool FTPManager::_parseURI(uint8_t fromCompId, const QString& uri, QString& parsedURI, uint8_t& compId) +bool FTPManager::_parseURI(const QString& uri, QString& parsedURI, uint8_t& compId) { parsedURI = uri; - compId = (fromCompId == MAV_COMP_ID_ALL) ? (uint8_t)MAV_COMP_ID_AUTOPILOT1 : fromCompId; + compId = MAV_COMP_ID_AUTOPILOT1; // Pull scheme off the front if there QString ftpPrefix(QStringLiteral("%1://").arg(mavlinkFTPScheme)); @@ -652,8 +642,6 @@ bool FTPManager::_parseURI(uint8_t fromCompId, const QString& uri, QString& pars qCWarning(FTPManagerLog) << "Incorrect format for component id" << uri; return false; } - - qCDebug(FTPManagerLog) << "Found compId in MAVLink FTP URI: " << compId; parsedURI.replace(QRegularExpression("\\[\\;comp\\=\\d+\\]"), ""); } diff --git a/src/Vehicle/FTPManager.h b/src/Vehicle/FTPManager.h index 10e9095..b932c5f 100644 --- a/src/Vehicle/FTPManager.h +++ b/src/Vehicle/FTPManager.h @@ -32,19 +32,12 @@ public: FTPManager(Vehicle* vehicle); /// Downloads the specified file. - /// @param fromCompId Component id of the component to download from. If fromCompId is MAV_COMP_ID_ALL, then MAV_COMP_ID_AUTOPILOT1 is used. - /// @param fromURI File to download from component, fully qualified path. May be in the format "mftp://[;comp=]..." where the component id - /// is specified. If component id is not specified, then the id set via fromCompId is used. - /// @param toDir Local directory to download file to - /// @param filename (optional) - /// @param checksize (optional, default true) If true compare the filesize indicated in the open - /// response with the transmitted filesize. If false the transmission is tftp style - /// and the indicated filesize from MAVFTP fileopen response is ignored. - /// This is used for the APM parameter download where the filesize is wrong due to - /// a dynamic file creation on the vehicle. + /// @param fromURI File to download from vehicle, fully qualified path. May be in the format "mftp://[;comp=]..." where the component id is specified. + /// If component id is not specified MAV_COMP_ID_AUTOPILOT1 is used. + /// @param toDir Local directory to download file to /// @return true: download has started, false: error, no download /// Signals downloadComplete, commandError, commandProgress - bool download(uint8_t fromCompId, const QString& fromURI, const QString& toDir, const QString& fileName="", bool checksize = true); + bool download(const QString& fromURI, const QString& toDir); /// Cancel the current operation /// This will emit downloadComplete() when done, and if there's currently a download in progress @@ -96,7 +89,6 @@ private: uint32_t fileSize; ///< Size of file being downloaded QFile file; int retryCount; - bool checksize; bool inProgress() const { return fileSize > 0; } @@ -137,7 +129,7 @@ private: void _fillRequestDataWithString(MavlinkFTP::Request* request, const QString& str); void _fillMissingBlocksWorker (bool firstRequest); void _burstReadFileWorker (bool firstRequest); - bool _parseURI (uint8_t fromCompId, const QString& uri, QString& parsedURI, uint8_t& compId); + bool _parseURI (const QString& uri, QString& parsedURI, uint8_t& compId); void _terminateSessionBegin (void); void _terminateSessionAckOrNak (const MavlinkFTP::Request* ackOrNak); diff --git a/src/Vehicle/FTPManagerTest.cc b/src/Vehicle/FTPManagerTest.cc index e1b4a0e..8233cd6 100644 --- a/src/Vehicle/FTPManagerTest.cc +++ b/src/Vehicle/FTPManagerTest.cc @@ -33,7 +33,7 @@ void FTPManagerTest::_testCaseWorker(const TestCase_t& testCase) QSignalSpy spyDownloadComplete(ftpManager, &FTPManager::downloadComplete); // void downloadComplete (const QString& file, const QString& errorMsg); - ftpManager->download(MAV_COMP_ID_AUTOPILOT1, testCase.file, QStandardPaths::writableLocation(QStandardPaths::TempLocation)); + ftpManager->download(testCase.file, QStandardPaths::writableLocation(QStandardPaths::TempLocation)); QCOMPARE(spyDownloadComplete.wait(10000), true); QCOMPARE(spyDownloadComplete.count(), 1); @@ -53,7 +53,7 @@ void FTPManagerTest::_sizeTestCaseWorker(int fileSize) QSignalSpy spyDownloadComplete(ftpManager, &FTPManager::downloadComplete); - ftpManager->download(MAV_COMP_ID_AUTOPILOT1, filename, QStandardPaths::writableLocation(QStandardPaths::TempLocation)); + ftpManager->download(filename, QStandardPaths::writableLocation(QStandardPaths::TempLocation)); QCOMPARE(spyDownloadComplete.wait(10000), true); QCOMPARE(spyDownloadComplete.count(), 1); @@ -106,7 +106,7 @@ void FTPManagerTest::_testLostPackets(void) QSignalSpy spyDownloadComplete(ftpManager, &FTPManager::downloadComplete); _mockLink->mockLinkFTP()->enableRandromDrops(true); - ftpManager->download(MAV_COMP_ID_AUTOPILOT1, filename, QStandardPaths::writableLocation(QStandardPaths::TempLocation)); + ftpManager->download(filename, QStandardPaths::writableLocation(QStandardPaths::TempLocation)); QCOMPARE(spyDownloadComplete.wait(10000), true); QCOMPARE(spyDownloadComplete.count(), 1); diff --git a/src/Vehicle/GeneratorFact.json b/src/Vehicle/GeneratorFact.json deleted file mode 100644 index d5f8e6f..0000000 --- a/src/Vehicle/GeneratorFact.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "version": 1, - "fileType": "FactMetaData", - "QGC.MetaData.Facts": -[ -{ - "name": "status", - "shortDesc": "Status", - "type": "uint64" -}, -{ - "name": "genSpeed", - "shortDesc": "Generator Speed", - "type": "uint16", - "units": "rpm" -}, -{ - "name": "batteryCurrent", - "shortDesc": "Battery Current", - "type": "float", - "decimalPlaces": 1, - "units": "A" -}, -{ - "name": "loadCurrent", - "shortDesc": "Load Current", - "type": "float", - "decimalPlaces": 1, - "units": "A" -}, -{ - "name": "powerGenerated", - "shortDesc": "Power Generated", - "type": "float", - "decimalPlaces": 1, - "units": "W" -}, -{ - "name": "busVoltage", - "shortDesc": "Bus Voltage", - "type": "float", - "decimalPlaces": 1, - "units": "V" -}, -{ - "name": "rectifierTemp", - "shortDesc": "Rectifier Temperature", - "type": "int16", - "units": "°C" -}, -{ - "name": "batCurrentSetpoint", - "shortDesc": "Battery Current Setpoint", - "type": "float", - "decimalPlaces": 1, - "units": "A" -}, -{ - "name": "genTemp", - "shortDesc": "Generator Temperature", - "type": "int16", - "units": "°C" -}, -{ - "name": "runtime", - "shortDesc": "runtime", - "type": "uint32", - "units": "sec" -}, -{ - "name": "timeMaintenance", - "shortDesc": "Time until Maintenance", - "type": "int32", - "units": "sec" -} -] -} \ No newline at end of file diff --git a/src/Vehicle/HealthAndArmingCheckReport.cc b/src/Vehicle/HealthAndArmingCheckReport.cc deleted file mode 100644 index 4232573..0000000 --- a/src/Vehicle/HealthAndArmingCheckReport.cc +++ /dev/null @@ -1,95 +0,0 @@ -/**************************************************************************** - * - * (c) 2022 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -#include "HealthAndArmingCheckReport.h" -#include "QGCMAVLink.h" - -#include - -HealthAndArmingCheckReport::HealthAndArmingCheckReport() -{ -#if 0 // to test the UI - _problemsForCurrentMode->append(new HealthAndArmingCheckProblem("No global position", "", "error")); - _problemsForCurrentMode->append(new HealthAndArmingCheckProblem("No RC", "Details", "warning")); - _problemsForCurrentMode->append(new HealthAndArmingCheckProblem("Accel uncalibrated", "Details test", "error")); - _problemsForCurrentMode->append(new HealthAndArmingCheckProblem("Gyro uncalibrated", "Details SDLOG_PROFILE", "error")); - _problemsForCurrentMode->append(new HealthAndArmingCheckProblem( - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.", - "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum", "")); - _supported = true; - emit updated(); -#endif -} - -HealthAndArmingCheckReport::~HealthAndArmingCheckReport() -{ - _problemsForCurrentMode->clearAndDeleteContents(); -} - -void HealthAndArmingCheckReport::update(uint8_t compid, const events::HealthAndArmingChecks::Results& results, - int flightModeGroup) -{ - if (compid != MAV_COMP_ID_AUTOPILOT1) { - // only autopilot supported atm - return; - } - if (flightModeGroup == -1) { - qWarning() << "Flight mode group not set"; - return; - } - _supported = true; - - _problemsForCurrentMode->clearAndDeleteContents(); - _hasWarningsOrErrors = false; - for (const auto& check : results.checks(flightModeGroup)) { - QString severity = ""; - if (events::externalLogLevel(check.log_levels) <= events::Log::Error) { - severity = "error"; - _hasWarningsOrErrors = true; - } else if (events::externalLogLevel(check.log_levels) <= events::Log::Warning) { - severity = "warning"; - _hasWarningsOrErrors = true; - } - QString description = QString::fromStdString(check.description); - _problemsForCurrentMode->append(new HealthAndArmingCheckProblem(QString::fromStdString(check.message), - description.replace("\n", "
"), severity)); - } - - _canArm = results.canArm(flightModeGroup); - if (_missionModeGroup != -1) { - // TODO: use results.canRun(_missionModeGroup) while armed - _canStartMission = results.canArm(_missionModeGroup); - } - if (_takeoffModeGroup != -1) { - _canTakeoff = results.canArm(_takeoffModeGroup); - } - - const auto& healthComponents = results.healthComponents().health_components; - - // GPS state - const auto gpsStateIter = healthComponents.find("gps"); - if (gpsStateIter != healthComponents.end()) { - const events::HealthAndArmingChecks::HealthComponent& gpsState = gpsStateIter->second; - if (gpsState.health.error || gpsState.arming_check.error) { - _gpsState = "red"; - } else if (gpsState.health.warning || gpsState.arming_check.warning) { - _gpsState = "yellow"; - } else { - _gpsState = "green"; - } - } - - emit updated(); -} - -void HealthAndArmingCheckReport::setModeGroups(int takeoffModeGroup, int missionModeGroup) -{ - _takeoffModeGroup = takeoffModeGroup; - _missionModeGroup = missionModeGroup; -} diff --git a/src/Vehicle/HealthAndArmingCheckReport.h b/src/Vehicle/HealthAndArmingCheckReport.h deleted file mode 100644 index 511ac21..0000000 --- a/src/Vehicle/HealthAndArmingCheckReport.h +++ /dev/null @@ -1,92 +0,0 @@ -/**************************************************************************** - * - * (c) 2022 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -#pragma once - -#include - -#include -#include - -class HealthAndArmingCheckProblem : public QObject -{ - Q_OBJECT -public: - HealthAndArmingCheckProblem(const QString& message, const QString& description, const QString& severity) - : _message(message), _description(description), _severity(severity) {} - - Q_PROPERTY(QString message READ message CONSTANT) - Q_PROPERTY(QString description READ description CONSTANT) - Q_PROPERTY(QString severity READ severity CONSTANT) - Q_PROPERTY(bool expanded READ expanded WRITE setExpanded NOTIFY expandedChanged) - - const QString& message() const { return _message; } - const QString& description() const { return _description; } - const QString& severity() const { return _severity; } - - bool expanded() const { return _expanded; } - void setExpanded(bool expanded) { _expanded = expanded; emit expandedChanged(); } - -signals: - void expandedChanged(); -private: - const QString _message; - const QString _description; - const QString _severity; - bool _expanded{false}; -}; - - -class HealthAndArmingCheckReport : public QObject -{ - Q_OBJECT -public: - - Q_PROPERTY(bool supported READ supported NOTIFY updated) - Q_PROPERTY(bool canArm READ canArm NOTIFY updated) - Q_PROPERTY(bool canTakeoff READ canTakeoff NOTIFY updated) - Q_PROPERTY(bool canStartMission READ canStartMission NOTIFY updated) - Q_PROPERTY(bool hasWarningsOrErrors READ hasWarningsOrErrors NOTIFY updated) - Q_PROPERTY(QString gpsState READ gpsState NOTIFY updated) - Q_PROPERTY(QmlObjectListModel* problemsForCurrentMode READ problemsForCurrentMode NOTIFY updated) - - HealthAndArmingCheckReport(); - virtual ~HealthAndArmingCheckReport(); - - bool supported() const { return _supported; } - bool canArm() const { return _canArm; } - bool canTakeoff() const { return _canTakeoff; } - bool canStartMission() const { return _canStartMission; } - bool hasWarningsOrErrors() const { return _hasWarningsOrErrors; } - - const QString& gpsState() const { return _gpsState; } - - QmlObjectListModel* problemsForCurrentMode() { return _problemsForCurrentMode; } - - void update(uint8_t compid, const events::HealthAndArmingChecks::Results& results, int flightModeGroup); - - void setModeGroups(int takeoffModeGroup, int missionModeGroup); - -signals: - void updated(); - -private: - bool _supported{false}; - bool _canArm{true}; ///< whether arming is possible for the current mode - bool _canTakeoff{true}; - bool _canStartMission{true}; - bool _hasWarningsOrErrors{false}; - QString _gpsState{}; - - int _takeoffModeGroup{-1}; - int _missionModeGroup{-1}; - - QmlObjectListModel* _problemsForCurrentMode = new QmlObjectListModel(this); ///< list of HealthAndArmingCheckProblem* -}; - diff --git a/src/Vehicle/HealthAndArmingChecks.cc b/src/Vehicle/HealthAndArmingChecks.cc new file mode 100644 index 0000000..ff8be64 --- /dev/null +++ b/src/Vehicle/HealthAndArmingChecks.cc @@ -0,0 +1,125 @@ +/**************************************************************************** + * + * (c) 2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#include "HealthAndArmingChecks.h" + +#include + +QGC_LOGGING_CATEGORY(HealthAndArmingChecks, "HealthAndArmingChecks"); + +using health_component_t = events::common::enums::health_component_t; +using navigation_mode_category_t = events::common::enums::navigation_mode_category_t; + +void HealthAndArmingCheckHandler::handleEvent(const events::parser::ParsedEvent& event) +{ + Type type; + if (event.eventNamespace() == "common" && event.name() == "arming_check_summary") { + type = Type::ArmingCheckSummary; + } else if (event.eventNamespace() == "common" && event.name() == "health_summary") { + type = Type::HealthSummary; + } else { + type = Type::Other; + } + + // the expected order of receiving is: + // - ArmingCheckSummary + // - N Other + // - HealthSummary + + if (type != _expectedEvent) { + if (_expectedEvent == Type::Other && type == Type::HealthSummary) { + // all good + } else if (type == Type::ArmingCheckSummary) { + qCDebug(HealthAndArmingChecks) << "Unexpected ArmingCheckSummary event, resetting. Expected:" << (int)_expectedEvent; + // accept & reset + } else { + qCDebug(HealthAndArmingChecks) << "Unexpected event, resetting. Expected:" << (int)_expectedEvent + << "Got:" << (int)type; + _expectedEvent = Type::ArmingCheckSummary; + return; + } + } + + switch (type) { + case Type::ArmingCheckSummary: + reset(); + if (event.id() == (uint32_t)events::common::event_id_t::arming_check_summary) { + ArmingCheckSummary &arming = _results[_currentResult].arming; + events::common::decode_arming_check_summary(event.eventData(), arming.error, arming.warning, arming.canArm); + _expectedEvent = Type::Other; + } + break; + case Type::Other: { + Check check; + check.type = event.group() == "health" ? CheckType::Health : CheckType::ArmingCheck; + check.message = QString::fromStdString(event.message()); + check.description = QString::fromStdString(event.description()); + check.affectedModes = (events::common::enums::navigation_mode_category_t)event.argumentValue(0).value.val_uint8_t; + check.affectedHealthComponentIndex = event.argumentValue(1).value.val_uint8_t; + check.logLevel = events::externalLogLevel(event.eventData().log_levels); + _results[_currentResult].checks.append(check); + } + break; + case Type::HealthSummary: + if (event.id() == (uint32_t)events::common::event_id_t::health_summary) { + HealthSummary &health = _results[_currentResult].health; + events::common::decode_health_summary(event.eventData(), health.isPresent, health.error, health.warning); + _currentResult = (_currentResult + 1) % 2; + emit update(); + testReport(); + } + reset(); + break; + } +} + +void HealthAndArmingCheckHandler::reset() +{ + _results[_currentResult].reset(); + _expectedEvent = Type::ArmingCheckSummary; +} + +void HealthAndArmingCheckHandler::testReport() +{ + // just for testing... +// qWarning() << "Got Health/Arming checks update"; +// qWarning() << "Arming possible in current mode: " << (results().arming.canArm & navigation_mode_category_t::current); +// qWarning() << "Can a mission be flown: " << (results().arming.canArm & navigation_mode_category_t::mission); +// qWarning() << "Autonomous (e.g. Takeoff) flight possible: " << (results().arming.canArm & navigation_mode_category_t::autonomous); +// +// QString gps_icon_color; +// if ((results().health.error & health_component_t::sensor_gps) || +// (results().health.error & health_component_t::global_position_estimate) || +// (results().arming.error & health_component_t::sensor_gps) || +// (results().arming.error & health_component_t::global_position_estimate)) { +// gps_icon_color = "red"; +// } else if((results().health.warning & health_component_t::sensor_gps) || +// (results().health.warning & health_component_t::global_position_estimate) || +// (results().arming.warning & health_component_t::sensor_gps) || +// (results().arming.warning & health_component_t::global_position_estimate)) { +// gps_icon_color = "yellow"; +// } else { +// gps_icon_color = "green"; +// } +// qWarning() << "GPS/Position icon color: " << gps_icon_color; +// +// // display events that are relevant for current mode: +// qWarning() << "Current flight mode:"; +// for (const auto& check : results().checks) { +// if (check.affectedModes & navigation_mode_category_t::current) { +// qWarning() << " " << (int)check.logLevel << check.message; +// } +// } +// qWarning() << "Other flight modes:"; +// for (const auto& check : results().checks) { +// if (!(check.affectedModes & navigation_mode_category_t::current)) { +// qWarning() << " " << (int)check.logLevel << check.message; +// } +// } +} diff --git a/src/Vehicle/HealthAndArmingChecks.h b/src/Vehicle/HealthAndArmingChecks.h new file mode 100644 index 0000000..1ea15d9 --- /dev/null +++ b/src/Vehicle/HealthAndArmingChecks.h @@ -0,0 +1,84 @@ +/**************************************************************************** + * + * (c) 2020 QGROUNDCONTROL PROJECT + * + * QGroundControl is licensed according to the terms in the file + * COPYING.md in the root of the source code directory. + * + ****************************************************************************/ + +#pragma once + +#include +#include +#include + +#include +#include + +Q_DECLARE_LOGGING_CATEGORY(HealthAndArmingChecks) + +class HealthAndArmingCheckHandler : public QObject +{ + Q_OBJECT +public: + + enum class CheckType { + ArmingCheck, + Health + }; + struct Check { + CheckType type; + QString message; + QString description; + events::common::enums::navigation_mode_category_t affectedModes; + uint8_t affectedHealthComponentIndex; ///< index for events::common::enums::health_component_t, can be 0xff + events::Log logLevel; + }; + + struct HealthSummary { + events::common::enums::health_component_t isPresent; + events::common::enums::health_component_t error; + events::common::enums::health_component_t warning; + }; + struct ArmingCheckSummary { + events::common::enums::health_component_t error; + events::common::enums::health_component_t warning; + events::common::enums::navigation_mode_category_t canArm; + }; + + struct Results { + HealthSummary health{}; + ArmingCheckSummary arming{}; + QVector checks{}; + + void reset() { + health = {}; + arming = {}; + checks.clear(); + } + }; + + void handleEvent(const events::parser::ParsedEvent& event); + + const Results& results() const { return _results[(_currentResult + 1) % 2]; } + +signals: + void update(); +private: + + enum class Type { + ArmingCheckSummary, + Other, + HealthSummary, + }; + + void reset(); + + void testReport(); + + Type _expectedEvent{Type::ArmingCheckSummary}; + Results _results[2]; ///< store the last full set and currently updating one + int _currentResult{0}; ///< index for the currently updating/adding results +}; + diff --git a/src/Vehicle/InitialConnectStateMachine.cc b/src/Vehicle/InitialConnectStateMachine.cc index 1d178c7..84d31f1 100644 --- a/src/Vehicle/InitialConnectStateMachine.cc +++ b/src/Vehicle/InitialConnectStateMachine.cc @@ -21,7 +21,6 @@ QGC_LOGGING_CATEGORY(InitialConnectStateMachineLog, "InitialConnectStateMachineL const StateMachine::StateFn InitialConnectStateMachine::_rgStates[] = { InitialConnectStateMachine::_stateRequestAutopilotVersion, InitialConnectStateMachine::_stateRequestProtocolVersion, - InitialConnectStateMachine::_stateRequestStandardModes, InitialConnectStateMachine::_stateRequestCompInfo, InitialConnectStateMachine::_stateRequestParameters, InitialConnectStateMachine::_stateRequestMission, @@ -33,7 +32,6 @@ const StateMachine::StateFn InitialConnectStateMachine::_rgStates[] = { const int InitialConnectStateMachine::_rgProgressWeights[] = { 1, //_stateRequestCapabilities 1, //_stateRequestProtocolVersion - 1, //_stateRequestStandardModes 5, //_stateRequestCompInfo 5, //_stateRequestParameters 2, //_stateRequestMission @@ -218,15 +216,12 @@ void InitialConnectStateMachine::_stateRequestProtocolVersion(StateMachine* stat if (sharedLink->linkConfiguration()->isHighLatency() || sharedLink->isPX4Flow() || sharedLink->isLogReplay()) { qCDebug(InitialConnectStateMachineLog) << "Skipping REQUEST_MESSAGE:PROTOCOL_VERSION request due to link type"; connectMachine->advance(); - } else if (vehicle->apmFirmware()) { - qCDebug(InitialConnectStateMachineLog) << "Skipping REQUEST_MESSAGE:PROTOCOL_VERSION request due to Ardupilot firmware"; - connectMachine->advance(); } else { qCDebug(InitialConnectStateMachineLog) << "Sending REQUEST_MESSAGE:PROTOCOL_VERSION"; vehicle->requestMessage(_protocolVersionRequestMessageHandler, connectMachine, MAV_COMP_ID_AUTOPILOT1, - MAVLINK_MSG_ID_PROTOCOL_VERSION); + MAVLINK_MSG_ID_AUTOPILOT_VERSION); } } } @@ -284,24 +279,6 @@ void InitialConnectStateMachine::_stateRequestCompInfo(StateMachine* stateMachin vehicle->_componentInformationManager->requestAllComponentInformation(_stateRequestCompInfoComplete, connectMachine); } -void InitialConnectStateMachine::_stateRequestStandardModes(StateMachine *stateMachine) -{ - InitialConnectStateMachine* connectMachine = static_cast(stateMachine); - Vehicle* vehicle = connectMachine->_vehicle; - - qCDebug(InitialConnectStateMachineLog) << "_stateRequestStandardModes"; - connect(vehicle->_standardModes, &StandardModes::requestCompleted, connectMachine, - &InitialConnectStateMachine::standardModesRequestCompleted); - vehicle->_standardModes->request(); -} - -void InitialConnectStateMachine::standardModesRequestCompleted() -{ - disconnect(_vehicle->_standardModes, &StandardModes::requestCompleted, this, - &InitialConnectStateMachine::standardModesRequestCompleted); - advance(); -} - void InitialConnectStateMachine::_stateRequestCompInfoComplete(void* requestAllCompleteFnData) { InitialConnectStateMachine* connectMachine = static_cast(requestAllCompleteFnData); @@ -341,8 +318,6 @@ void InitialConnectStateMachine::_stateRequestMission(StateMachine* stateMachine } else { qCDebug(InitialConnectStateMachineLog) << "_stateRequestMission"; vehicle->_missionManager->loadFromVehicle(); - connect(vehicle->_missionManager, &MissionManager::progressPct, connectMachine, - &InitialConnectStateMachine::gotProgressUpdate); } } } @@ -353,9 +328,6 @@ void InitialConnectStateMachine::_stateRequestGeoFence(StateMachine* stateMachin Vehicle* vehicle = connectMachine->_vehicle; SharedLinkInterfacePtr sharedLink = vehicle->vehicleLinkManager()->primaryLink().lock(); - disconnect(vehicle->_missionManager, &MissionManager::progressPct, connectMachine, - &InitialConnectStateMachine::gotProgressUpdate); - if (!sharedLink) { qCDebug(InitialConnectStateMachineLog) << "_stateRequestGeoFence: Skipping first geofence load request due to no primary link"; connectMachine->advance(); @@ -367,8 +339,6 @@ void InitialConnectStateMachine::_stateRequestGeoFence(StateMachine* stateMachin if (vehicle->_geoFenceManager->supported()) { qCDebug(InitialConnectStateMachineLog) << "_stateRequestGeoFence"; vehicle->_geoFenceManager->loadFromVehicle(); - connect(vehicle->_geoFenceManager, &GeoFenceManager::progressPct, connectMachine, - &InitialConnectStateMachine::gotProgressUpdate); } else { qCDebug(InitialConnectStateMachineLog) << "_stateRequestGeoFence: skipped due to no support"; vehicle->_firstGeoFenceLoadComplete(); @@ -383,9 +353,6 @@ void InitialConnectStateMachine::_stateRequestRallyPoints(StateMachine* stateMac Vehicle* vehicle = connectMachine->_vehicle; SharedLinkInterfacePtr sharedLink = vehicle->vehicleLinkManager()->primaryLink().lock(); - disconnect(vehicle->_geoFenceManager, &GeoFenceManager::progressPct, connectMachine, - &InitialConnectStateMachine::gotProgressUpdate); - if (!sharedLink) { qCDebug(InitialConnectStateMachineLog) << "_stateRequestRallyPoints: Skipping first rally point load request due to no primary link"; connectMachine->advance(); @@ -396,8 +363,6 @@ void InitialConnectStateMachine::_stateRequestRallyPoints(StateMachine* stateMac } else { if (vehicle->_rallyPointManager->supported()) { vehicle->_rallyPointManager->loadFromVehicle(); - connect(vehicle->_rallyPointManager, &RallyPointManager::progressPct, connectMachine, - &InitialConnectStateMachine::gotProgressUpdate); } else { qCDebug(InitialConnectStateMachineLog) << "_stateRequestRallyPoints: skipping due to no support"; vehicle->_firstRallyPointLoadComplete(); @@ -411,9 +376,6 @@ void InitialConnectStateMachine::_stateSignalInitialConnectComplete(StateMachine InitialConnectStateMachine* connectMachine = static_cast(stateMachine); Vehicle* vehicle = connectMachine->_vehicle; - disconnect(vehicle->_rallyPointManager, &RallyPointManager::progressPct, connectMachine, - &InitialConnectStateMachine::gotProgressUpdate); - connectMachine->advance(); qCDebug(InitialConnectStateMachineLog) << "Signalling initialConnectComplete"; emit vehicle->initialConnectComplete(); diff --git a/src/Vehicle/InitialConnectStateMachine.h b/src/Vehicle/InitialConnectStateMachine.h index 44ed2e8..7218e39 100644 --- a/src/Vehicle/InitialConnectStateMachine.h +++ b/src/Vehicle/InitialConnectStateMachine.h @@ -37,13 +37,11 @@ signals: private slots: void gotProgressUpdate(float progressValue); - void standardModesRequestCompleted(); private: static void _stateRequestAutopilotVersion (StateMachine* stateMachine); static void _stateRequestProtocolVersion (StateMachine* stateMachine); static void _stateRequestCompInfo (StateMachine* stateMachine); - static void _stateRequestStandardModes (StateMachine* stateMachine); static void _stateRequestCompInfoComplete (void* requestAllCompleteFnData); static void _stateRequestParameters (StateMachine* stateMachine); static void _stateRequestMission (StateMachine* stateMachine); diff --git a/src/Vehicle/MAVLinkLogManager.cc b/src/Vehicle/MAVLinkLogManager.cc index cee13aa..e43f6ab 100644 --- a/src/Vehicle/MAVLinkLogManager.cc +++ b/src/Vehicle/MAVLinkLogManager.cc @@ -150,7 +150,7 @@ MAVLinkLogProcessor::valid() bool MAVLinkLogProcessor::create(MAVLinkLogManager* manager, const QString path, uint8_t id) { - _fileName = _fileName.asprintf("%s/%03d-%s%s", + _fileName.asprintf("%s/%03d-%s%s", path.toLatin1().data(), id, QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss-zzz").toLocal8Bit().data(), diff --git a/src/Vehicle/RemoteIDManager.cc b/src/Vehicle/RemoteIDManager.cc deleted file mode 100644 index f88fc3a..0000000 --- a/src/Vehicle/RemoteIDManager.cc +++ /dev/null @@ -1,430 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2022 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -#include "RemoteIDManager.h" -#include "QGCApplication.h" -#include "SettingsManager.h" -#include "RemoteIDSettings.h" -#include "QGCQGeoCoordinate.h" -#include "PositionManager.h" - -#include - -QGC_LOGGING_CATEGORY(RemoteIDManagerLog, "RemoteIDManagerLog") - -#define AREA_COUNT 1 -#define AREA_RADIUS 0 -#define SENDING_RATE_MSEC 1000 -#define ALLOWED_GPS_DELAY 5000 -#define RID_TIMEOUT 2500 // Messages should be arriving at 1 Hz, so we set a 2 second timeout - -const uint8_t* RemoteIDManager::_id_or_mac_unknown = {NULL}; - -RemoteIDManager::RemoteIDManager(Vehicle* vehicle) - : QObject (vehicle) - , _mavlink (nullptr) - , _vehicle (vehicle) - , _settings (nullptr) - , _armStatusGood (false) - , _commsGood (false) - , _gcsGPSGood (false) - , _basicIDGood (true) - , _GCSBasicIDValid (false) - , _operatorIDGood (false) - , _emergencyDeclared (false) - , _targetSystem (0) // By default 0 means broadcast - , _targetComponent (0) // By default 0 means broadcast - , _enforceSendingSelfID (false) -{ - _mavlink = qgcApp()->toolbox()->mavlinkProtocol(); - _settings = qgcApp()->toolbox()->settingsManager()->remoteIDSettings(); - _positionManager = qgcApp()->toolbox()->qgcPositionManager(); - - // Timer to track a healthy RID device. When expired we let the operator know - _odidTimeoutTimer.setSingleShot(true); - _odidTimeoutTimer.setInterval(RID_TIMEOUT); - connect(&_odidTimeoutTimer, &QTimer::timeout, this, &RemoteIDManager::_odidTimeout); - - // Timer to send messages at a constant rate - _sendMessagesTimer.setInterval(SENDING_RATE_MSEC); - connect(&_sendMessagesTimer, &QTimer::timeout, this, &RemoteIDManager::_sendMessages); - - // GCS GPS position updates to track the health of the GPS data - connect(_positionManager, &QGCPositionManager::positionInfoUpdated, this, &RemoteIDManager::_updateLastGCSPositionInfo); - - // Check changes in basic id settings as long as they are modified - connect(_settings->basicID(), &Fact::rawValueChanged, this, &RemoteIDManager::_checkGCSBasicID); - connect(_settings->basicIDType(), &Fact::rawValueChanged, this, &RemoteIDManager::_checkGCSBasicID); - connect(_settings->basicIDUaType(), &Fact::rawValueChanged, this, &RemoteIDManager::_checkGCSBasicID); - - // Assign vehicle sysid and compid. GCS must target these messages to autopilot, and autopilot will redirect them to RID device - _targetSystem = _vehicle->id(); - _targetComponent = _vehicle->compId(); -} - -void RemoteIDManager::mavlinkMessageReceived(mavlink_message_t& message ) -{ - switch (message.msgid) { - // So far we are only listening to this one, as heartbeat won't be sent if connected by CAN - case MAVLINK_MSG_ID_OPEN_DRONE_ID_ARM_STATUS: - _handleArmStatus(message); - default: - break; - } -} - -// This slot will be called if we stop receiving heartbeats for more than RID_TIMEOUT seconds -void RemoteIDManager::_odidTimeout() -{ - _commsGood = false; - _sendMessagesTimer.stop(); // We stop sending messages if the communication with the RID device is down - emit commsGoodChanged(); - qCDebug(RemoteIDManagerLog) << "We stopped receiving heartbeat from RID device."; -} - -// Parsing of the ARM_STATUS message comming from the RID device -void RemoteIDManager::_handleArmStatus(mavlink_message_t& message) -{ - // Compid must be ODID_TXRX_X - if ( (message.compid < MAV_COMP_ID_ODID_TXRX_1) || (message.compid > MAV_COMP_ID_ODID_TXRX_3) ) { - // or same as autopilot, in the case of Ardupilot and CAN RID modules - if (message.compid != MAV_COMP_ID_AUTOPILOT1) { - return; - } - } - - // Sanity check, only get messages from same sysid - if (_vehicle->id() != message.sysid) { - return; - } - - // We set the targetsystem - if (_targetSystem != message.sysid) { - _targetSystem = message.sysid; - qCDebug(RemoteIDManagerLog) << "Subscribing to ODID messages coming from system " << _targetSystem; - } - - if (!_commsGood) { - _commsGood = true; - _sendMessagesTimer.start(); // Start sending our messages - _checkGCSBasicID(); // Check if basicID is good to send - checkOperatorID(); // Check if OperatorID is good in case we want to send it from start because of the settings - emit commsGoodChanged(); - qCDebug(RemoteIDManagerLog) << "Receiving ODID_ARM_STATUS from RID device"; - } - - // Restart the timeout - _odidTimeoutTimer.start(); - - // CompId and sysId are correct, we can proceed - mavlink_open_drone_id_arm_status_t armStatus; - mavlink_msg_open_drone_id_arm_status_decode(&message, &armStatus); - - if (armStatus.status == MAV_ODID_ARM_STATUS_GOOD_TO_ARM && !_armStatusGood) { - // If good to arm, even if basic ID is not set on GCS, it was set by remoteID parameters, so GCS one would be optional in this case - if (!_basicIDGood) { - _basicIDGood = true; - emit basicIDGoodChanged(); - } - _armStatusGood = true; - emit armStatusGoodChanged(); - qCDebug(RemoteIDManagerLog) << "Arm status GOOD TO ARM."; - } - - if (armStatus.status == MAV_ODID_ARM_STATUS_PRE_ARM_FAIL_GENERIC) { - _armStatusGood = false; - _armStatusError = QString::fromLocal8Bit(armStatus.error); - // Check if the error is because of missing basic id - if (armStatus.error == QString("missing basic_id message")) { - _basicIDGood = false; - qCDebug(RemoteIDManagerLog) << "Arm status error, basic_id is not set in RID device nor in GCS!"; - emit basicIDGoodChanged(); - } - emit armStatusGoodChanged(); - emit armStatusErrorChanged(); - qCDebug(RemoteIDManagerLog) << "Arm status error:" << _armStatusError; - } -} - -// Function that sends messages periodically -void RemoteIDManager::_sendMessages() -{ - // We only send RemoteID messages if we have it enabled in General settings - if (!_settings->enable()->rawValue().toBool()) { - return; - } - - // We always try to send System - _sendSystem(); - - // only send it if the information is correct and the tickbox in settings is set - if (_GCSBasicIDValid && _settings->sendBasicID()->rawValue().toBool()) { - _sendBasicID(); - } - - // We only send selfID if the pilot wants it or in case of a declared emergency. If an emergency is cleared - // we also keep sending the message, to be sure the non emergency state makes it up to the vehicle - if (_settings->sendSelfID()->rawValue().toBool() || _emergencyDeclared || _enforceSendingSelfID) { - _sendSelfIDMsg(); - } - - // We only send the OperatorID if the pilot wants it or if the region we have set is europe. - // To be able to send it, it needs to be filled correclty - if ((_settings->sendOperatorID()->rawValue().toBool() || (_settings->region()->rawValue().toInt() == Region::EU)) && _operatorIDGood) { - _sendOperatorID(); - } - -} - -void RemoteIDManager::_sendSelfIDMsg() -{ - WeakLinkInterfacePtr weakLink = _vehicle->vehicleLinkManager()->primaryLink(); - SharedLinkInterfacePtr sharedLink = weakLink.lock(); - - if (sharedLink) { - mavlink_message_t msg; - - mavlink_msg_open_drone_id_self_id_pack_chan(_mavlink->getSystemId(), - _mavlink->getComponentId(), - sharedLink->mavlinkChannel(), - &msg, - _targetSystem, - _targetComponent, - _id_or_mac_unknown, - _emergencyDeclared ? 1 : _settings->selfIDType()->rawValue().toInt(), // If emergency is delcared we send directly a 1 (1 = EMERGENCY) - _getSelfIDDescription()); // Depending on the type of SelfID we send a different description - _vehicle->sendMessageOnLinkThreadSafe(sharedLink.get(), msg); - } -} - -// We need to return the correct description for the self ID type we have selected -const char* RemoteIDManager::_getSelfIDDescription() -{ - QByteArray bytesFree = (_settings->selfIDFree()->rawValue().toString()).toLocal8Bit(); - QByteArray bytesEmergency = (_settings->selfIDEmergency()->rawValue().toString()).toLocal8Bit(); - QByteArray bytesExtended = (_settings->selfIDExtended()->rawValue().toString()).toLocal8Bit(); - - const char* descriptionToSend; - - if (_emergencyDeclared) { - // If emergency is declared we dont care about the settings and we send emergency directly - descriptionToSend = bytesEmergency.data(); - } else { - switch (_settings->selfIDType()->rawValue().toInt()) { - case 0: - descriptionToSend = bytesFree.data(); - break; - case 1: - descriptionToSend = bytesEmergency.data(); - break; - case 2: - descriptionToSend = bytesExtended.data(); - break; - default: - descriptionToSend = bytesEmergency.data(); - } - } - - return descriptionToSend; -} - -void RemoteIDManager::_sendOperatorID() -{ - WeakLinkInterfacePtr weakLink = _vehicle->vehicleLinkManager()->primaryLink(); - SharedLinkInterfacePtr sharedLink = weakLink.lock(); - - if (sharedLink) { - mavlink_message_t msg; - - QByteArray bytesOperatorID = (_settings->operatorID()->rawValue().toString()).toLocal8Bit(); - const char* descriptionToSend = bytesOperatorID.data(); - - mavlink_msg_open_drone_id_operator_id_pack_chan( - _mavlink->getSystemId(), - _mavlink->getComponentId(), - sharedLink->mavlinkChannel(), - &msg, - _targetSystem, - _targetComponent, - _id_or_mac_unknown, - _settings->operatorIDType()->rawValue().toInt(), - descriptionToSend); - - _vehicle->sendMessageOnLinkThreadSafe(sharedLink.get(), msg); - } -} - -void RemoteIDManager::_sendSystem() -{ - QGeoCoordinate gcsPosition; - QGeoPositionInfo geoPositionInfo; - // Location types: - // 0 -> TAKEOFF (not supported yet) - // 1 -> LIVE GNNS - // 2 -> FIXED - if (_settings->locationType()->rawValue().toUInt() == LocationTypes::FIXED) { - // For FIXED location, we first check that the values are valid. Then we populate our position - if (_settings->latitudeFixed()->rawValue().toFloat() >= -90 && _settings->latitudeFixed()->rawValue().toFloat() <= 90 && _settings->longitudeFixed()->rawValue().toFloat() >= -180 && _settings->longitudeFixed()->rawValue().toFloat() <= 180) { - gcsPosition = QGeoCoordinate(_settings->latitudeFixed()->rawValue().toFloat(), _settings->longitudeFixed()->rawValue().toFloat(), _settings->altitudeFixed()->rawValue().toFloat()); - geoPositionInfo = QGeoPositionInfo(gcsPosition, QDateTime::currentDateTime().currentDateTimeUtc()); - if (!_gcsGPSGood) { - _gcsGPSGood = true; - emit gcsGPSGoodChanged(); - } - } else { - gcsPosition = QGeoCoordinate(0,0,0); - geoPositionInfo = QGeoPositionInfo(gcsPosition, QDateTime::currentDateTime().currentDateTimeUtc()); - if (_gcsGPSGood) { - _gcsGPSGood = false; - emit gcsGPSGoodChanged(); - qCDebug(RemoteIDManagerLog) << "The provided coordinates for FIXED position are invalid."; - } - } - } else { - // For Live GNSS we take QGC GPS data - gcsPosition = _positionManager->gcsPosition(); - geoPositionInfo = _positionManager->geoPositionInfo(); - - // GPS position needs to be valid before checking other stuff - if (geoPositionInfo.isValid()) { - // If we dont have altitude for FAA then the GPS data is no good - if ((_settings->region()->rawValue().toInt() == Region::FAA) && !(gcsPosition.altitude() >= 0) && _gcsGPSGood) { - _gcsGPSGood = false; - emit gcsGPSGoodChanged(); - qCDebug(RemoteIDManagerLog) << "GCS GPS data error (no altitude): Altitude data is mandatory for GCS GPS data in FAA regions."; - return; - } - - // If the GPS data is older than ALLOWED_GPS_DELAY we cannot use this data - if (_lastGeoPositionTimeStamp.msecsTo(QDateTime::currentDateTime().currentDateTimeUtc()) > ALLOWED_GPS_DELAY) { - if (_gcsGPSGood) { - _gcsGPSGood = false; - emit gcsGPSGoodChanged(); - qCDebug(RemoteIDManagerLog) << "GCS GPS data is older than 5 seconds"; - } - } else { - if (!_gcsGPSGood) { - _gcsGPSGood = true; - emit gcsGPSGoodChanged(); - } - } - } else { - _gcsGPSGood = false; - emit gcsGPSGoodChanged(); - qCDebug(RemoteIDManagerLog) << "GCS GPS data is not valid."; - } - - } - - WeakLinkInterfacePtr weakLink = _vehicle->vehicleLinkManager()->primaryLink(); - SharedLinkInterfacePtr sharedLink = weakLink.lock(); - - if (sharedLink) { - mavlink_message_t msg; - - mavlink_msg_open_drone_id_system_pack_chan(_mavlink->getSystemId(), - _mavlink->getComponentId(), - sharedLink->mavlinkChannel(), - &msg, - _targetSystem, - _targetComponent, - _id_or_mac_unknown, - _settings->locationType()->rawValue().toUInt(), - _settings->classificationType()->rawValue().toUInt(), - _gcsGPSGood ? ( gcsPosition.latitude() * 1.0e7 ) : 0, // If position not valid, send a 0 - _gcsGPSGood ? ( gcsPosition.longitude() * 1.0e7 ) : 0, // If position not valid, send a 0 - AREA_COUNT, - AREA_RADIUS, - -1000.0f, - -1000.0f, - _settings->categoryEU()->rawValue().toUInt(), - _settings->classEU()->rawValue().toUInt(), - _gcsGPSGood ? gcsPosition.altitude() : 0, // If position not valid, send a 0 - _timestamp2019()), // Time stamp needs to be since 00:00:00 1/1/2019 - _vehicle->sendMessageOnLinkThreadSafe(sharedLink.get(), msg); - } -} - -// Returns seconds elapsed since 00:00:00 1/1/2019 -uint32_t RemoteIDManager::_timestamp2019() -{ - uint32_t secsSinceEpoch2019 = 1546300800; // Secs elapsed since epoch to 1-1-2019 - - return ((QDateTime::currentDateTime().currentSecsSinceEpoch()) - secsSinceEpoch2019); -} - -void RemoteIDManager::_sendBasicID() -{ - WeakLinkInterfacePtr weakLink = _vehicle->vehicleLinkManager()->primaryLink(); - SharedLinkInterfacePtr sharedLink = weakLink.lock(); - - if (sharedLink) { - mavlink_message_t msg; - - QString basicIDTemp = _settings->basicID()->rawValue().toString(); - QByteArray ba = basicIDTemp.toLocal8Bit(); - // To make sure the buffer is large enough to fit the message. It will add padding bytes if smaller, or exclude the extra ones if bigger - ba.resize(MAVLINK_MSG_OPEN_DRONE_ID_BASIC_ID_FIELD_UAS_ID_LEN); - - mavlink_msg_open_drone_id_basic_id_pack_chan(_mavlink->getSystemId(), - _mavlink->getComponentId(), - sharedLink->mavlinkChannel(), - &msg, - _targetSystem, - _targetComponent, - _id_or_mac_unknown, - _settings->basicIDType()->rawValue().toUInt(), - _settings->basicIDUaType()->rawValue().toUInt(), - reinterpret_cast(ba.constData())), - - _vehicle->sendMessageOnLinkThreadSafe(sharedLink.get(), msg); - } -} - -void RemoteIDManager::_checkGCSBasicID() -{ - QString basicID = _settings->basicID()->rawValue().toString(); - - if (!basicID.isEmpty() && (_settings->basicIDType()->rawValue().toInt() >= 0) && (_settings->basicIDUaType()->rawValue().toInt() >= 0)) { - _GCSBasicIDValid = true; - } else { - _GCSBasicIDValid = false; - } -} - -void RemoteIDManager::checkOperatorID() -{ - QString operatorID = _settings->operatorID()->rawValue().toString(); - - if (!operatorID.isEmpty() && (_settings->operatorIDType()->rawValue().toInt() >= 0)) { - _operatorIDGood = true; - } else { - _operatorIDGood = false; - } - emit operatorIDGoodChanged(); -} - -void RemoteIDManager::setEmergency(bool declare) -{ - _emergencyDeclared = declare; - emit emergencyDeclaredChanged(); - // Wether we are starting an emergency or cancelling it, we need to enforce sending - // this message. Otherwise, if non optimal connection quality, vehicle RID device - // could remain in the wrong state. It is clarified to the user in remoteidsettings.qml - _enforceSendingSelfID = true; - - qCDebug(RemoteIDManagerLog) << ( declare ? "Emergency declared." : "Emergency cleared."); -} - -void RemoteIDManager::_updateLastGCSPositionInfo(QGeoPositionInfo update) -{ - if (update.isValid()) { - _lastGeoPositionTimeStamp = update.timestamp().toUTC(); - } -} \ No newline at end of file diff --git a/src/Vehicle/RemoteIDManager.h b/src/Vehicle/RemoteIDManager.h deleted file mode 100644 index d256e92..0000000 --- a/src/Vehicle/RemoteIDManager.h +++ /dev/null @@ -1,128 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2022 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -#pragma once - -#include -#include -#include - -#include "QGCLoggingCategory.h" -#include "QGCMAVLink.h" -#include "Vehicle.h" - -Q_DECLARE_LOGGING_CATEGORY(RemoteIDManagerLog) - -class RemoteIDSettings; -class QGCPositionManager; - -// Supporting Opend Dron ID protocol -class RemoteIDManager : public QObject -{ - Q_OBJECT - -public: - RemoteIDManager(Vehicle* vehicle); - - Q_PROPERTY (bool armStatusGood READ armStatusGood NOTIFY armStatusGoodChanged) - Q_PROPERTY (QString armStatusError READ armStatusError NOTIFY armStatusErrorChanged) - Q_PROPERTY (bool commsGood READ commsGood NOTIFY commsGoodChanged) - Q_PROPERTY (bool gcsGPSGood READ gcsGPSGood NOTIFY gcsGPSGoodChanged) - Q_PROPERTY (bool basicIDGood READ basicIDGood NOTIFY basicIDGoodChanged) - Q_PROPERTY (bool emergencyDeclared READ emergencyDeclared NOTIFY emergencyDeclaredChanged) - Q_PROPERTY (bool operatorIDGood READ operatorIDGood NOTIFY operatorIDGoodChanged) - - - // Check that the information filled by the pilot operatorID is good - Q_INVOKABLE void checkOperatorID(); - - // Declare emergency - Q_INVOKABLE void setEmergency(bool declare); - - bool armStatusGood (void) const { return _armStatusGood; } - QString armStatusError (void) const { return _armStatusError; } - bool commsGood (void) const { return _commsGood; } - bool gcsGPSGood (void) const { return _gcsGPSGood; } - bool basicIDGood (void) const { return _basicIDGood; } - bool emergencyDeclared (void) const { return _emergencyDeclared;} - bool operatorIDGood (void) const { return _operatorIDGood; } - - void mavlinkMessageReceived (mavlink_message_t& message); - - enum LocationTypes { - TAKEOFF, - LiveGNSS, - FIXED - }; - - enum Region { - FAA, - EU - }; - -signals: - void armStatusGoodChanged(); - void armStatusErrorChanged(); - void commsGoodChanged(); - void gcsGPSGoodChanged(); - void basicIDGoodChanged(); - void emergencyDeclaredChanged(); - void operatorIDGoodChanged(); - -private slots: - void _odidTimeout(); - void _sendMessages(); - void _updateLastGCSPositionInfo(QGeoPositionInfo update); - void _checkGCSBasicID(); - -private: - void _handleArmStatus(mavlink_message_t& message); - - // Self ID - void _sendSelfIDMsg (); - const char* _getSelfIDDescription(); - - // Operator ID - void _sendOperatorID (); - - // System - void _sendSystem(); - uint32_t _timestamp2019(); - - // Basic ID - void _sendBasicID(); - - MAVLinkProtocol* _mavlink; - Vehicle* _vehicle; - RemoteIDSettings* _settings; - QGCPositionManager* _positionManager; - - // Flags ODID - bool _armStatusGood; - QString _armStatusError; - bool _commsGood; - bool _gcsGPSGood; - bool _basicIDGood; - bool _GCSBasicIDValid; - bool _operatorIDGood; - - bool _emergencyDeclared; - QDateTime _lastGeoPositionTimeStamp; - int _targetSystem; - int _targetComponent; - - // After emergency cleared, this makes sure the non emergency selfID message makes it to the vehicle - bool _enforceSendingSelfID; - - static const uint8_t* _id_or_mac_unknown; - - // Timers - QTimer _odidTimeoutTimer; - QTimer _sendMessagesTimer; -}; \ No newline at end of file diff --git a/src/Vehicle/RequestMessageTest.cc b/src/Vehicle/RequestMessageTest.cc index c422475..12e90c5 100644 --- a/src/Vehicle/RequestMessageTest.cc +++ b/src/Vehicle/RequestMessageTest.cc @@ -38,21 +38,21 @@ void RequestMessageTest::_testCaseWorker(TestCase_t& testCase) MultiVehicleManager* vehicleMgr = qgcApp()->toolbox()->multiVehicleManager(); Vehicle* vehicle = vehicleMgr->activeVehicle(); - _mockLink->clearReceivedMavCommandCounts(); + _mockLink->clearSendMavCommandCounts(); _mockLink->setRequestMessageFailureMode(testCase.failureMode); vehicle->requestMessage(_requestMessageResultHandler, &testCase, MAV_COMP_ID_AUTOPILOT1, MAVLINK_MSG_ID_DEBUG); QVERIFY(QTest::qWaitFor([&]() { return testCase.resultHandlerCalled; }, 10000)); QCOMPARE(vehicle->_findMavCommandListEntryIndex(MAV_COMP_ID_AUTOPILOT1, MAV_CMD_REQUEST_MESSAGE), -1); - QCOMPARE(_mockLink->receivedMavCommandCount(MAV_CMD_REQUEST_MESSAGE), testCase.expectedSendCount); + QCOMPARE(_mockLink->sendMavCommandCount(MAV_CMD_REQUEST_MESSAGE), testCase.expectedSendCount); // We should be able to do it twice in a row without any duplicate command problems testCase.resultHandlerCalled = false; - _mockLink->clearReceivedMavCommandCounts(); + _mockLink->clearSendMavCommandCounts(); vehicle->requestMessage(_requestMessageResultHandler, &testCase, MAV_COMP_ID_AUTOPILOT1, MAVLINK_MSG_ID_DEBUG); QVERIFY(QTest::qWaitFor([&]() { return testCase.resultHandlerCalled; }, 10000)); QCOMPARE(vehicle->_findMavCommandListEntryIndex(MAV_COMP_ID_AUTOPILOT1, MAV_CMD_REQUEST_MESSAGE), -1); - QCOMPARE(_mockLink->receivedMavCommandCount(MAV_CMD_REQUEST_MESSAGE), testCase.expectedSendCount); + QCOMPARE(_mockLink->sendMavCommandCount(MAV_CMD_REQUEST_MESSAGE), testCase.expectedSendCount); _disconnectMockLink(); } @@ -77,19 +77,19 @@ void RequestMessageTest::_duplicateCommand(void) MultiVehicleManager* vehicleMgr = qgcApp()->toolbox()->multiVehicleManager(); Vehicle* vehicle = vehicleMgr->activeVehicle(); - _mockLink->clearReceivedMavCommandCounts(); + _mockLink->clearSendMavCommandCounts(); _mockLink->setRequestMessageFailureMode(testCase.failureMode); QVERIFY(false == vehicle->isMavCommandPending(MAV_COMP_ID_AUTOPILOT1, MAV_CMD_REQUEST_MESSAGE)); vehicle->requestMessage(_requestMessageResultHandler, &testCase, MAV_COMP_ID_AUTOPILOT1, MAVLINK_MSG_ID_DEBUG); - QVERIFY(QTest::qWaitFor([&]() { return _mockLink->receivedMavCommandCount(MAV_CMD_REQUEST_MESSAGE) == 1; }, 10)); + QVERIFY(QTest::qWaitFor([&]() { return _mockLink->sendMavCommandCount(MAV_CMD_REQUEST_MESSAGE) == 1; }, 10)); QCOMPARE(testCase.resultHandlerCalled, false); vehicle->requestMessage(_requestMessageResultHandler, &testCase, MAV_COMP_ID_AUTOPILOT1, MAVLINK_MSG_ID_DEBUG); // Duplicate command returns immediately QCOMPARE(testCase.resultHandlerCalled, true); - QCOMPARE(_mockLink->receivedMavCommandCount(MAV_CMD_REQUEST_MESSAGE), testCase.expectedSendCount); + QCOMPARE(_mockLink->sendMavCommandCount(MAV_CMD_REQUEST_MESSAGE), testCase.expectedSendCount); QVERIFY(vehicle->_findMavCommandListEntryIndex(MAV_COMP_ID_AUTOPILOT1, MAV_CMD_REQUEST_MESSAGE) != -1); QVERIFY(true == vehicle->isMavCommandPending(MAV_COMP_ID_AUTOPILOT1, MAV_CMD_REQUEST_MESSAGE)); @@ -123,13 +123,13 @@ void RequestMessageTest::_compIdAllFailure(void) MultiVehicleManager* vehicleMgr = qgcApp()->toolbox()->multiVehicleManager(); Vehicle* vehicle = vehicleMgr->activeVehicle(); - _mockLink->clearReceivedMavCommandCounts(); + _mockLink->clearSendMavCommandCounts(); _mockLink->setRequestMessageFailureMode(testCase.failureMode); vehicle->requestMessage(_requestMessageResultHandler, &testCase, MAV_COMP_ID_ALL, MAVLINK_MSG_ID_DEBUG); QCOMPARE(testCase.resultHandlerCalled, true); QCOMPARE(vehicle->_findMavCommandListEntryIndex(MAV_COMP_ID_ALL, MAV_CMD_REQUEST_MESSAGE), -1); - QCOMPARE(_mockLink->receivedMavCommandCount(MAV_CMD_REQUEST_MESSAGE), 0); + QCOMPARE(_mockLink->sendMavCommandCount(MAV_CMD_REQUEST_MESSAGE), 0); _disconnectMockLink(); } diff --git a/src/Vehicle/SendMavCommandWithHandlerTest.cc b/src/Vehicle/SendMavCommandWithHandlerTest.cc index 6f6023c..bf403ac 100644 --- a/src/Vehicle/SendMavCommandWithHandlerTest.cc +++ b/src/Vehicle/SendMavCommandWithHandlerTest.cc @@ -13,47 +13,28 @@ #include "MockLink.h" SendMavCommandWithHandlerTest::TestCase_t SendMavCommandWithHandlerTest::_rgTestCases[] = { - { MockLink::MAV_CMD_MOCKLINK_ALWAYS_RESULT_ACCEPTED, MAV_RESULT_ACCEPTED, false, Vehicle::MavCmdResultCommandResultOnly, 1 }, - { MockLink::MAV_CMD_MOCKLINK_ALWAYS_RESULT_FAILED, MAV_RESULT_FAILED, false, Vehicle::MavCmdResultCommandResultOnly, 1 }, - { MockLink::MAV_CMD_MOCKLINK_SECOND_ATTEMPT_RESULT_ACCEPTED, MAV_RESULT_ACCEPTED, false, Vehicle::MavCmdResultCommandResultOnly, 2 }, - { MockLink::MAV_CMD_MOCKLINK_SECOND_ATTEMPT_RESULT_FAILED, MAV_RESULT_FAILED, false, Vehicle::MavCmdResultCommandResultOnly, 2 }, - { MockLink::MAV_CMD_MOCKLINK_NO_RESPONSE, MAV_RESULT_FAILED, false, Vehicle::MavCmdResultFailureNoResponseToCommand, Vehicle::_mavCommandMaxRetryCount }, - { MockLink::MAV_CMD_MOCKLINK_NO_RESPONSE_NO_RETRY, MAV_RESULT_FAILED, false, Vehicle::MavCmdResultFailureNoResponseToCommand, 1 }, - { MockLink::MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_ACCEPTED, MAV_RESULT_ACCEPTED, true, Vehicle::MavCmdResultCommandResultOnly, 1 }, - { MockLink::MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_FAILED, MAV_RESULT_FAILED, true, Vehicle::MavCmdResultCommandResultOnly, 1 }, - { MockLink::MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_NO_ACK, MAV_RESULT_FAILED, true, Vehicle::MavCmdResultFailureNoResponseToCommand, 1 }, + { MockLink::MAV_CMD_MOCKLINK_ALWAYS_RESULT_ACCEPTED, MAV_RESULT_ACCEPTED, 0, Vehicle::MavCmdResultCommandResultOnly, 1 }, + { MockLink::MAV_CMD_MOCKLINK_ALWAYS_RESULT_FAILED, MAV_RESULT_FAILED, 0, Vehicle::MavCmdResultCommandResultOnly, 1 }, + { MockLink::MAV_CMD_MOCKLINK_SECOND_ATTEMPT_RESULT_ACCEPTED, MAV_RESULT_ACCEPTED, 0, Vehicle::MavCmdResultCommandResultOnly, 2 }, + { MockLink::MAV_CMD_MOCKLINK_SECOND_ATTEMPT_RESULT_FAILED, MAV_RESULT_FAILED, 0, Vehicle::MavCmdResultCommandResultOnly, 2 }, + { MockLink::MAV_CMD_MOCKLINK_NO_RESPONSE, MAV_RESULT_FAILED, 0, Vehicle::MavCmdResultFailureNoResponseToCommand, Vehicle::_mavCommandMaxRetryCount }, + { MockLink::MAV_CMD_MOCKLINK_NO_RESPONSE_NO_RETRY, MAV_RESULT_FAILED, 0, Vehicle::MavCmdResultFailureNoResponseToCommand, 1 }, }; -bool SendMavCommandWithHandlerTest::_resultHandlerCalled = false; -bool SendMavCommandWithHandlerTest::_progressHandlerCalled = false; +bool SendMavCommandWithHandlerTest::_handlerCalled = false; -void SendMavCommandWithHandlerTest::_mavCmdResultHandler(void* resultHandlerData, int compId, const mavlink_command_ack_t& ack, Vehicle::MavCmdResultFailureCode_t failureCode) +void SendMavCommandWithHandlerTest::_mavCmdResultHandler(void* resultHandlerData, int compId, MAV_RESULT commandResult, uint8_t progress, Vehicle::MavCmdResultFailureCode_t failureCode) { TestCase_t* testCase = static_cast(resultHandlerData); - _resultHandlerCalled = true; + _handlerCalled = true; - QCOMPARE(MAV_COMP_ID_AUTOPILOT1, compId); - QCOMPARE(testCase->expectedCommandResult, ack.result); + QCOMPARE(compId, MAV_COMP_ID_AUTOPILOT1); + QCOMPARE(testCase->expectedCommandResult, commandResult); + QCOMPARE(testCase->progress, progress); QCOMPARE(testCase->expectedFailureCode, failureCode); } -void SendMavCommandWithHandlerTest::_mavCmdProgressHandler(void* progressHandlerData, int compId, const mavlink_command_ack_t& ack) -{ - TestCase_t* testCase = static_cast(progressHandlerData); - MultiVehicleManager* vehicleMgr = qgcApp()->toolbox()->multiVehicleManager(); - Vehicle* vehicle = vehicleMgr->activeVehicle(); - - _progressHandlerCalled = true; - - QCOMPARE(MAV_COMP_ID_AUTOPILOT1, compId); - QCOMPARE(MAV_RESULT_IN_PROGRESS, ack.result); - QCOMPARE(1, ack.progress); - - // Command should still be in list - QVERIFY(vehicle->_findMavCommandListEntryIndex(MAV_COMP_ID_AUTOPILOT1, testCase->command) != -1); -} - void SendMavCommandWithHandlerTest::_testCaseWorker(TestCase_t& testCase) { _connectMockLinkNoInitialConnectSequence(); @@ -61,25 +42,12 @@ void SendMavCommandWithHandlerTest::_testCaseWorker(TestCase_t& testCase) MultiVehicleManager* vehicleMgr = qgcApp()->toolbox()->multiVehicleManager(); Vehicle* vehicle = vehicleMgr->activeVehicle(); - Vehicle::MavCmdAckHandlerInfo_t handlerInfo = {}; - handlerInfo.resultHandler = _mavCmdResultHandler; - handlerInfo.resultHandlerData = &testCase; - handlerInfo.progressHandler = _mavCmdProgressHandler; - handlerInfo.progressHandlerData = &testCase; - - _resultHandlerCalled = false; - _progressHandlerCalled = false; - - _mockLink->clearReceivedMavCommandCounts(); - vehicle->sendMavCommandWithHandler(&handlerInfo, MAV_COMP_ID_AUTOPILOT1, testCase.command); - - if (testCase.expectInProgressResult) { - QVERIFY(QTest::qWaitFor([&]() { return _progressHandlerCalled; }, 10000)); - } - - QVERIFY(QTest::qWaitFor([&]() { return _resultHandlerCalled; }, 10000)); - QCOMPARE(_mockLink->receivedMavCommandCount(testCase.command), testCase.expectedSendCount); - QCOMPARE(vehicle->_findMavCommandListEntryIndex(MAV_COMP_ID_AUTOPILOT1, testCase.command), -1); + _handlerCalled = false; + _mockLink->clearSendMavCommandCounts(); + vehicle->sendMavCommandWithHandler(_mavCmdResultHandler, &testCase, MAV_COMP_ID_AUTOPILOT1, testCase.command); + QVERIFY(QTest::qWaitFor([&]() { return _handlerCalled; }, 10000)); + QCOMPARE(vehicle->_findMavCommandListEntryIndex(MAV_COMP_ID_AUTOPILOT1, testCase.command), -1); + QCOMPARE(_mockLink->sendMavCommandCount(testCase.command), testCase.expectedSendCount); _disconnectMockLink(); } @@ -104,35 +72,27 @@ void SendMavCommandWithHandlerTest::_duplicateCommand(void) MultiVehicleManager* vehicleMgr = qgcApp()->toolbox()->multiVehicleManager(); Vehicle* vehicle = vehicleMgr->activeVehicle(); - Vehicle::MavCmdAckHandlerInfo_t handlerInfo = {}; - handlerInfo.resultHandler = _mavCmdResultHandler; - handlerInfo.resultHandlerData = &testCase; - handlerInfo.progressHandler = _mavCmdProgressHandler; - handlerInfo.progressHandlerData = &testCase; - - _resultHandlerCalled = false; - _progressHandlerCalled = false; - - _mockLink->clearReceivedMavCommandCounts(); + _handlerCalled = false; + _mockLink->clearSendMavCommandCounts(); vehicle->sendMavCommand(MAV_COMP_ID_AUTOPILOT1, testCase.command, true /* showError */); - QVERIFY(QTest::qWaitFor([&]() { return _mockLink->receivedMavCommandCount(testCase.command) == 1; }, 10)); - QVERIFY(!_resultHandlerCalled); - QVERIFY(!_progressHandlerCalled); - vehicle->sendMavCommandWithHandler(&handlerInfo, MAV_COMP_ID_AUTOPILOT1, testCase.command); + QVERIFY(QTest::qWaitFor([&]() { return _mockLink->sendMavCommandCount(testCase.command) == 1; }, 10)); + QVERIFY(!_handlerCalled); + vehicle->sendMavCommandWithHandler(_mavCmdResultHandler, &testCase, MAV_COMP_ID_AUTOPILOT1, testCase.command); // Duplicate command response should happen immediately - QVERIFY(_resultHandlerCalled); + QVERIFY(_handlerCalled); QVERIFY(vehicle->_findMavCommandListEntryIndex(MAV_COMP_ID_AUTOPILOT1, testCase.command) != -1); - QCOMPARE(_mockLink->receivedMavCommandCount(testCase.command), 1); + QCOMPARE(_mockLink->sendMavCommandCount(testCase.command), 1); } -void SendMavCommandWithHandlerTest::_compIdAllFailureMavCmdResultHandler(void* /*resultHandlerData*/, int compId, const mavlink_command_ack_t& ack, Vehicle::MavCmdResultFailureCode_t failureCode) +void SendMavCommandWithHandlerTest::_compIdAllMavCmdResultHandler(void* /*resultHandlerData*/, int compId, MAV_RESULT commandResult, uint8_t progress, Vehicle::MavCmdResultFailureCode_t failureCode) { - _resultHandlerCalled = true; + _handlerCalled = true; - QCOMPARE(compId, MAV_COMP_ID_ALL); - QCOMPARE(ack.result, MAV_RESULT_FAILED); - QCOMPARE(failureCode, Vehicle::MavCmdResultCommandResultOnly); + QCOMPARE(compId, MAV_COMP_ID_ALL); + QCOMPARE(commandResult, MAV_RESULT_FAILED); + QCOMPARE(progress, 0); + QCOMPARE(failureCode, Vehicle::MavCmdResultCommandResultOnly); } void SendMavCommandWithHandlerTest::_compIdAllFailure(void) @@ -146,17 +106,12 @@ void SendMavCommandWithHandlerTest::_compIdAllFailure(void) MultiVehicleManager* vehicleMgr = qgcApp()->toolbox()->multiVehicleManager(); Vehicle* vehicle = vehicleMgr->activeVehicle(); - Vehicle::MavCmdAckHandlerInfo_t handlerInfo = {}; - handlerInfo.resultHandler = _compIdAllFailureMavCmdResultHandler; - - _resultHandlerCalled = false; - - _mockLink->clearReceivedMavCommandCounts(); - vehicle->sendMavCommandWithHandler(&handlerInfo, MAV_COMP_ID_ALL, testCase.command); - - QCOMPARE(_resultHandlerCalled, true); + _handlerCalled = false; + _mockLink->clearSendMavCommandCounts(); + vehicle->sendMavCommandWithHandler(_compIdAllMavCmdResultHandler, nullptr, MAV_COMP_ID_ALL, testCase.command); + QCOMPARE(_handlerCalled, true); QCOMPARE(vehicle->_findMavCommandListEntryIndex(MAV_COMP_ID_ALL, testCase.command), -1); - QCOMPARE(_mockLink->receivedMavCommandCount(testCase.command), testCase.expectedSendCount); + QCOMPARE(_mockLink->sendMavCommandCount(testCase.command), testCase.expectedSendCount); _disconnectMockLink(); } diff --git a/src/Vehicle/SendMavCommandWithHandlerTest.h b/src/Vehicle/SendMavCommandWithHandlerTest.h index 1d97c5e..4f70bd0 100644 --- a/src/Vehicle/SendMavCommandWithHandlerTest.h +++ b/src/Vehicle/SendMavCommandWithHandlerTest.h @@ -25,19 +25,17 @@ private: typedef struct { MAV_CMD command; MAV_RESULT expectedCommandResult; - bool expectInProgressResult; + uint8_t progress; Vehicle::MavCmdResultFailureCode_t expectedFailureCode; int expectedSendCount; } TestCase_t; void _testCaseWorker(TestCase_t& testCase); - static void _mavCmdResultHandler (void* resultHandlerData, int compId, const mavlink_command_ack_t& ack, Vehicle::MavCmdResultFailureCode_t failureCode); - static void _mavCmdProgressHandler (void* progressHandlerData, int compId, const mavlink_command_ack_t& ack); - static void _compIdAllFailureMavCmdResultHandler(void* resultHandlerData, int compId, const mavlink_command_ack_t& ack, Vehicle::MavCmdResultFailureCode_t failureCode); + static void _mavCmdResultHandler (void* resultHandlerData, int compId, MAV_RESULT commandResult, uint8_t progress, Vehicle::MavCmdResultFailureCode_t failureCode); + static void _compIdAllMavCmdResultHandler (void* resultHandlerData, int compId, MAV_RESULT commandResult, uint8_t progress, Vehicle::MavCmdResultFailureCode_t failureCode); - static bool _resultHandlerCalled; - static bool _progressHandlerCalled; + static bool _handlerCalled; static TestCase_t _rgTestCases[]; }; diff --git a/src/Vehicle/SendMavCommandWithSignallingTest.cc b/src/Vehicle/SendMavCommandWithSignallingTest.cc index ff1c26e..a5b0139 100644 --- a/src/Vehicle/SendMavCommandWithSignallingTest.cc +++ b/src/Vehicle/SendMavCommandWithSignallingTest.cc @@ -19,9 +19,6 @@ SendMavCommandWithSignallingTest::TestCase_t SendMavCommandWithSignallingTest::_ { MockLink::MAV_CMD_MOCKLINK_SECOND_ATTEMPT_RESULT_FAILED, MAV_RESULT_FAILED, Vehicle::MavCmdResultCommandResultOnly, 2 }, { MockLink::MAV_CMD_MOCKLINK_NO_RESPONSE, MAV_RESULT_FAILED, Vehicle::MavCmdResultFailureNoResponseToCommand, Vehicle::_mavCommandMaxRetryCount }, { MockLink::MAV_CMD_MOCKLINK_NO_RESPONSE_NO_RETRY, MAV_RESULT_FAILED, Vehicle::MavCmdResultFailureNoResponseToCommand, 1 }, - { MockLink::MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_ACCEPTED, MAV_RESULT_ACCEPTED, Vehicle::MavCmdResultCommandResultOnly, 1 }, - { MockLink::MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_FAILED, MAV_RESULT_FAILED, Vehicle::MavCmdResultCommandResultOnly, 1 }, - { MockLink::MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_NO_ACK, MAV_RESULT_FAILED, Vehicle::MavCmdResultFailureNoResponseToCommand, 1 }, }; void SendMavCommandWithSignallingTest::_testCaseWorker(TestCase_t& testCase) @@ -32,7 +29,7 @@ void SendMavCommandWithSignallingTest::_testCaseWorker(TestCase_t& testCase) Vehicle* vehicle = vehicleMgr->activeVehicle(); QSignalSpy spyResult(vehicle, &Vehicle::mavCommandResult); - _mockLink->clearReceivedMavCommandCounts(); + _mockLink->clearSendMavCommandCounts(); vehicle->sendMavCommand(MAV_COMP_ID_AUTOPILOT1, testCase.command, true /* showError */); @@ -45,7 +42,7 @@ void SendMavCommandWithSignallingTest::_testCaseWorker(TestCase_t& testCase) QCOMPARE(arguments.at(3).toInt(), testCase.expectedCommandResult); QCOMPARE(arguments.at(4).value(), testCase.expectedFailureCode); QCOMPARE(vehicle->_findMavCommandListEntryIndex(MAV_COMP_ID_AUTOPILOT1, MockLink::MAV_CMD_MOCKLINK_ALWAYS_RESULT_ACCEPTED), -1); - QCOMPARE(_mockLink->receivedMavCommandCount(testCase.command), testCase.expectedSendCount); + QCOMPARE(_mockLink->sendMavCommandCount(testCase.command), testCase.expectedSendCount); _disconnectMockLink(); } @@ -67,7 +64,7 @@ void SendMavCommandWithSignallingTest::_duplicateCommand(void) Vehicle* vehicle = vehicleMgr->activeVehicle(); vehicle->sendMavCommand(MAV_COMP_ID_AUTOPILOT1, MockLink::MAV_CMD_MOCKLINK_NO_RESPONSE, true /* showError */); - QVERIFY(QTest::qWaitFor([&]() { return _mockLink->receivedMavCommandCount(MockLink::MAV_CMD_MOCKLINK_NO_RESPONSE) == 1; }, 10)); + QVERIFY(QTest::qWaitFor([&]() { return _mockLink->sendMavCommandCount(MockLink::MAV_CMD_MOCKLINK_NO_RESPONSE) == 1; }, 10)); QSignalSpy spyResult(vehicle, &Vehicle::mavCommandResult); vehicle->sendMavCommand(MAV_COMP_ID_AUTOPILOT1, MockLink::MAV_CMD_MOCKLINK_NO_RESPONSE, true /* showError */); @@ -79,6 +76,6 @@ void SendMavCommandWithSignallingTest::_duplicateCommand(void) QCOMPARE(arguments.at(2).toInt(), (int)MockLink::MAV_CMD_MOCKLINK_NO_RESPONSE); QCOMPARE(arguments.at(3).toInt(), (int)MAV_RESULT_FAILED); QCOMPARE(arguments.at(4).value(), Vehicle::MavCmdResultFailureDuplicateCommand); - QCOMPARE(_mockLink->receivedMavCommandCount(MockLink::MAV_CMD_MOCKLINK_NO_RESPONSE), 1); + QCOMPARE(_mockLink->sendMavCommandCount(MockLink::MAV_CMD_MOCKLINK_NO_RESPONSE), 1); QVERIFY(vehicle->_findMavCommandListEntryIndex(MAV_COMP_ID_AUTOPILOT1, MockLink::MAV_CMD_MOCKLINK_NO_RESPONSE) != -1); } diff --git a/src/Vehicle/StandardModes.cc b/src/Vehicle/StandardModes.cc deleted file mode 100644 index e58ca90..0000000 --- a/src/Vehicle/StandardModes.cc +++ /dev/null @@ -1,183 +0,0 @@ -/**************************************************************************** - * - * (c) 2022 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -#include "Vehicle.h" -#include "StandardModes.h" - -QGC_LOGGING_CATEGORY(StandardModesLog, "StandardModesLog") - - -static void requestMessageResultHandler(void* resultHandlerData, MAV_RESULT result, - Vehicle::RequestMessageResultHandlerFailureCode_t failureCode, const mavlink_message_t &message) -{ - StandardModes* standardModes = static_cast(resultHandlerData); - standardModes->gotMessage(result, message); -} - -StandardModes::StandardModes(QObject *parent, Vehicle *vehicle) - : QObject(parent), _vehicle(vehicle) -{ -} - -void StandardModes::gotMessage(MAV_RESULT result, const mavlink_message_t &message) -{ - _requestActive = false; - if (_wantReset) { - _wantReset = false; - request(); - return; - } - - if (result == MAV_RESULT_ACCEPTED) { - mavlink_available_modes_t availableModes; - mavlink_msg_available_modes_decode(&message, &availableModes); - bool cannotBeSet = availableModes.properties & MAV_MODE_PROPERTY_NOT_USER_SELECTABLE; - bool advanced = availableModes.properties & MAV_MODE_PROPERTY_ADVANCED; - availableModes.mode_name[sizeof(availableModes.mode_name)-1] = '\0'; - QString name = availableModes.mode_name; - switch (availableModes.standard_mode) { - case MAV_STANDARD_MODE_POSITION_HOLD: - name = "Position"; - break; - case MAV_STANDARD_MODE_ORBIT: - name = "Orbit"; - break; - case MAV_STANDARD_MODE_CRUISE: - name = "Cruise"; - break; - case MAV_STANDARD_MODE_ALTITUDE_HOLD: - name = "Altitude"; - break; - case MAV_STANDARD_MODE_RETURN_HOME: - name = "Return"; - break; - case MAV_STANDARD_MODE_SAFE_RECOVERY: - name = "Safe Recovery"; - break; - case MAV_STANDARD_MODE_MISSION: - name = "Mission"; - break; - case MAV_STANDARD_MODE_LAND: - name = "Land"; - break; - case MAV_STANDARD_MODE_TAKEOFF: - name = "Takeoff"; - break; - } - - if (name == "Takeoff" || name == "VTOL Takeoff" || name == "Orbit" || name == "Land" || name == "Return") { // These are exposed in the UI as separate buttons - cannotBeSet = true; - } - - qCDebug(StandardModesLog) << "Got mode:" << name << ", idx:" << availableModes.mode_index << ", custom_mode" << availableModes.custom_mode; - - _nextModes[availableModes.custom_mode] = Mode{name, availableModes.standard_mode, advanced, cannotBeSet}; - - if (availableModes.mode_index >= availableModes.number_modes) { // We are done - qCDebug(StandardModesLog) << "Completed, num modes:" << _nextModes.size(); - _modes = _nextModes; - ensureUniqueModeNames(); - _hasModes = true; - emit modesUpdated(); - emit requestCompleted(); - - } else { - requestMode(availableModes.mode_index + 1); - } - - } else { - qCDebug(StandardModesLog) << "Failed to retrieve available modes" << result; - emit requestCompleted(); - } -} - -void StandardModes::ensureUniqueModeNames() -{ - // Ensure mode names are unique. This should generally already be the case, but e.g. during development when - // restarting dynamic modes, it might not be. - for (auto iter = _modes.begin(); iter != _modes.end(); ++iter) { - int duplicateIdx = 0; - for (auto iter2 = iter + 1; iter2 != _modes.end(); ++iter2) { - if (iter.value().name == iter2.value().name) { - iter2.value().name += QStringLiteral(" (%1)").arg(duplicateIdx + 1); - ++duplicateIdx; - } - } - } -} - -void StandardModes::request() -{ -#ifdef DAILY_BUILD // Disable use of development/WIP MAVLink messages for release builds - if (_requestActive) { - // If we are in the middle of waiting for a request, wait for the response first - _wantReset = true; - return; - } - - _nextModes.clear(); - - qCDebug(StandardModesLog) << "Requesting available modes"; - // Request one at a time. This could be improved by requesting all, but we can't use Vehicle::requestMessage for that - StandardModes::requestMode(1); -#else - emit requestCompleted(); -#endif // DAILY_BUILD -} - -void StandardModes::requestMode(int modeIndex) -{ - _requestActive = true; - _vehicle->requestMessage( - requestMessageResultHandler, - this, - MAV_COMP_ID_AUTOPILOT1, - MAVLINK_MSG_ID_AVAILABLE_MODES, modeIndex); -} - -void StandardModes::availableModesMonitorReceived(uint8_t seq) -{ - if (_lastSeq != seq) { - qCDebug(StandardModesLog) << "Available modes changed, re-requesting"; - _lastSeq = seq; - request(); - } -} - -QStringList StandardModes::flightModes() -{ - QStringList ret; - for (const auto& mode : _modes) { - if (mode.cannotBeSet) { - continue; - } - ret += mode.name; - } - return ret; -} - -QString StandardModes::flightMode(uint32_t custom_mode) const -{ - auto iter = _modes.find(custom_mode); - if (iter != _modes.end()) { - return iter->name; - } - return tr("Unknown %2").arg(custom_mode); -} - -bool StandardModes::setFlightMode(const QString &flightMode, uint32_t *custom_mode) -{ - for (auto iter = _modes.constBegin(); iter != _modes.constEnd(); ++iter) { - if (iter->name == flightMode) { - *custom_mode = iter.key(); - return true; - } - } - return false; -} diff --git a/src/Vehicle/StandardModes.h b/src/Vehicle/StandardModes.h deleted file mode 100644 index 948511a..0000000 --- a/src/Vehicle/StandardModes.h +++ /dev/null @@ -1,69 +0,0 @@ -/**************************************************************************** - * - * (c) 2022 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -#pragma once - -#include "QGCLoggingCategory.h" -#include "QGCMAVLink.h" -#include -#include - -Q_DECLARE_LOGGING_CATEGORY(StandardModesLog) - -class Vehicle; - -class StandardModes : public QObject -{ -Q_OBJECT - -public: - struct Mode { - QString name; - uint8_t standardMode; - bool advanced; - bool cannotBeSet; - }; - - StandardModes(QObject* parent, Vehicle* vehicle); - - void request(); - - void availableModesMonitorReceived(uint8_t seq); - - bool supported() const { return _hasModes; } - - QStringList flightModes(); - - QString flightMode(uint32_t custom_mode) const; - - bool setFlightMode(const QString& flightMode, uint32_t* custom_mode); - - void gotMessage(MAV_RESULT result, const mavlink_message_t &message); -signals: - void modesUpdated(); - void requestCompleted(); - -private: - - void requestMode(int modeIndex); - void ensureUniqueModeNames(); - - Vehicle*const _vehicle; - - bool _requestActive{false}; - bool _wantReset{false}; - QMap _nextModes; ///< Modes added by current request - - bool _hasModes{false}; - - int _lastSeq{-1}; - - QMap _modes; ///< key is custom_mode -}; - diff --git a/src/Vehicle/Vehicle.cc b/src/Vehicle/Vehicle.cc index a808339..9cf7e3d 100644 --- a/src/Vehicle/Vehicle.cc +++ b/src/Vehicle/Vehicle.cc @@ -1,4 +1,4 @@ -/**************************************************************************** +/**************************************************************************** * * (c) 2009-2020 QGROUNDCONTROL PROJECT * @@ -55,15 +55,16 @@ #include "MockLink.h" #endif #include "Autotune.h" -#include "RemoteIDManager.h" + +#if defined(QGC_AIRMAP_ENABLED) +#include "AirspaceVehicleManager.h" +#endif QGC_LOGGING_CATEGORY(VehicleLog, "VehicleLog") #define UPDATE_TIMER 50 #define DEFAULT_LAT 38.965767f #define DEFAULT_LON -120.083923f -#define SET_HOME_TERRAIN_ALT_MAX 10000 -#define SET_HOME_TERRAIN_ALT_MIN -500 const QString guided_mode_not_supported_by_vehicle = QObject::tr("Guided mode not supported by Vehicle."); @@ -84,20 +85,17 @@ const char* Vehicle::_groundSpeedFactName = "groundSpeed"; const char* Vehicle::_climbRateFactName = "climbRate"; const char* Vehicle::_altitudeRelativeFactName = "altitudeRelative"; const char* Vehicle::_altitudeAMSLFactName = "altitudeAMSL"; -const char* Vehicle::_altitudeAboveTerrFactName = "altitudeAboveTerr"; const char* Vehicle::_altitudeTuningFactName = "altitudeTuning"; const char* Vehicle::_altitudeTuningSetpointFactName = "altitudeTuningSetpoint"; const char* Vehicle::_flightDistanceFactName = "flightDistance"; const char* Vehicle::_flightTimeFactName = "flightTime"; const char* Vehicle::_distanceToHomeFactName = "distanceToHome"; -const char* Vehicle::_timeToHomeFactName = "timeToHome"; const char* Vehicle::_missionItemIndexFactName = "missionItemIndex"; const char* Vehicle::_headingToNextWPFactName = "headingToNextWP"; const char* Vehicle::_headingToHomeFactName = "headingToHome"; const char* Vehicle::_distanceToGCSFactName = "distanceToGCS"; const char* Vehicle::_hobbsFactName = "hobbs"; const char* Vehicle::_throttlePctFactName = "throttlePct"; -const char* Vehicle::_imuTempFactName = "imuTemp"; const char* Vehicle::_gpsFactGroupName = "gps"; const char* Vehicle::_gps2FactGroupName = "gps2"; @@ -113,8 +111,6 @@ const char* Vehicle::_escStatusFactGroupName = "escStatus"; const char* Vehicle::_estimatorStatusFactGroupName = "estimatorStatus"; const char* Vehicle::_terrainFactGroupName = "terrain"; const char* Vehicle::_hygrometerFactGroupName = "hygrometer"; -const char* Vehicle::_generatorFactGroupName = "generator"; -const char* Vehicle::_efiFactGroupName = "efi"; // Standard connected vehicle Vehicle::Vehicle(LinkInterface* link, @@ -149,7 +145,6 @@ Vehicle::Vehicle(LinkInterface* link, , _climbRateFact (0, _climbRateFactName, FactMetaData::valueTypeDouble) , _altitudeRelativeFact (0, _altitudeRelativeFactName, FactMetaData::valueTypeDouble) , _altitudeAMSLFact (0, _altitudeAMSLFactName, FactMetaData::valueTypeDouble) - , _altitudeAboveTerrFact (0, _altitudeAboveTerrFactName, FactMetaData::valueTypeDouble) , _altitudeTuningFact (0, _altitudeTuningFactName, FactMetaData::valueTypeDouble) , _altitudeTuningSetpointFact (0, _altitudeTuningSetpointFactName, FactMetaData::valueTypeDouble) , _xTrackErrorFact (0, _xTrackErrorFactName, FactMetaData::valueTypeDouble) @@ -157,14 +152,12 @@ Vehicle::Vehicle(LinkInterface* link, , _flightDistanceFact (0, _flightDistanceFactName, FactMetaData::valueTypeDouble) , _flightTimeFact (0, _flightTimeFactName, FactMetaData::valueTypeElapsedTimeInSeconds) , _distanceToHomeFact (0, _distanceToHomeFactName, FactMetaData::valueTypeDouble) - , _timeToHomeFact (0, _timeToHomeFactName, FactMetaData::valueTypeDouble) , _missionItemIndexFact (0, _missionItemIndexFactName, FactMetaData::valueTypeUint16) , _headingToNextWPFact (0, _headingToNextWPFactName, FactMetaData::valueTypeDouble) , _headingToHomeFact (0, _headingToHomeFactName, FactMetaData::valueTypeDouble) , _distanceToGCSFact (0, _distanceToGCSFactName, FactMetaData::valueTypeDouble) , _hobbsFact (0, _hobbsFactName, FactMetaData::valueTypeString) , _throttlePctFact (0, _throttlePctFactName, FactMetaData::valueTypeUint16) - , _imuTempFact (0, _imuTempFactName, FactMetaData::valueTypeInt16) , _gpsFactGroup (this) , _gps2FactGroup (this) , _windFactGroup (this) @@ -178,15 +171,13 @@ Vehicle::Vehicle(LinkInterface* link, , _escStatusFactGroup (this) , _estimatorStatusFactGroup (this) , _hygrometerFactGroup (this) - , _generatorFactGroup (this) - , _efiFactGroup (this) , _terrainFactGroup (this) , _terrainProtocolHandler (new TerrainProtocolHandler(this, &_terrainFactGroup, this)) { _linkManager = _toolbox->linkManager(); - connect(_joystickManager, &JoystickManager::activeJoystickChanged, this, &Vehicle::_loadJoystickSettings); - connect(qgcApp()->toolbox()->multiVehicleManager(), &MultiVehicleManager::activeVehicleChanged, this, &Vehicle::_activeVehicleChanged); + connect(_joystickManager, &JoystickManager::activeJoystickChanged, this, &Vehicle::_loadSettings); + connect(qgcApp()->toolbox()->multiVehicleManager(), &MultiVehicleManager::activeVehicleAvailableChanged, this, &Vehicle::_loadSettings); _mavlink = _toolbox->mavlinkProtocol(); qCDebug(VehicleLog) << "Link started with Mavlink " << (_mavlink->getCurrentVersion() >= 200 ? "V2" : "V1"); @@ -214,6 +205,17 @@ Vehicle::Vehicle(LinkInterface* link, _settingsManager->videoSettings()->lowLatencyMode()->setRawValue(true); } + //-- Airspace Management +#if defined(QGC_AIRMAP_ENABLED) + AirspaceManager* airspaceManager = _toolbox->airspaceManager(); + if (airspaceManager) { + _airspaceVehicleManager = airspaceManager->instantiateVehicle(*this); + if (_airspaceVehicleManager) { + connect(_airspaceVehicleManager, &AirspaceVehicleManager::trafficUpdate, this, &Vehicle::_trafficUpdate); + } + } +#endif + _autopilotPlugin = _firmwarePlugin->autopilotPlugin(this); _autopilotPlugin->setParent(this); @@ -262,9 +264,6 @@ Vehicle::Vehicle(LinkInterface* link, // Start csv logger connect(&_csvLogTimer, &QTimer::timeout, this, &Vehicle::_writeCsvLine); _csvLogTimer.start(1000); - - // Start timer to limit altitude above terrain queries - _altitudeAboveTerrQueryTimer.restart(); } // Disconnected Vehicle for offline editing @@ -301,7 +300,6 @@ Vehicle::Vehicle(MAV_AUTOPILOT firmwareType, , _climbRateFact (0, _climbRateFactName, FactMetaData::valueTypeDouble) , _altitudeRelativeFact (0, _altitudeRelativeFactName, FactMetaData::valueTypeDouble) , _altitudeAMSLFact (0, _altitudeAMSLFactName, FactMetaData::valueTypeDouble) - , _altitudeAboveTerrFact (0, _altitudeAboveTerrFactName, FactMetaData::valueTypeDouble) , _altitudeTuningFact (0, _altitudeTuningFactName, FactMetaData::valueTypeDouble) , _altitudeTuningSetpointFact (0, _altitudeTuningSetpointFactName, FactMetaData::valueTypeDouble) , _xTrackErrorFact (0, _xTrackErrorFactName, FactMetaData::valueTypeDouble) @@ -315,7 +313,6 @@ Vehicle::Vehicle(MAV_AUTOPILOT firmwareType, , _distanceToGCSFact (0, _distanceToGCSFactName, FactMetaData::valueTypeDouble) , _hobbsFact (0, _hobbsFactName, FactMetaData::valueTypeString) , _throttlePctFact (0, _throttlePctFactName, FactMetaData::valueTypeUint16) - , _imuTempFact (0, _imuTempFactName, FactMetaData::valueTypeInt16) , _gpsFactGroup (this) , _gps2FactGroup (this) , _windFactGroup (this) @@ -367,12 +364,8 @@ void Vehicle::_commonInit() connect(this, &Vehicle::coordinateChanged, this, &Vehicle::_updateDistanceToGCS); connect(this, &Vehicle::homePositionChanged, this, &Vehicle::_updateDistanceHeadingToHome); connect(this, &Vehicle::hobbsMeterChanged, this, &Vehicle::_updateHobbsMeter); - connect(this, &Vehicle::coordinateChanged, this, &Vehicle::_updateAltAboveTerrain); - // Initialize alt above terrain to Nan so frontend can display it correctly in case the terrain query had no response - _altitudeAboveTerrFact.setRawValue(qQNaN()); connect(_toolbox->qgcPositionManager(), &QGCPositionManager::gcsPositionChanged, this, &Vehicle::_updateDistanceToGCS); - connect(_toolbox->qgcPositionManager(), &QGCPositionManager::gcsPositionChanged, this, &Vehicle::_updateHomepoint); _missionManager = new MissionManager(this); connect(_missionManager, &MissionManager::error, this, &Vehicle::_missionManagerError); @@ -385,16 +378,12 @@ void Vehicle::_commonInit() connect(_missionManager, &MissionManager::sendComplete, _trajectoryPoints, &TrajectoryPoints::clear); connect(_missionManager, &MissionManager::newMissionItemsAvailable, _trajectoryPoints, &TrajectoryPoints::clear); - _standardModes = new StandardModes (this, this); _componentInformationManager = new ComponentInformationManager (this); _initialConnectStateMachine = new InitialConnectStateMachine (this); _ftpManager = new FTPManager (this); _imageProtocolManager = new ImageProtocolManager (); _vehicleLinkManager = new VehicleLinkManager (this); - connect(_standardModes, &StandardModes::modesUpdated, this, &Vehicle::flightModesChanged); - connect(_standardModes, &StandardModes::modesUpdated, this, [this](){ Vehicle::flightModeChanged(flightMode()); }); - _parameterManager = new ParameterManager(this); connect(_parameterManager, &ParameterManager::parametersReadyChanged, this, &Vehicle::_parametersReady); @@ -415,9 +404,6 @@ void Vehicle::_commonInit() connect(_rallyPointManager, &RallyPointManager::error, this, &Vehicle::_rallyPointManagerError); connect(_rallyPointManager, &RallyPointManager::loadComplete, this, &Vehicle::_firstRallyPointLoadComplete); - // Remote ID manager might want to acces parameters so make sure to create it after - _remoteIDManager = new RemoteIDManager(this); - // Flight modes can differ based on advanced mode connect(_toolbox->corePlugin(), &QGCCorePlugin::showAdvancedUIChanged, this, &Vehicle::flightModesChanged); @@ -437,7 +423,6 @@ void Vehicle::_commonInit() _addFact(&_climbRateFact, _climbRateFactName); _addFact(&_altitudeRelativeFact, _altitudeRelativeFactName); _addFact(&_altitudeAMSLFact, _altitudeAMSLFactName); - _addFact(&_altitudeAboveTerrFact, _altitudeAboveTerrFactName); _addFact(&_altitudeTuningFact, _altitudeTuningFactName); _addFact(&_altitudeTuningSetpointFact, _altitudeTuningSetpointFactName); _addFact(&_xTrackErrorFact, _xTrackErrorFactName); @@ -445,13 +430,11 @@ void Vehicle::_commonInit() _addFact(&_flightDistanceFact, _flightDistanceFactName); _addFact(&_flightTimeFact, _flightTimeFactName); _addFact(&_distanceToHomeFact, _distanceToHomeFactName); - _addFact(&_timeToHomeFact, _timeToHomeFactName); _addFact(&_missionItemIndexFact, _missionItemIndexFactName); _addFact(&_headingToNextWPFact, _headingToNextWPFactName); _addFact(&_headingToHomeFact, _headingToHomeFactName); _addFact(&_distanceToGCSFact, _distanceToGCSFactName); _addFact(&_throttlePctFact, _throttlePctFactName); - _addFact(&_imuTempFact, _imuTempFactName); _hobbsFact.setRawValue(QVariant(QString("0000:00:00"))); _addFact(&_hobbsFact, _hobbsFactName); @@ -469,8 +452,6 @@ void Vehicle::_commonInit() _addFactGroup(&_escStatusFactGroup, _escStatusFactGroupName); _addFactGroup(&_estimatorStatusFactGroup, _estimatorStatusFactGroupName); _addFactGroup(&_hygrometerFactGroup, _hygrometerFactGroupName); - _addFactGroup(&_generatorFactGroup, _generatorFactGroupName); - _addFactGroup(&_efiFactGroup, _efiFactGroupName); _addFactGroup(&_terrainFactGroup, _terrainFactGroupName); // Add firmware-specific fact groups, if provided @@ -495,8 +476,16 @@ void Vehicle::_commonInit() _settingsManager->videoSettings()->lowLatencyMode()->setRawValue(true); } - // enable Joystick if appropriate - _loadJoystickSettings(); + //-- Airspace Management +#if defined(QGC_AIRMAP_ENABLED) + AirspaceManager* airspaceManager = _toolbox->airspaceManager(); + if (airspaceManager) { + _airspaceVehicleManager = airspaceManager->instantiateVehicle(*this); + if (_airspaceVehicleManager) { + connect(_airspaceVehicleManager, &AirspaceVehicleManager::trafficUpdate, this, &Vehicle::_trafficUpdate); + } + } +#endif } Vehicle::~Vehicle() @@ -511,6 +500,16 @@ Vehicle::~Vehicle() delete _mav; _mav = nullptr; + + if (_joystickManager) { + _startJoystick(false); + } + +#if defined(QGC_AIRMAP_ENABLED) + if (_airspaceVehicleManager) { + delete _airspaceVehicleManager; + } +#endif } void Vehicle::prepareDelete() @@ -657,7 +656,6 @@ void Vehicle::_mavlinkMessageReceived(LinkInterface* link, mavlink_message_t mes _ftpManager->_mavlinkMessageReceived(message); _parameterManager->mavlinkMessageReceived(message); _imageProtocolManager->mavlinkMessageReceived(message); - _remoteIDManager->mavlinkMessageReceived(message); _waitForMavlinkMessageMessageReceived(message); @@ -689,7 +687,7 @@ void Vehicle::_mavlinkMessageReceived(LinkInterface* link, mavlink_message_t mes _handleSysStatus(message); break; case MAVLINK_MSG_ID_RAW_IMU: - _handleRawImuTemp(message); + emit mavlinkRawImu(message); break; case MAVLINK_MSG_ID_SCALED_IMU: emit mavlinkScaledImu1(message); @@ -724,6 +722,9 @@ void Vehicle::_mavlinkMessageReceived(LinkInterface* link, mavlink_message_t mes case MAVLINK_MSG_ID_VFR_HUD: _handleVfrHud(message); break; + // case MAVLINK_MSG_ID_RANGEFINDER: + // _handleRangefinder(message); + // break; case MAVLINK_MSG_ID_NAV_CONTROLLER_OUTPUT: _handleNavControllerOutput(message); break; @@ -760,9 +761,6 @@ void Vehicle::_mavlinkMessageReceived(LinkInterface* link, mavlink_message_t mes case MAVLINK_MSG_ID_OBSTACLE_DISTANCE: _handleObstacleDistance(message); break; - case MAVLINK_MSG_ID_FENCE_STATUS: - _handleFenceStatus(message); - break; case MAVLINK_MSG_ID_EVENT: case MAVLINK_MSG_ID_CURRENT_EVENT_SEQUENCE: @@ -782,30 +780,12 @@ void Vehicle::_mavlinkMessageReceived(LinkInterface* link, mavlink_message_t mes } } break; -#ifdef DAILY_BUILD // Disable use of development/WIP MAVLink messages for release builds - case MAVLINK_MSG_ID_AVAILABLE_MODES_MONITOR: - { - // Avoid duplicate requests during initial connection setup - if (!_initialConnectStateMachine || !_initialConnectStateMachine->active()) { - mavlink_available_modes_monitor_t availableModesMonitor; - mavlink_msg_available_modes_monitor_decode(&message, &availableModesMonitor); - _standardModes->availableModesMonitorReceived(availableModesMonitor.seq); - } - break; - } - case MAVLINK_MSG_ID_CURRENT_MODE: - _handleCurrentMode(message); - break; -#endif // DAILY_BUILD // Following are ArduPilot dialect messages #if !defined(NO_ARDUPILOT_DIALECT) case MAVLINK_MSG_ID_CAMERA_FEEDBACK: _handleCameraFeedback(message); break; - case MAVLINK_MSG_ID_RANGEFINDER: - _handleRangefinder(message); - break; #endif } @@ -827,14 +807,6 @@ void Vehicle::_handleCameraFeedback(const mavlink_message_t& message) qCDebug(VehicleLog) << "_handleCameraFeedback coord:index" << imageCoordinate << feedback.img_idx; _cameraTriggerPoints.append(new QGCQGeoCoordinate(imageCoordinate, this)); } - -void Vehicle::_handleRangefinder(mavlink_message_t& message) -{ - - mavlink_rangefinder_t rangefinder; - mavlink_msg_rangefinder_decode(&message, &rangefinder); - _rangeFinderDistFact.setRawValue(qIsNaN(rangefinder.distance) ? 0 : rangefinder.distance); -} #endif void Vehicle::_handleOrbitExecutionStatus(const mavlink_message_t& message) @@ -925,15 +897,6 @@ void Vehicle::_chunkedStatusTextCompleted(uint8_t compId) bool ardupilotPrearm = messageText.startsWith(QStringLiteral("PreArm")); bool px4Prearm = messageText.startsWith(QStringLiteral("preflight"), Qt::CaseInsensitive) && severity >= MAV_SEVERITY_CRITICAL; if (ardupilotPrearm || px4Prearm) { - // check if expected as event - auto eventData = _events.find(compId); - if (eventData != _events.end()) { - if (eventData->data()->healthAndArmingChecksSupported()) { - qCDebug(VehicleLog) << "Dropping preflight message (expected as event):" << messageText; - return; - } - } - // Limit repeated PreArm message to once every 10 seconds if (_noisySpokenPrearmMap.contains(messageText) && _noisySpokenPrearmMap[messageText].msecsTo(QTime::currentTime()) < (10 * 1000)) { skipSpoken = true; @@ -960,11 +923,12 @@ void Vehicle::_chunkedStatusTextCompleted(uint8_t compId) qgcApp()->toolbox()->audioOutput()->say(messageText); } } - emit textMessageReceived(id(), compId, severity, messageText.toHtmlEscaped(), ""); + emit textMessageReceived(id(), compId, severity, messageText); } void Vehicle::_handleStatusText(mavlink_message_t& message) { + QByteArray b; QString messageText; mavlink_statustext_t statustext; @@ -972,9 +936,9 @@ void Vehicle::_handleStatusText(mavlink_message_t& message) uint8_t compId = message.compid; - char b[MAVLINK_MSG_STATUSTEXT_FIELD_TEXT_LEN+1]; - strncpy(b, statustext.text, MAVLINK_MSG_STATUSTEXT_FIELD_TEXT_LEN); - b[sizeof(b)-1] = '\0'; + b.resize(MAVLINK_MSG_STATUSTEXT_FIELD_TEXT_LEN+1); + strncpy(b.data(), statustext.text, MAVLINK_MSG_STATUSTEXT_FIELD_TEXT_LEN); + b[b.length()-1] = '\0'; messageText = QString(b); bool includesNullTerminator = messageText.length() < MAVLINK_MSG_STATUSTEXT_FIELD_TEXT_LEN; @@ -1032,11 +996,16 @@ void Vehicle::_handleVfrHud(mavlink_message_t& message) _altitudeTuningOffset = vfrHud.alt; } _altitudeTuningFact.setRawValue(vfrHud.alt - _altitudeTuningOffset); - if (!qIsNaN(vfrHud.groundspeed) && !qIsNaN(_distanceToHomeFact.cookedValue().toDouble())) { - _timeToHomeFact.setRawValue(_distanceToHomeFact.cookedValue().toDouble() / vfrHud.groundspeed); - } } +void Vehicle::_handleRangefinder(mavlink_message_t& message) +{ + // mavlink_rangefinder_t rangefinder; + // mavlink_msg_rangefinder_decode(&message, &rangefinder); + // _rangeFinderDistFact.setRawValue(qIsNaN(rangefinder.distance) ? 0 : rangefinder.distance); +} + + void Vehicle::_handleNavControllerOutput(mavlink_message_t& message) { mavlink_nav_controller_output_t navControllerOutput; @@ -1352,7 +1321,7 @@ QString Vehicle::vehicleUIDStr() { QString uid; uint8_t* pUid = (uint8_t*)(void*)&_uid; - uid = uid.asprintf("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", + uid.asprintf("%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", pUid[0] & 0xff, pUid[1] & 0xff, pUid[2] & 0xff, @@ -1520,7 +1489,6 @@ void Vehicle::_setHomePosition(QGeoCoordinate& homeCoord) { if (homeCoord != _homePosition) { _homePosition = homeCoord; - qCDebug(VehicleLog) << "new home location set at coordinate: " << homeCoord; emit homePositionChanged(_homePosition); } } @@ -1607,6 +1575,7 @@ void Vehicle::_handleEvent(uint8_t comp_id, std::unique_ptrgroup() == "health" || event->group() == "arming_check") { + _events[comp_id]->healthAndArmingChecks().handleEvent(*event.get()); // these are displayed separately return; } @@ -1621,38 +1590,13 @@ void Vehicle::_handleEvent(uint8_t comp_id, std::unique_ptrgroup() == "default" && severity != -1) { std::string message = event->message(); std::string description = event->description(); - - if (event->type() == "append_health_and_arming_messages" && event->numArguments() > 0) { - uint32_t customMode = event->argumentValue(0).value.val_uint32_t; - const QSharedPointer& eventHandler = _events[comp_id]; - int modeGroup = eventHandler->getModeGroup(customMode); - std::vector checks = eventHandler->healthAndArmingCheckResults().checks(modeGroup); - QList messageChecks; - for (const auto& check : checks) { - if (events::externalLogLevel(check.log_levels) <= events::Log::Warning) { - messageChecks.append(check.message); - } + if (message.size() > 0) { + // TODO: handle this properly in the UI (e.g. with an expand button to display the description, clickable URL's + params)... + QString msg = QString::fromStdString(message); + if (description.size() > 0) { + msg += "
" + QString::fromStdString(description).replace("\n", "
") + "
"; } - if (messageChecks.empty()) { - // Add all - for (const auto& check : checks) { - messageChecks.append(check.message); - } - } - if (!message.empty() && !messageChecks.empty()) { - message += "\n"; - } - if (messageChecks.size() == 1) { - message += messageChecks[0]; - } else { - for (const auto& messageCheck : messageChecks) { - message += "- " + messageCheck + "\n"; - } - } - } - - if (!message.empty()) { - emit textMessageReceived(id(), comp_id, severity, QString::fromStdString(message), QString::fromStdString(description)); + emit textMessageReceived(id(), comp_id, severity, msg); } } } @@ -1683,50 +1627,16 @@ EventHandler& Vehicle::_eventHandler(uint8_t compid) sendRequestEventMessageCB, _mavlink->getSystemId(), _mavlink->getComponentId(), _id, compid)}; eventData = _events.insert(compid, eventHandler); - - // connect health and arming check updates - connect(eventHandler.data(), &EventHandler::healthAndArmingChecksUpdated, this, [compid, this]() { - const QSharedPointer& eventHandler = _events[compid]; - _healthAndArmingCheckReport.update(compid, eventHandler->healthAndArmingCheckResults(), - eventHandler->getModeGroup(_has_custom_mode_user_intention ? _custom_mode_user_intention : _custom_mode)); - }); - connect(this, &Vehicle::flightModeChanged, this, [compid, this]() { - const QSharedPointer& eventHandler = _events[compid]; - if (eventHandler->healthAndArmingCheckResultsValid()) { - _healthAndArmingCheckReport.update(compid, eventHandler->healthAndArmingCheckResults(), - eventHandler->getModeGroup(_has_custom_mode_user_intention ? _custom_mode_user_intention : _custom_mode)); - } - }); } return *eventData->data(); } -void Vehicle::setEventsMetadata(uint8_t compid, const QString& metadataJsonFileName) +void Vehicle::setEventsMetadata(uint8_t compid, const QString& metadataJsonFileName, const QString& translationJsonFileName) { - _eventHandler(compid).setMetadata(metadataJsonFileName); - - // get the mode group for some well-known flight modes - int modeGroups[2]{-1, -1}; - const QString modes[2]{"Takeoff", "Mission"}; - for (size_t i = 0; i < sizeof(modeGroups)/sizeof(modeGroups[0]); ++i) { - uint8_t base_mode; - uint32_t custom_mode; - if (setFlightModeCustom(modes[i], &base_mode, &custom_mode)) { - modeGroups[i] = _eventHandler(compid).getModeGroup(custom_mode); - if (modeGroups[i] == -1) { - qCDebug(VehicleLog) << "Failed to get mode group for mode" << modes[i] << "(Might not be in metadata)"; - } - } - } - _healthAndArmingCheckReport.setModeGroups(modeGroups[0], modeGroups[1]); - - // Request arming checks to be reported - sendMavCommand(_defaultComponentId, - MAV_CMD_RUN_PREARM_CHECKS, - false); + _eventHandler(compid).setMetadata(metadataJsonFileName, translationJsonFileName); } -void Vehicle::setActuatorsMetadata(uint8_t compid, const QString& metadataJsonFileName) +void Vehicle::setActuatorsMetadata(uint8_t compid, const QString& metadataJsonFileName, const QString& translationJsonFileName) { if (!_actuators) { _actuators = new Actuators(this, this); @@ -1774,20 +1684,6 @@ void Vehicle::_handleHeartbeat(mavlink_message_t& message) } } -void Vehicle::_handleCurrentMode(mavlink_message_t& message) -{ - mavlink_current_mode_t currentMode; - mavlink_msg_current_mode_decode(&message, ¤tMode); - if (currentMode.intended_custom_mode != 0) { // 0 == unknown/not supplied - _has_custom_mode_user_intention = true; - bool changed = _custom_mode_user_intention != currentMode.intended_custom_mode; - _custom_mode_user_intention = currentMode.intended_custom_mode; - if (changed) { - emit flightModeChanged(flightMode()); - } - } -} - void Vehicle::_handleRadioStatus(mavlink_message_t& message) { @@ -1927,12 +1823,12 @@ int Vehicle::motorCount() switch (_vehicleType) { case MAV_TYPE_HELICOPTER: return 1; - case MAV_TYPE_VTOL_TAILSITTER_DUOROTOR: + case MAV_TYPE_VTOL_DUOROTOR: return 2; case MAV_TYPE_TRICOPTER: return 3; case MAV_TYPE_QUADROTOR: - case MAV_TYPE_VTOL_TAILSITTER_QUADROTOR: + case MAV_TYPE_VTOL_QUADROTOR: return 4; case MAV_TYPE_HEXAROTOR: return 6; @@ -2073,9 +1969,14 @@ void Vehicle::_handleTextMessage(int newCount) _messageCount = newCount; emit messageCountChanged(); } + QString errMsg = pMh->getLatestError(); + if(errMsg != _latestError) { + _latestError = errMsg; + emit latestErrorChanged(); + } } -void Vehicle::resetAllMessages() +void Vehicle::resetMessages() { // Reset Counts int count = _currentMessageCount; @@ -2093,52 +1994,18 @@ void Vehicle::resetAllMessages() } } -// Reset warning counts only -void Vehicle::resetErrorLevelMessages() -{ - int prevMessageCount = _currentMessageCount; - MessageType_t prevMessagetype = _currentMessageType; - - _currentMessageCount -= _currentErrorCount; - _currentErrorCount = 0; - - if (_currentWarningCount > 0) { - _currentMessageType = MessageWarning; - } else if (_currentNormalCount > 0) { - _currentMessageType = MessageNormal; - } else { - _currentMessageType = MessageNone; - } - - if (prevMessageCount != _currentMessageCount) { - emit newMessageCountChanged(); - } - if (prevMessagetype != _currentMessageType) { - emit messageTypeChanged(); - } -} - -// this function called in three cases: -// 1. On constructor of vehicle, to see if we should enable a joystick -// 2. When there is a new active joystick -// 3. When the active joystick is disconnected (even if there isnt a new one) -void Vehicle::_loadJoystickSettings() +void Vehicle::_loadSettings() { QSettings settings; settings.beginGroup(QString(_settingsGroup).arg(_id)); - - if (_toolbox->joystickManager()->activeJoystick()) { - qCDebug(JoystickLog) << "Vehicle " << this->id() << " Notified of an active joystick. Loading setting joystickenabled: " << settings.value(_joystickEnabledSettingsKey, false).toBool(); + // Joystick enabled is a global setting so first make sure there are any joysticks connected + if (_toolbox->joystickManager()->joysticks().count()) { setJoystickEnabled(settings.value(_joystickEnabledSettingsKey, false).toBool()); - } else { - qCDebug(JoystickLog) << "Vehicle " << this->id() << " Notified that there is no active joystick"; - setJoystickEnabled(false); + _startJoystick(true); } } -// This is called from the UI when a deliberate action is taken to enable or disable the joystick -// This save allows the joystick enable state to persist restarts, disconnections of the joystick etc -void Vehicle::saveJoystickSettings() +void Vehicle::_saveSettings() { QSettings settings; settings.beginGroup(QString(_settingsGroup).arg(_id)); @@ -2146,7 +2013,6 @@ void Vehicle::saveJoystickSettings() // The joystick enabled setting should only be changed if a joystick is present // since the checkbox can only be clicked if one is present if (_toolbox->joystickManager()->joysticks().count()) { - qCDebug(JoystickLog) << "Vehicle " << this->id() << " Saving setting joystickenabled: " << _joystickEnabled; settings.setValue(_joystickEnabledSettingsKey, _joystickEnabled); } } @@ -2158,48 +2024,25 @@ bool Vehicle::joystickEnabled() const void Vehicle::setJoystickEnabled(bool enabled) { - if (enabled){ - qCDebug(JoystickLog) << "Vehicle " << this->id() << " Joystick Enabled"; - } - else { - qCDebug(JoystickLog) << "Vehicle " << this->id() << " Joystick Disabled"; - } - - // _joystickEnabled is the runtime state - it determines whether a vehicle is using joystick data when it is active _joystickEnabled = enabled; - - // if we are the active vehicle, call start polling on the active joystick - // This routes the joystick signals to this vehicle - if (enabled && _toolbox->multiVehicleManager()->activeVehicle() == this){ - _captureJoystick(); - } - + _startJoystick(_joystickEnabled); + _saveSettings(); emit joystickEnabledChanged(_joystickEnabled); } -void Vehicle::_activeVehicleChanged(Vehicle *newActiveVehicle) -{ - // the new active vehicle should always capture the joystick - // even if the new active vehicle has joystick disabled - // capturing the joystick will stop the joystick data going to the inactive vehicle - if (newActiveVehicle == this){ - qCDebug(JoystickLog) << "Vehicle " << this->id() << " is the new active vehicle"; - _captureJoystick(); - } -} - -// tells the active joystick where to send data -void Vehicle::_captureJoystick() +void Vehicle::_startJoystick(bool start) { Joystick* joystick = _joystickManager->activeJoystick(); - - if(joystick){ - qCDebug(JoystickLog) << "Vehicle " << this->id() << " Capture Joystick" << joystick->name(); - joystick->startPolling(this); + if (joystick) { + if (start) { + joystick->startPolling(this); + } else { + joystick->stopPolling(); + joystick->wait(500); + } } } - QGeoCoordinate Vehicle::homePosition() { return _homePosition; @@ -2230,35 +2073,25 @@ bool Vehicle::flightModeSetAvailable() QStringList Vehicle::flightModes() { - if (_standardModes->supported()) { - return _standardModes->flightModes(); - } return _firmwarePlugin->flightModes(this); } +QStringList Vehicle::extraJoystickFlightModes() +{ + return _firmwarePlugin->extraJoystickFlightModes(this); +} + QString Vehicle::flightMode() const { - if (_standardModes->supported()) { - return _standardModes->flightMode(_custom_mode); - } return _firmwarePlugin->flightMode(_base_mode, _custom_mode); } -bool Vehicle::setFlightModeCustom(const QString& flightMode, uint8_t* base_mode, uint32_t* custom_mode) -{ - if (_standardModes->supported()) { - *base_mode = MAV_MODE_FLAG_CUSTOM_MODE_ENABLED; - return _standardModes->setFlightMode(flightMode, custom_mode); - } - return _firmwarePlugin->setFlightMode(flightMode, base_mode, custom_mode); -} - void Vehicle::setFlightMode(const QString& flightMode) { uint8_t base_mode; uint32_t custom_mode; - if (setFlightModeCustom(flightMode, &base_mode, &custom_mode)) { + if (_firmwarePlugin->setFlightMode(flightMode, &base_mode, &custom_mode)) { SharedLinkInterfacePtr sharedLink = vehicleLinkManager()->primaryLink().lock(); if (!sharedLink) { qCDebug(VehicleLog) << "setFlightMode: primary link gone!"; @@ -2271,23 +2104,15 @@ void Vehicle::setFlightMode(const QString& flightMode) // states. newBaseMode |= base_mode; - if (_firmwarePlugin->MAV_CMD_DO_SET_MODE_is_supported()) { - sendMavCommand(defaultComponentId(), - MAV_CMD_DO_SET_MODE, - true, // show error if fails - MAV_MODE_FLAG_CUSTOM_MODE_ENABLED, - custom_mode); - } else { - mavlink_message_t msg; - mavlink_msg_set_mode_pack_chan(_mavlink->getSystemId(), - _mavlink->getComponentId(), - sharedLink->mavlinkChannel(), - &msg, - id(), - newBaseMode, - custom_mode); - sendMessageOnLinkThreadSafe(sharedLink.get(), msg); - } + mavlink_message_t msg; + mavlink_msg_set_mode_pack_chan(_mavlink->getSystemId(), + _mavlink->getComponentId(), + sharedLink->mavlinkChannel(), + &msg, + id(), + newBaseMode, + custom_mode); + sendMessageOnLinkThreadSafe(sharedLink.get(), msg); } else { qCWarning(VehicleLog) << "FirmwarePlugin::setFlightMode failed, flightMode:" << flightMode; } @@ -2455,12 +2280,6 @@ void Vehicle::_parametersReady(bool parametersReady) _setupAutoDisarmSignalling(); _initialConnectStateMachine->advance(); } - - _multirotor_speed_limits_available = _firmwarePlugin->mulirotorSpeedLimitsAvailable(this); - _fixed_wing_airspeed_limits_available = _firmwarePlugin->fixedWingAirSpeedLimitsAvailable(this); - - emit haveMRSpeedLimChanged(); - emit haveFWSpeedLimChanged(); } void Vehicle::_sendQGCTimeToVehicle() @@ -2618,14 +2437,14 @@ QString Vehicle::vehicleTypeName() const { { MAV_TYPE_OCTOROTOR, tr("Octorotor")}, { MAV_TYPE_TRICOPTER, tr("Octorotor")}, { MAV_TYPE_FLAPPING_WING, tr("Flapping wing")}, - { MAV_TYPE_KITE, tr("Kite")}, + { MAV_TYPE_KITE, tr("Flapping wing")}, { MAV_TYPE_ONBOARD_CONTROLLER, tr("Onboard companion controller")}, - { MAV_TYPE_VTOL_TAILSITTER_DUOROTOR, tr("Two-rotor VTOL using control surfaces in vertical operation in addition. Tailsitter")}, - { MAV_TYPE_VTOL_TAILSITTER_QUADROTOR, tr("Quad-rotor VTOL using a V-shaped quad config in vertical operation. Tailsitter")}, + { MAV_TYPE_VTOL_DUOROTOR, tr("Two-rotor VTOL using control surfaces in vertical operation in addition. Tailsitter")}, + { MAV_TYPE_VTOL_QUADROTOR, tr("Quad-rotor VTOL using a V-shaped quad config in vertical operation. Tailsitter")}, { MAV_TYPE_VTOL_TILTROTOR, tr("Tiltrotor VTOL")}, - { MAV_TYPE_VTOL_FIXEDROTOR, tr("VTOL Fixedrotor")}, - { MAV_TYPE_VTOL_TAILSITTER, tr("VTOL Tailsitter")}, - { MAV_TYPE_VTOL_TILTWING, tr("VTOL Tiltwing")}, + { MAV_TYPE_VTOL_RESERVED2, tr("VTOL reserved 2")}, + { MAV_TYPE_VTOL_RESERVED3, tr("VTOL reserved 3")}, + { MAV_TYPE_VTOL_RESERVED4, tr("VTOL reserved 4")}, { MAV_TYPE_VTOL_RESERVED5, tr("VTOL reserved 5")}, { MAV_TYPE_GIMBAL, tr("Onboard gimbal")}, { MAV_TYPE_ADSB, tr("Onboard ADSB peripheral")}, @@ -2737,28 +2556,6 @@ double Vehicle::minimumTakeoffAltitude() return _firmwarePlugin->minimumTakeoffAltitude(this); } -double Vehicle::maximumHorizontalSpeedMultirotor() -{ - return _firmwarePlugin->maximumHorizontalSpeedMultirotor(this); -} - - -double Vehicle::maximumEquivalentAirspeed() -{ - return _firmwarePlugin->maximumEquivalentAirspeed(this); -} - - -double Vehicle::minimumEquivalentAirspeed() -{ - return _firmwarePlugin->minimumEquivalentAirspeed(this); -} - -bool Vehicle::hasGripper() const -{ - return _firmwarePlugin->hasGripper(this); -} - void Vehicle::startMission() { _firmwarePlugin->startMission(this); @@ -2790,26 +2587,6 @@ void Vehicle::guidedModeChangeAltitude(double altitudeChange, bool pauseVehicle) _firmwarePlugin->guidedModeChangeAltitude(this, altitudeChange, pauseVehicle); } -void -Vehicle::guidedModeChangeGroundSpeedMetersSecond(double groundspeed) -{ - if (!guidedModeSupported()) { - qgcApp()->showAppMessage(guided_mode_not_supported_by_vehicle); - return; - } - _firmwarePlugin->guidedModeChangeGroundSpeedMetersSecond(this, groundspeed); -} - -void -Vehicle::guidedModeChangeEquivalentAirspeedMetersSecond(double airspeed) -{ - if (!guidedModeSupported()) { - qgcApp()->showAppMessage(guided_mode_not_supported_by_vehicle); - return; - } - _firmwarePlugin->guidedModeChangeEquivalentAirspeedMetersSecond(this, airspeed); -} - void Vehicle::guidedModeOrbit(const QGeoCoordinate& centerCoord, double radius, double amslAltitude) { if (!orbitModeSupported()) { @@ -2976,7 +2753,8 @@ void Vehicle::sendMavCommand(int compId, MAV_CMD command, bool showError, float { _sendMavCommandWorker(false, // commandInt showError, - nullptr, // no handlers + nullptr, // resultHandler + nullptr, // resultHandlerData compId, command, MAV_FRAME_GLOBAL, @@ -2997,11 +2775,12 @@ void Vehicle::sendCommand(int compId, int command, bool showError, double param1 static_cast(param7)); } -void Vehicle::sendMavCommandWithHandler(const MavCmdAckHandlerInfo_t* ackHandlerInfo, int compId, MAV_CMD command, float param1, float param2, float param3, float param4, float param5, float param6, float param7) +void Vehicle::sendMavCommandWithHandler(MavCmdResultHandler resultHandler, void *resultHandlerData, int compId, MAV_CMD command, float param1, float param2, float param3, float param4, float param5, float param6, float param7) { _sendMavCommandWorker(false, // commandInt false, // showError - ackHandlerInfo, + resultHandler, + resultHandlerData, compId, command, MAV_FRAME_GLOBAL, @@ -3012,18 +2791,8 @@ void Vehicle::sendMavCommandInt(int compId, MAV_CMD command, MAV_FRAME frame, bo { _sendMavCommandWorker(true, // commandInt showError, - nullptr, // no handlers - compId, - command, - frame, - param1, param2, param3, param4, param5, param6, param7); -} - -void Vehicle::sendMavCommandIntWithHandler(const MavCmdAckHandlerInfo_t* ackHandlerInfo, int compId, MAV_CMD command, MAV_FRAME frame, float param1, float param2, float param3, float param4, double param5, double param6, float param7) -{ - _sendMavCommandWorker(true, // commandInt - false, // showError - ackHandlerInfo, + nullptr, // resultHandler + nullptr, // resultHandlerData compId, command, frame, @@ -3071,7 +2840,6 @@ bool Vehicle::_sendMavCommandShouldRetry(MAV_CMD command) case MAV_CMD_REQUEST_PROTOCOL_VERSION: case MAV_CMD_REQUEST_MESSAGE: case MAV_CMD_PREFLIGHT_STORAGE: - case MAV_CMD_RUN_PREARM_CHECKS: return true; default: @@ -3083,7 +2851,7 @@ bool Vehicle::_commandCanBeDuplicated(MAV_CMD command) { // For some commands we don't care about response as much as we care about sending them regularly. // This test avoids commands not being sent due to an ACK not being received yet. - // MOTOR_TEST in ardusub is a case where we need a constant stream of commands so it doesn't time out. + // MOTOR_TEST in ardusub is a case where we need a constant stream of commands so it don't time out. switch (command) { case MAV_CMD_DO_MOTOR_TEST: return true; @@ -3092,30 +2860,19 @@ bool Vehicle::_commandCanBeDuplicated(MAV_CMD command) } } -void Vehicle::_sendMavCommandWorker( - bool commandInt, - bool showError, - const MavCmdAckHandlerInfo_t* ackHandlerInfo, - int targetCompId, - MAV_CMD command, - MAV_FRAME frame, - float param1, float param2, float param3, float param4, double param5, double param6, float param7) +void Vehicle::_sendMavCommandWorker(bool commandInt, bool showError, MavCmdResultHandler resultHandler, void* resultHandlerData, int targetCompId, MAV_CMD command, MAV_FRAME frame, float param1, float param2, float param3, float param4, float param5, float param6, float param7) { - // We can't send commands to compIdAll using this method. The reason being that we would get responses back possibly from multiple components - // which this code can't handle. - // We also can't send the majority of commands again if we are already waiting for a response from that same command. If we did that we would not be able to discern - // which ack was associated with which command. if ((targetCompId == MAV_COMP_ID_ALL) || (isMavCommandPending(targetCompId, command) && !_commandCanBeDuplicated(command))) { bool compIdAll = targetCompId == MAV_COMP_ID_ALL; QString rawCommandName = _toolbox->missionCommandTree()->rawName(command); qCDebug(VehicleLog) << QStringLiteral("_sendMavCommandWorker failing %1").arg(compIdAll ? "MAV_COMP_ID_ALL not supportded" : "duplicate command") << rawCommandName; + // If we send multiple versions of the same command to a component there is no way to discern which COMMAND_ACK we get back goes with which. + // Because of this we fail in that case. MavCmdResultFailureCode_t failureCode = compIdAll ? MavCmdResultCommandResultOnly : MavCmdResultFailureDuplicateCommand; - if (ackHandlerInfo && ackHandlerInfo->resultHandler) { - mavlink_command_ack_t ack = {}; - ack.result = MAV_RESULT_FAILED; - (*ackHandlerInfo->resultHandler)(ackHandlerInfo->resultHandlerData, targetCompId, ack, failureCode); + if (resultHandler) { + (*resultHandler)(resultHandlerData, targetCompId, MAV_RESULT_FAILED, 0, failureCode); } else { emit mavCommandResult(_id, targetCompId, command, MAV_RESULT_FAILED, failureCode); } @@ -3139,17 +2896,15 @@ void Vehicle::_sendMavCommandWorker( entry.command = command; entry.frame = frame; entry.showError = showError; - entry.ackHandlerInfo = {}; - if (ackHandlerInfo) { - entry.ackHandlerInfo = *ackHandlerInfo; - } - entry.rgParam1 = param1; - entry.rgParam2 = param2; - entry.rgParam3 = param3; - entry.rgParam4 = param4; - entry.rgParam5 = param5; - entry.rgParam6 = param6; - entry.rgParam7 = param7; + entry.resultHandler = resultHandler; + entry.resultHandlerData = resultHandlerData; + entry.rgParam[0] = param1; + entry.rgParam[1] = param2; + entry.rgParam[2] = param3; + entry.rgParam[3] = param4; + entry.rgParam[4] = param5; + entry.rgParam[5] = param6; + entry.rgParam[6] = param7; entry.maxTries = _sendMavCommandShouldRetry(command) ? _mavCommandMaxRetryCount : 1; entry.ackTimeoutMSecs = sharedLink->linkConfiguration()->isHighLatency() ? _mavCommandAckTimeoutMSecsHighLatency : _mavCommandAckTimeoutMSecs; entry.elapsedTimer.start(); @@ -3167,10 +2922,8 @@ void Vehicle::_sendMavCommandFromList(int index) if (++_mavCommandList[index].tryCount > commandEntry.maxTries) { qCDebug(VehicleLog) << "_sendMavCommandFromList giving up after max retries" << rawCommandName; _mavCommandList.removeAt(index); - if (commandEntry.ackHandlerInfo.resultHandler) { - mavlink_command_ack_t ack = {}; - ack.result = MAV_RESULT_FAILED; - (*commandEntry.ackHandlerInfo.resultHandler)(commandEntry.ackHandlerInfo.resultHandlerData, commandEntry.targetCompId, ack, MavCmdResultFailureNoResponseToCommand); + if (commandEntry.resultHandler) { + (*commandEntry.resultHandler)(commandEntry.resultHandlerData, commandEntry.targetCompId, MAV_RESULT_FAILED, 0, MavCmdResultFailureNoResponseToCommand); } else { emit mavCommandResult(_id, commandEntry.targetCompId, commandEntry.command, MAV_RESULT_FAILED, MavCmdResultFailureNoResponseToCommand); } @@ -3204,13 +2957,13 @@ void Vehicle::_sendMavCommandFromList(int index) cmd.target_component = commandEntry.targetCompId; cmd.command = commandEntry.command; cmd.frame = commandEntry.frame; - cmd.param1 = commandEntry.rgParam1; - cmd.param2 = commandEntry.rgParam2; - cmd.param3 = commandEntry.rgParam3; - cmd.param4 = commandEntry.rgParam4; - cmd.x = commandEntry.frame == MAV_FRAME_MISSION ? commandEntry.rgParam5 : commandEntry.rgParam5 * 1e7; - cmd.y = commandEntry.frame == MAV_FRAME_MISSION ? commandEntry.rgParam6 : commandEntry.rgParam6 * 1e7; - cmd.z = commandEntry.rgParam7; + cmd.param1 = commandEntry.rgParam[0]; + cmd.param2 = commandEntry.rgParam[1]; + cmd.param3 = commandEntry.rgParam[2]; + cmd.param4 = commandEntry.rgParam[3]; + cmd.x = commandEntry.frame == MAV_FRAME_MISSION ? commandEntry.rgParam[4] : commandEntry.rgParam[4] * 1e7; + cmd.y = commandEntry.frame == MAV_FRAME_MISSION ? commandEntry.rgParam[5] : commandEntry.rgParam[5] * 1e7; + cmd.z = commandEntry.rgParam[6]; mavlink_msg_command_int_encode_chan(_mavlink->getSystemId(), _mavlink->getComponentId(), sharedLink->mavlinkChannel(), @@ -3224,13 +2977,13 @@ void Vehicle::_sendMavCommandFromList(int index) cmd.target_component = commandEntry.targetCompId; cmd.command = commandEntry.command; cmd.confirmation = 0; - cmd.param1 = commandEntry.rgParam1; - cmd.param2 = commandEntry.rgParam2; - cmd.param3 = commandEntry.rgParam3; - cmd.param4 = commandEntry.rgParam4; - cmd.param5 = static_cast(commandEntry.rgParam5); - cmd.param6 = static_cast(commandEntry.rgParam6); - cmd.param7 = commandEntry.rgParam7; + cmd.param1 = commandEntry.rgParam[0]; + cmd.param2 = commandEntry.rgParam[1]; + cmd.param3 = commandEntry.rgParam[2]; + cmd.param4 = commandEntry.rgParam[3]; + cmd.param5 = commandEntry.rgParam[4]; + cmd.param6 = commandEntry.rgParam[5]; + cmd.param7 = commandEntry.rgParam[6]; mavlink_msg_command_long_encode_chan(_mavlink->getSystemId(), _mavlink->getComponentId(), sharedLink->mavlinkChannel(), @@ -3291,27 +3044,12 @@ void Vehicle::_handleCommandAck(mavlink_message_t& message) #endif int entryIndex = _findMavCommandListEntryIndex(message.compid, static_cast(ack.command)); + bool commandInList = false; if (entryIndex != -1) { - if (ack.result == MAV_RESULT_IN_PROGRESS) { - MavCommandListEntry_t commandEntry; - if (px4Firmware() && ack.command == MAV_CMD_DO_AUTOTUNE_ENABLE) { - // HacK to support PX4 autotune which does not send final result ack and just sends in progress - commandEntry = _mavCommandList.takeAt(entryIndex); - } else { - commandEntry = _mavCommandList.at(entryIndex); // Command has not completed yet, don't remove - } - - commandEntry.maxTries = 1; // Vehicle responsed to command so don't retry - commandEntry.elapsedTimer.restart(); // We've heard from vehicle, restart elapsed timer for no ack received timeout - - if (commandEntry.ackHandlerInfo.progressHandler) { - (*commandEntry.ackHandlerInfo.progressHandler)(commandEntry.ackHandlerInfo.progressHandlerData, message.compid, ack); - } - } else { - MavCommandListEntry_t commandEntry = _mavCommandList.takeAt(entryIndex); - - if (commandEntry.ackHandlerInfo.resultHandler) { - (*commandEntry.ackHandlerInfo.resultHandler)(commandEntry.ackHandlerInfo.resultHandlerData, message.compid, ack, MavCmdResultCommandResultOnly); + MavCommandListEntry_t commandEntry = _mavCommandList.takeAt(entryIndex); + if (commandEntry.command == ack.command) { + if (commandEntry.resultHandler) { + (*commandEntry.resultHandler)(commandEntry.resultHandlerData, message.compid, static_cast(ack.result), ack.progress, MavCmdResultCommandResultOnly); } else { if (commandEntry.showError) { switch (ack.result) { @@ -3334,8 +3072,11 @@ void Vehicle::_handleCommandAck(mavlink_message_t& message) } emit mavCommandResult(_id, message.compid, ack.command, ack.result, MavCmdResultCommandResultOnly); } + commandInList = true; } - } else { + } + + if (!commandInList) { qCDebug(VehicleLog) << "_handleCommandAck Ack not in list" << rawCommandName; } @@ -3399,13 +3140,10 @@ void Vehicle::requestMessage(RequestMessageResultHandler resultHandler, void* re _waitForMavlinkMessage(_requestMessageWaitForMessageResultHandler, pInfo, pInfo->msgId, 1000); - Vehicle::MavCmdAckHandlerInfo_t handlerInfo = {}; - handlerInfo.resultHandler = _requestMessageCmdResultHandler; - handlerInfo.resultHandlerData = pInfo; - _sendMavCommandWorker(false, // commandInt false, // showError - &handlerInfo, + _requestMessageCmdResultHandler, + pInfo, // resultHandlerData compId, MAV_CMD_REQUEST_MESSAGE, MAV_FRAME_GLOBAL, @@ -3413,13 +3151,13 @@ void Vehicle::requestMessage(RequestMessageResultHandler resultHandler, void* re param1, param2, param3, param4, param5, 0); } -void Vehicle::_requestMessageCmdResultHandler(void* resultHandlerData, int /*compId*/, const mavlink_command_ack_t& ack, MavCmdResultFailureCode_t failureCode) +void Vehicle::_requestMessageCmdResultHandler(void* resultHandlerData, int /*compId*/, MAV_RESULT result, uint8_t progress, MavCmdResultFailureCode_t failureCode) { RequestMessageInfo_t* pInfo = static_cast(resultHandlerData); Vehicle* vehicle = pInfo->vehicle; pInfo->commandAckReceived = true; - if (ack.result != MAV_RESULT_ACCEPTED) { + if (result != MAV_RESULT_ACCEPTED) { mavlink_message_t message; RequestMessageResultHandlerFailureCode_t requestMessageFailureCode; @@ -3436,12 +3174,12 @@ void Vehicle::_requestMessageCmdResultHandler(void* resultHandlerData, int /*com } vehicle->_waitForMavlinkMessageClear(); - (*pInfo->resultHandler)(pInfo->resultHandlerData, static_cast(ack.result), requestMessageFailureCode, message); + (*pInfo->resultHandler)(pInfo->resultHandlerData, result, requestMessageFailureCode, message); return; } if (pInfo->messageReceived) { - (*pInfo->resultHandler)(pInfo->resultHandlerData, static_cast(ack.result), RequestMessageNoFailure, pInfo->message); + (*pInfo->resultHandler)(pInfo->resultHandlerData, result, RequestMessageNoFailure, pInfo->message); delete pInfo; } else { vehicle->_waitForMavlinkMessageTimeoutActive = true; @@ -3510,14 +3248,16 @@ QString Vehicle::firmwareVersionTypeString() const } } -void Vehicle::_rebootCommandResultHandler(void* resultHandlerData, int /*compId*/, const mavlink_command_ack_t& ack, MavCmdResultFailureCode_t failureCode) +void Vehicle::_rebootCommandResultHandler(void* resultHandlerData, int /*compId*/, MAV_RESULT commandResult, uint8_t progress, MavCmdResultFailureCode_t failureCode) { + Q_UNUSED(progress) + Vehicle* vehicle = static_cast(resultHandlerData); - if (ack.result != MAV_RESULT_ACCEPTED) { + if (commandResult != MAV_RESULT_ACCEPTED) { switch (failureCode) { case MavCmdResultCommandResultOnly: - qCDebug(VehicleLog) << QStringLiteral("MAV_CMD_PREFLIGHT_REBOOT_SHUTDOWN error(%1)").arg(ack.result); + qCDebug(VehicleLog) << QStringLiteral("MAV_CMD_PREFLIGHT_REBOOT_SHUTDOWN error(%1)").arg(commandResult); break; case MavCmdResultFailureNoResponseToCommand: qCDebug(VehicleLog) << "MAV_CMD_PREFLIGHT_REBOOT_SHUTDOWN failed: no response from vehicle"; @@ -3534,11 +3274,7 @@ void Vehicle::_rebootCommandResultHandler(void* resultHandlerData, int /*compId* void Vehicle::rebootVehicle() { - Vehicle::MavCmdAckHandlerInfo_t handlerInfo = {}; - handlerInfo.resultHandler = _rebootCommandResultHandler; - handlerInfo.resultHandlerData = this; - - sendMavCommandWithHandler(&handlerInfo, _defaultComponentId, MAV_CMD_PREFLIGHT_REBOOT_SHUTDOWN, 1); + sendMavCommandWithHandler(_rebootCommandResultHandler, this, _defaultComponentId, MAV_CMD_PREFLIGHT_REBOOT_SHUTDOWN, 1); } void Vehicle::startCalibration(Vehicle::CalibrationType calType) @@ -3876,7 +3612,7 @@ void Vehicle::_handleADSBVehicle(const mavlink_message_t& message) mavlink_msg_adsb_vehicle_decode(&message, &adsbVehicleMsg); if ((adsbVehicleMsg.flags & ADSB_FLAGS_VALID_COORDS) && adsbVehicleMsg.tslc <= maxTimeSinceLastSeen) { - ADSBVehicle::ADSBVehicleInfo_t vehicleInfo; + ADSBVehicle::VehicleInfo_t vehicleInfo; vehicleInfo.availableFlags = 0; vehicleInfo.icaoAddress = adsbVehicleMsg.ICAO_address; @@ -3902,17 +3638,6 @@ void Vehicle::_handleADSBVehicle(const mavlink_message_t& message) } } -void Vehicle::_handleRawImuTemp(mavlink_message_t& message) -{ - // This is used by compass calibration - emit mavlinkRawImu(message); - - mavlink_raw_imu_t imuRaw; - mavlink_msg_raw_imu_decode(&message, &imuRaw); - - _imuTempFact.setRawValue(imuRaw.temperature == 0 ? 0 : imuRaw.temperature * 0.01); -} - void Vehicle::_updateDistanceHeadingToHome() { if (coordinate().isValid() && homePosition().isValid()) { @@ -3966,24 +3691,6 @@ void Vehicle::_updateDistanceToGCS() } } -void Vehicle::_updateHomepoint() -{ - const bool setHomeCmdSupported = firmwarePlugin()->supportedMissionCommands(vehicleClass()).contains(MAV_CMD_DO_SET_HOME); - const bool updateHomeActivated = _toolbox->settingsManager()->flyViewSettings()->updateHomePosition()->rawValue().toBool(); - if(setHomeCmdSupported && updateHomeActivated){ - QGeoCoordinate gcsPosition = _toolbox->qgcPositionManager()->gcsPosition(); - if (coordinate().isValid() && gcsPosition.isValid()) { - sendMavCommand(defaultComponentId(), - MAV_CMD_DO_SET_HOME, false, - 0, - 0, 0, 0, - static_cast(gcsPosition.latitude()) , - static_cast(gcsPosition.longitude()), - static_cast(gcsPosition.altitude())); - } - } -} - void Vehicle::_updateHobbsMeter() { _hobbsFact.setRawValue(hobbsMeter()); @@ -4014,6 +3721,21 @@ void Vehicle::_vehicleParamLoaded(bool ready) } } +void Vehicle::_trafficUpdate(bool /*alert*/, QString /*traffic_id*/, QString /*vehicle_id*/, QGeoCoordinate /*location*/, float /*heading*/) +{ +#if 0 + // This is ifdef'ed out for now since this code doesn't mesh with the recent ADSB manager changes. Also airmap isn't in any + // released build. So not going to waste time trying to fix up unused code. + if (_trafficVehicleMap.contains(traffic_id)) { + _trafficVehicleMap[traffic_id]->update(alert, location, heading); + } else { + ADSBVehicle* vehicle = new ADSBVehicle(location, heading, alert, this); + _trafficVehicleMap[traffic_id] = vehicle; + _adsbVehicles.append(vehicle); + } +#endif +} + void Vehicle::_mavlinkMessageStatus(int uasId, uint64_t totalSent, uint64_t totalReceived, uint64_t totalLoss, float lossPercent) { if(uasId == _id) { @@ -4149,125 +3871,8 @@ void Vehicle::flashBootloader() } #endif -void Vehicle::doSetHome(const QGeoCoordinate& coord) -{ - if (coord.isValid()) { - // If for some reason we already did a query and it hasn't arrived yet, disconnect signals and unset current query. TerrainQuery system will - // automatically delete that forgotten query. This could happen if we send 2 do_set_home commands one after another, so usually the latest one - // is the one we would want to arrive to the vehicle, so it is fine to forget about the previous ones in case it could happen. - if (_currentDoSetHomeTerrainAtCoordinateQuery) { - disconnect(_currentDoSetHomeTerrainAtCoordinateQuery, &TerrainAtCoordinateQuery::terrainDataReceived, this, &Vehicle::_doSetHomeTerrainReceived); - _currentDoSetHomeTerrainAtCoordinateQuery = nullptr; - } - // Save the coord for using when our terrain data arrives. If there was a pending terrain query paired with an older coordinate it is safe to - // Override now, as we just disconnected the signal that would trigger the command sending - _doSetHomeCoordinate = coord; - // Now setup and trigger the new terrain query - _currentDoSetHomeTerrainAtCoordinateQuery = new TerrainAtCoordinateQuery(true /* autoDelet */); - connect(_currentDoSetHomeTerrainAtCoordinateQuery, &TerrainAtCoordinateQuery::terrainDataReceived, this, &Vehicle::_doSetHomeTerrainReceived); - QList rgCoord; - rgCoord.append(coord); - _currentDoSetHomeTerrainAtCoordinateQuery->requestData(rgCoord); - } -} - -// This will be called after our query started in doSetHome arrives -void Vehicle::_doSetHomeTerrainReceived(bool success, QList heights) -{ - if (success) { - double terrainAltitude = heights[0]; - // Coord and terrain alt sanity check - if (_doSetHomeCoordinate.isValid() && terrainAltitude <= SET_HOME_TERRAIN_ALT_MAX && terrainAltitude >= SET_HOME_TERRAIN_ALT_MIN) { - sendMavCommand( - defaultComponentId(), - MAV_CMD_DO_SET_HOME, - true, // show error if fails - 0, - 0, - 0, - static_cast(qQNaN()), - _doSetHomeCoordinate.latitude(), - _doSetHomeCoordinate.longitude(), - terrainAltitude); - - } else if (_doSetHomeCoordinate.isValid()) { - qCDebug(VehicleLog) << "_doSetHomeTerrainReceived: internal error, elevation data out of limits "; - } else { - qCDebug(VehicleLog) << "_doSetHomeTerrainReceived: internal error, cached home coordinate is not valid"; - } - } else { - qgcApp()->showAppMessage(tr("Set Home failed, terrain data not available for selected coordinate")); - } - // Clean up - _currentDoSetHomeTerrainAtCoordinateQuery = nullptr; - _doSetHomeCoordinate = QGeoCoordinate(); // So isValid() will no longer return true, for extra safety -} - -void Vehicle::_updateAltAboveTerrain() -{ - // We won't do another query if the previous query was done closer than 2 meters from current position - // or if altitude change has been less than 0.5 meters since then. - const qreal minimumDistanceTraveled = 2; - const float minimumAltitudeChanged = 0.5f; - - // This is not super elegant but it works to limit the amount of queries we do. It seems more than 500ms is not possible to get - // serviced on time. It is not a big deal if it is not serviced on time as terrain queries can manage that just fine, but QGC would - // use resources to service those queries, and it is pointless, so this is a quick workaround to not waste that little computing time - int altitudeAboveTerrQueryMinInterval = 500; - if (_altitudeAboveTerrQueryTimer.elapsed() < altitudeAboveTerrQueryMinInterval) { - // qCDebug(VehicleLog) << "_updateAltAboveTerrain: minimum 500ms interval between queries not reached, returning"; - return; - } - // Sanity check, although it is very unlikely that vehicle coordinate is not valid - if (_coordinate.isValid()) { - // Check for minimum distance and altitude traveled before doing query, to not do a lot of queries of the same data - if (_altitudeAboveTerrLastCoord.isValid() && !qIsNaN(_altitudeAboveTerrLastRelAlt)) { - if (_altitudeAboveTerrLastCoord.distanceTo(_coordinate) < minimumDistanceTraveled && fabs(_altitudeRelativeFact.rawValue().toFloat() - _altitudeAboveTerrLastRelAlt) < minimumAltitudeChanged ) { - return; - } - } - _altitudeAboveTerrLastCoord = _coordinate; - _altitudeAboveTerrLastRelAlt = _altitudeRelativeFact.rawValue().toFloat(); - - // If for some reason we already did a query and it hasn't arrived yet, disconnect signals and unset current query. TerrainQuery system will - // automatically delete that forgotten query. - if (_altitudeAboveTerrTerrainAtCoordinateQuery) { - // qCDebug(VehicleLog) << "_updateAltAboveTerrain: cleaning previous query, no longer needed"; - disconnect(_altitudeAboveTerrTerrainAtCoordinateQuery, &TerrainAtCoordinateQuery::terrainDataReceived, this, &Vehicle::_altitudeAboveTerrainReceived); - _altitudeAboveTerrTerrainAtCoordinateQuery = nullptr; - } - // Now setup and trigger the new terrain query - _altitudeAboveTerrTerrainAtCoordinateQuery = new TerrainAtCoordinateQuery(true /* autoDelet */); - connect(_altitudeAboveTerrTerrainAtCoordinateQuery, &TerrainAtCoordinateQuery::terrainDataReceived, this, &Vehicle::_altitudeAboveTerrainReceived); - QList rgCoord; - rgCoord.append(_coordinate); - _altitudeAboveTerrTerrainAtCoordinateQuery->requestData(rgCoord); - _altitudeAboveTerrQueryTimer.restart(); - } -} - -void Vehicle::_altitudeAboveTerrainReceived(bool success, QList heights) -{ - if (!success) { - qCDebug(VehicleLog) << "_altitudeAboveTerrainReceived: terrain data not available for vehicle coordinate"; - } else { - // Query was succesful, save the data. - double terrainAltitude = heights[0]; - double altitudeAboveTerrain = altitudeAMSL()->rawValue().toDouble() - terrainAltitude; - _altitudeAboveTerrFact.setRawValue(altitudeAboveTerrain); - } - // Clean up - _altitudeAboveTerrTerrainAtCoordinateQuery = nullptr; -} - void Vehicle::gimbalControlValue(double pitch, double yaw) { - if (apmFirmware()) { - // ArduPilot firmware treats this values as centi-degrees - pitch *= 100; - yaw *= 100; - } - //qDebug() << "Gimbal:" << pitch << yaw; sendMavCommand( _defaultComponentId, @@ -4336,42 +3941,6 @@ void Vehicle::_handleObstacleDistance(const mavlink_message_t& message) _objectAvoidance->update(&o); } -void Vehicle::_handleFenceStatus(const mavlink_message_t& message) -{ - mavlink_fence_status_t fenceStatus; - - mavlink_msg_fence_status_decode(&message, &fenceStatus); - - qCDebug(VehicleLog) << "_handleFenceStatus breach_status" << fenceStatus.breach_status; - - static qint64 lastUpdate = 0; - qint64 now = QDateTime::currentMSecsSinceEpoch(); - if (fenceStatus.breach_status == 1) { - if (now - lastUpdate > 3000) { - lastUpdate = now; - QString breachTypeStr; - switch (fenceStatus.breach_type) { - case FENCE_BREACH_NONE: - return; - case FENCE_BREACH_MINALT: - breachTypeStr = tr("minimum altitude"); - break; - case FENCE_BREACH_MAXALT: - breachTypeStr = tr("maximum altitude"); - break; - case FENCE_BREACH_BOUNDARY: - breachTypeStr = tr("boundary"); - break; - default: - break; - } - - qgcApp()->toolbox()->audioOutput()->say(breachTypeStr + " " + tr("fence breached")); - } - } else { - lastUpdate = now; - } -} void Vehicle::updateFlightDistance(double distance) { _flightDistanceFact.setRawValue(_flightDistanceFact.rawValue().toDouble() + distance); @@ -4481,31 +4050,3 @@ void Vehicle::triggerSimpleCamera() 0.0, 0.0, 0.0, 0.0, // param 1-4 unused 1.0); // trigger camera } - -void Vehicle::setGripperAction(GRIPPER_ACTIONS gripperAction) -{ - sendMavCommand( - _defaultComponentId, - MAV_CMD_DO_GRIPPER, - false, // Don't show errors - 0, // Param1: Gripper ID (Always set to 0) - gripperAction, // Param2: Gripper Action - 0, 0, 0, 0, 0); // Param 3 ~ 7 : unused -} - -void Vehicle::sendGripperAction(GRIPPER_OPTIONS gripperOption) -{ - switch(gripperOption) { - case Gripper_release: - setGripperAction(GRIPPER_ACTION_RELEASE); - break; - case Gripper_grab: - setGripperAction(GRIPPER_ACTION_GRAB); - break; - case Invalid_option: - qDebug("unknown function"); - break; - default: - break; - } -} diff --git a/src/Vehicle/Vehicle.h b/src/Vehicle/Vehicle.h index 87bf0b2..31d9c76 100644 --- a/src/Vehicle/Vehicle.h +++ b/src/Vehicle/Vehicle.h @@ -46,11 +46,6 @@ #include "RallyPointManager.h" #include "FTPManager.h" #include "ImageProtocolManager.h" -#include "HealthAndArmingCheckReport.h" -#include "TerrainQuery.h" -#include "StandardModes.h" -#include "VehicleGeneratorFactGroup.h" -#include "VehicleEFIFactGroup.h" class Actuators; class EventHandler; @@ -77,7 +72,10 @@ class LinkInterface; class LinkManager; class InitialConnectStateMachine; class Autotune; -class RemoteIDManager; + +#if defined(QGC_AIRMAP_ENABLED) +class AirspaceVehicleManager; +#endif namespace events { namespace parser { @@ -167,6 +165,7 @@ public: Q_PROPERTY(bool autoDisarm READ autoDisarm NOTIFY autoDisarmChanged) Q_PROPERTY(bool flightModeSetAvailable READ flightModeSetAvailable CONSTANT) Q_PROPERTY(QStringList flightModes READ flightModes NOTIFY flightModesChanged) + Q_PROPERTY(QStringList extraJoystickFlightModes READ extraJoystickFlightModes NOTIFY flightModesChanged) Q_PROPERTY(QString flightMode READ flightMode WRITE setFlightMode NOTIFY flightModeChanged) Q_PROPERTY(TrajectoryPoints* trajectoryPoints MEMBER _trajectoryPoints CONSTANT) Q_PROPERTY(QmlObjectListModel* cameraTriggerPoints READ cameraTriggerPoints CONSTANT) @@ -179,6 +178,7 @@ public: Q_PROPERTY(int newMessageCount READ newMessageCount NOTIFY newMessageCountChanged) Q_PROPERTY(int messageCount READ messageCount NOTIFY messageCountChanged) Q_PROPERTY(QString formattedMessages READ formattedMessages NOTIFY formattedMessagesChanged) + Q_PROPERTY(QString latestError READ latestError NOTIFY latestErrorChanged) Q_PROPERTY(bool joystickEnabled READ joystickEnabled WRITE setJoystickEnabled NOTIFY joystickEnabledChanged) Q_PROPERTY(int flowImageIndex READ flowImageIndex NOTIFY flowImageIndexChanged) Q_PROPERTY(int rcRSSI READ rcRSSI NOTIFY rcRSSIChanged) @@ -247,7 +247,6 @@ public: Q_PROPERTY(qreal gimbalPitch READ gimbalPitch NOTIFY gimbalPitchChanged) Q_PROPERTY(qreal gimbalYaw READ gimbalYaw NOTIFY gimbalYawChanged) Q_PROPERTY(bool gimbalData READ gimbalData NOTIFY gimbalDataChanged) - Q_PROPERTY(bool hasGripper READ hasGripper CONSTANT) Q_PROPERTY(bool isROIEnabled READ isROIEnabled NOTIFY isROIEnabledChanged) Q_PROPERTY(CheckList checkListState READ checkListState WRITE setCheckListState NOTIFY checkListStateChanged) Q_PROPERTY(bool readyToFlyAvailable READ readyToFlyAvailable NOTIFY readyToFlyAvailableChanged) ///< true: readyToFly signalling is available on this vehicle @@ -272,14 +271,11 @@ public: Q_PROPERTY(bool roiModeSupported READ roiModeSupported CONSTANT) ///< Orbit mode is supported by this vehicle Q_PROPERTY(bool takeoffVehicleSupported READ takeoffVehicleSupported CONSTANT) ///< Guided takeoff supported Q_PROPERTY(QString gotoFlightMode READ gotoFlightMode CONSTANT) ///< Flight mode vehicle is in while performing goto - Q_PROPERTY(bool haveMRSpeedLimits READ haveMRSpeedLimits NOTIFY haveMRSpeedLimChanged) - Q_PROPERTY(bool haveFWSpeedLimits READ haveFWSpeedLimits NOTIFY haveFWSpeedLimChanged) Q_PROPERTY(ParameterManager* parameterManager READ parameterManager CONSTANT) Q_PROPERTY(VehicleLinkManager* vehicleLinkManager READ vehicleLinkManager CONSTANT) Q_PROPERTY(VehicleObjectAvoidance* objectAvoidance READ objectAvoidance CONSTANT) Q_PROPERTY(Autotune* autotune READ autotune CONSTANT) - Q_PROPERTY(RemoteIDManager* remoteIDManager READ remoteIDManager CONSTANT) // FactGroup object model properties @@ -295,21 +291,18 @@ public: Q_PROPERTY(Fact* climbRate READ climbRate CONSTANT) Q_PROPERTY(Fact* altitudeRelative READ altitudeRelative CONSTANT) Q_PROPERTY(Fact* altitudeAMSL READ altitudeAMSL CONSTANT) - Q_PROPERTY(Fact* altitudeAboveTerr READ altitudeAboveTerr CONSTANT) Q_PROPERTY(Fact* altitudeTuning READ altitudeTuning CONSTANT) Q_PROPERTY(Fact* altitudeTuningSetpoint READ altitudeTuningSetpoint CONSTANT) Q_PROPERTY(Fact* xTrackError READ xTrackError CONSTANT) Q_PROPERTY(Fact* rangeFinderDist READ rangeFinderDist CONSTANT) Q_PROPERTY(Fact* flightDistance READ flightDistance CONSTANT) Q_PROPERTY(Fact* distanceToHome READ distanceToHome CONSTANT) - Q_PROPERTY(Fact* timeToHome READ timeToHome CONSTANT) Q_PROPERTY(Fact* missionItemIndex READ missionItemIndex CONSTANT) Q_PROPERTY(Fact* headingToNextWP READ headingToNextWP CONSTANT) Q_PROPERTY(Fact* headingToHome READ headingToHome CONSTANT) Q_PROPERTY(Fact* distanceToGCS READ distanceToGCS CONSTANT) Q_PROPERTY(Fact* hobbs READ hobbs CONSTANT) Q_PROPERTY(Fact* throttlePct READ throttlePct CONSTANT) - Q_PROPERTY(Fact* imuTemp READ imuTemp CONSTANT) Q_PROPERTY(FactGroup* gps READ gpsFactGroup CONSTANT) Q_PROPERTY(FactGroup* gps2 READ gps2FactGroup CONSTANT) @@ -325,11 +318,8 @@ public: Q_PROPERTY(FactGroup* localPosition READ localPositionFactGroup CONSTANT) Q_PROPERTY(FactGroup* localPositionSetpoint READ localPositionSetpointFactGroup CONSTANT) Q_PROPERTY(FactGroup* hygrometer READ hygrometerFactGroup CONSTANT) - Q_PROPERTY(FactGroup* generator READ generatorFactGroup CONSTANT) - Q_PROPERTY(FactGroup* efi READ efiFactGroup CONSTANT) Q_PROPERTY(QmlObjectListModel* batteries READ batteries CONSTANT) Q_PROPERTY(Actuators* actuators READ actuators CONSTANT) - Q_PROPERTY(HealthAndArmingCheckReport* healthAndArmingCheckReport READ healthAndArmingCheckReport CONSTANT) Q_PROPERTY(int firmwareMajorVersion READ firmwareMajorVersion NOTIFY firmwareVersionChanged) Q_PROPERTY(int firmwareMinorVersion READ firmwareMinorVersion NOTIFY firmwareVersionChanged) @@ -347,8 +337,7 @@ public: Q_INVOKABLE void resetCounters (); // Called when the message drop-down is invoked to clear current count - Q_INVOKABLE void resetAllMessages(); - Q_INVOKABLE void resetErrorLevelMessages(); + Q_INVOKABLE void resetMessages(); Q_INVOKABLE void virtualTabletJoystickValue(double roll, double pitch, double yaw, double thrust); @@ -364,15 +353,6 @@ public: /// @return The minimum takeoff altitude (relative) for guided takeoff. Q_INVOKABLE double minimumTakeoffAltitude(); - /// @return Maximum horizontal speed multirotor. - Q_INVOKABLE double maximumHorizontalSpeedMultirotor(); - - /// @return Maximum equivalent airspeed. - Q_INVOKABLE double maximumEquivalentAirspeed(); - - /// @return Minumum equivalent airspeed. - Q_INVOKABLE double minimumEquivalentAirspeed(); - /// Command vehicle to move to specified location (altitude is included and relative) Q_INVOKABLE void guidedModeGotoLocation(const QGeoCoordinate& gotoCoord); @@ -381,13 +361,6 @@ public: /// @param pauseVehicle true: pause vehicle prior to altitude change Q_INVOKABLE void guidedModeChangeAltitude(double altitudeChange, bool pauseVehicle); - /// Command vehicle to change groundspeed - /// @param groundspeed Target horizontal groundspeed - Q_INVOKABLE void guidedModeChangeGroundSpeedMetersSecond(double groundspeed); - /// Command vehicle to change equivalent airspeed - /// @param airspeed Target equivalent airspeed - Q_INVOKABLE void guidedModeChangeEquivalentAirspeedMetersSecond(double airspeed); - /// Command vehicle to orbit given center point /// @param centerCoord Orit around this point /// @param radius Distance from vehicle to centerCoord @@ -464,11 +437,6 @@ public: #if !defined(NO_ARDUPILOT_DIALECT) Q_INVOKABLE void flashBootloader(); #endif - /// Set home from flight map coordinate - Q_INVOKABLE void doSetHome(const QGeoCoordinate& coord); - - /// Save the joystick enable setting to the settings group - Q_INVOKABLE void saveJoystickSettings(void); bool isInitialConnectComplete() const; bool guidedModeSupported () const; @@ -477,9 +445,6 @@ public: bool roiModeSupported () const; bool takeoffVehicleSupported () const; QString gotoFlightMode () const; - bool hasGripper () const; - bool haveMRSpeedLimits() const { return _multirotor_speed_limits_available; } - bool haveFWSpeedLimits() const { return _fixed_wing_airspeed_limits_available; } // Property accessors @@ -494,7 +459,6 @@ public: // Property accesors int id() const{ return _id; } - int compId() const{ return _compID; } MAV_AUTOPILOT firmwareType() const { return _firmwareType; } MAV_TYPE vehicleType() const { return _vehicleType; } QGCMAVLink::VehicleClass_t vehicleClass(void) const { return QGCMAVLink::vehicleClass(_vehicleType); } @@ -526,28 +490,11 @@ public: bool flightModeSetAvailable (); QStringList flightModes (); + QStringList extraJoystickFlightModes (); QString flightMode () const; void setFlightMode (const QString& flightMode); bool airship() const; - - /** - * @brief Send MAV_CMD_DO_GRIPPER command to trigger specified action in the vehicle - * - * @param gripperAction Gripper action to trigger - */ - - enum GRIPPER_OPTIONS - { - Gripper_release = GRIPPER_ACTION_RELEASE, - Gripper_grab = GRIPPER_ACTION_GRAB, - Invalid_option = GRIPPER_ACTIONS_ENUM_END, - }; - Q_ENUM(GRIPPER_OPTIONS) - - void setGripperAction(GRIPPER_ACTIONS gripperAction); - Q_INVOKABLE void sendGripperAction(GRIPPER_OPTIONS gripperOption); - bool fixedWing() const; bool multiRotor() const; bool vtol() const; @@ -598,6 +545,7 @@ public: int newMessageCount () const{ return _currentMessageCount; } int messageCount () const{ return _messageCount; } QString formattedMessages (); + QString latestError () { return _latestError; } float latitude () { return static_cast(_coordinate.latitude()); } float longitude () { return static_cast(_coordinate.longitude()); } bool mavPresent () { return _mav != nullptr; } @@ -689,21 +637,18 @@ public: Fact* climbRate () { return &_climbRateFact; } Fact* altitudeRelative () { return &_altitudeRelativeFact; } Fact* altitudeAMSL () { return &_altitudeAMSLFact; } - Fact* altitudeAboveTerr () { return &_altitudeAboveTerrFact; } Fact* altitudeTuning () { return &_altitudeTuningFact; } Fact* altitudeTuningSetpoint () { return &_altitudeTuningSetpointFact; } Fact* xTrackError () { return &_xTrackErrorFact; } Fact* rangeFinderDist () { return &_rangeFinderDistFact; } Fact* flightDistance () { return &_flightDistanceFact; } Fact* distanceToHome () { return &_distanceToHomeFact; } - Fact* timeToHome () { return &_timeToHomeFact; } Fact* missionItemIndex () { return &_missionItemIndexFact; } Fact* headingToNextWP () { return &_headingToNextWPFact; } Fact* headingToHome () { return &_headingToHomeFact; } Fact* distanceToGCS () { return &_distanceToGCSFact; } Fact* hobbs () { return &_hobbsFact; } Fact* throttlePct () { return &_throttlePctFact; } - Fact* imuTemp () { return &_imuTempFact; } FactGroup* gpsFactGroup () { return &_gpsFactGroup; } FactGroup* gps2FactGroup () { return &_gps2FactGroup; } @@ -719,8 +664,6 @@ public: FactGroup* estimatorStatusFactGroup () { return &_estimatorStatusFactGroup; } FactGroup* terrainFactGroup () { return &_terrainFactGroup; } FactGroup* hygrometerFactGroup () { return &_hygrometerFactGroup; } - FactGroup* generatorFactGroup () { return &_generatorFactGroup; } - FactGroup* efiFactGroup () { return &_efiFactGroup; } QmlObjectListModel* batteries () { return &_batteryFactGroupListModel; } MissionManager* missionManager () { return _missionManager; } @@ -733,7 +676,6 @@ public: ComponentInformationManager* compInfoManager () { return _componentInformationManager; } VehicleObjectAvoidance* objectAvoidance () { return _objectAvoidance; } Autotune* autotune () const { return _autotune; } - RemoteIDManager* remoteIDManager () { return _remoteIDManager; } static const int cMaxRcChannels = 18; @@ -771,38 +713,16 @@ public: MavCmdResultFailureDuplicateCommand, ///< Unable to send command since duplicate is already being waited on for response } MavCmdResultFailureCode_t; - /// Callback for sendMavCommandWithHandler which handles MAV_RESULT_IN_PROGRESS acks - /// @param progressHandlerData Opaque data passed in to sendMavCommand call - /// @param ack Received COMMAND_ACK - typedef void (*MavCmdProgressHandler)(void* progressHandlerData, int compId, const mavlink_command_ack_t& ack); - - /// Callback for sendMavCommandWithHandler which handles all acks which are not MAV_RESULT_IN_PROGRESS - /// @param resultHandlerData Opaque data passed in to sendMavCommand call - /// @param ack Received COMMAND_ACK - /// @param failureCode Failure reason. If not MavCmdResultCommandResultOnly only ack.result == MAV_RESULT_FAILED is valid. - typedef void (*MavCmdResultHandler)(void* resultHandlerData, int compId, const mavlink_command_ack_t& ack, MavCmdResultFailureCode_t failureCode); - - // Callback info for sendMavCommandWithHandler - typedef struct MavCmdAckHandlerInfo_s { - MavCmdResultHandler resultHandler; ///> nullptr for no handler - void* resultHandlerData; - MavCmdProgressHandler progressHandler; - void* progressHandlerData; ///> nullptr for no handler - } MavCmdAckHandlerInfo_t; - - /// Sends the command and calls the callback with the result - void sendMavCommandWithHandler( - const MavCmdAckHandlerInfo_t* ackHandlerInfo, ///> nullptr to signale no handlers - int compId, MAV_CMD command, - float param1 = 0.0f, float param2 = 0.0f, float param3 = 0.0f, float param4 = 0.0f, float param5 = 0.0f, float param6 = 0.0f, float param7 = 0.0f); + /// Callback for sendMavCommandWithHandler + /// @param resultHandleData Opaque data passed in to sendMavCommand call + /// @param commandResult Ack result for command send + /// @param failureCode Failure reason + typedef void (*MavCmdResultHandler)(void* resultHandlerData, int compId, MAV_RESULT commandResult, uint8_t progress, MavCmdResultFailureCode_t failureCode); /// Sends the command and calls the callback with the result /// @param resultHandler Callback for result, nullptr for no callback /// @param resultHandleData Opaque data passed through callback - void sendMavCommandIntWithHandler( - const MavCmdAckHandlerInfo_t* ackHandlerInfo, ///> nullptr to signale no handlers - int compId, MAV_CMD command, MAV_FRAME frame, - float param1 = 0.0f, float param2 = 0.0f, float param3 = 0.0f, float param4 = 0.0f, double param5 = 0.0f, double param6 = 0.0f, float param7 = 0.0f); + void sendMavCommandWithHandler(MavCmdResultHandler resultHandler, void* resultHandlerData, int compId, MAV_CMD command, float param1 = 0.0f, float param2 = 0.0f, float param3 = 0.0f, float param4 = 0.0f, float param5 = 0.0f, float param6 = 0.0f, float param7 = 0.0f); typedef enum { RequestMessageNoFailure, @@ -911,10 +831,8 @@ public: double loadProgress () const { return _loadProgress; } - void setEventsMetadata(uint8_t compid, const QString& metadataJsonFileName); - void setActuatorsMetadata(uint8_t compid, const QString& metadataJsonFileName); - - HealthAndArmingCheckReport* healthAndArmingCheckReport() { return &_healthAndArmingCheckReport; } + void setEventsMetadata(uint8_t compid, const QString& metadataJsonFileName, const QString& translationJsonFileName); + void setActuatorsMetadata(uint8_t compid, const QString& metadataJsonFileName, const QString& translationJsonFileName); public slots: void setVtolInFwdFlight (bool vtolInFwdFlight); @@ -946,7 +864,7 @@ signals: void capabilityBitsChanged (uint64_t capabilityBits); void toolIndicatorsChanged (); void modeIndicatorsChanged (); - void textMessageReceived (int uasid, int componentid, int severity, QString text, QString description); + void textMessageReceived (int uasid, int componentid, int severity, QString text); void calibrationEventReceived (int uasid, int componentid, int severity, QSharedPointer event); void checkListStateChanged (); void messagesReceivedChanged (); @@ -957,6 +875,7 @@ signals: void messageCountChanged (); void formattedMessagesChanged (); void newFormattedMessage (QString formattedMessage); + void latestErrorChanged (); void longitudeChanged (); void currentConfigChanged (); void flowImageIndexChanged (); @@ -979,8 +898,6 @@ signals: void readyToFlyChanged (bool readyToFy); void allSensorsHealthyChanged (bool allSensorsHealthy); void requiresGpsFixChanged (); - void haveMRSpeedLimChanged (); - void haveFWSpeedLimChanged (); void firmwareVersionChanged (); void firmwareCustomVersionChanged (); @@ -1050,26 +967,23 @@ private slots: void _updateMissionItemIndex (); void _updateHeadingToNextWP (); void _updateDistanceToGCS (); - void _updateHomepoint (); void _updateHobbsMeter (); void _vehicleParamLoaded (bool ready); void _sendQGCTimeToVehicle (); void _mavlinkMessageStatus (int uasId, uint64_t totalSent, uint64_t totalReceived, uint64_t totalLoss, float lossPercent); + void _trafficUpdate (bool alert, QString traffic_id, QString vehicle_id, QGeoCoordinate location, float heading); void _orbitTelemetryTimeout (); void _updateFlightTime (); void _gotProgressUpdate (float progressValue); - void _doSetHomeTerrainReceived (bool success, QList heights); - void _updateAltAboveTerrain (); - void _altitudeAboveTerrainReceived (bool sucess, QList heights); private: - void _loadJoystickSettings (); - void _activeVehicleChanged (Vehicle* newActiveVehicle); - void _captureJoystick (); + void _joystickChanged (Joystick* joystick); + void _loadSettings (); + void _saveSettings (); + void _startJoystick (bool start); void _handlePing (LinkInterface* link, mavlink_message_t& message); void _handleHomePosition (mavlink_message_t& message); void _handleHeartbeat (mavlink_message_t& message); - void _handleCurrentMode (mavlink_message_t& message); void _handleRadioStatus (mavlink_message_t& message); void _handleRCChannels (mavlink_message_t& message); void _handleBatteryStatus (mavlink_message_t& message); @@ -1080,6 +994,7 @@ private: void _handleGlobalPositionInt (mavlink_message_t& message); void _handleAltitude (mavlink_message_t& message); void _handleVfrHud (mavlink_message_t& message); + void _handleRangefinder (mavlink_message_t& message); void _handleNavControllerOutput (mavlink_message_t& message); void _handleHighLatency (mavlink_message_t& message); void _handleHighLatency2 (mavlink_message_t& message); @@ -1090,16 +1005,13 @@ private: void _handleOrbitExecutionStatus (const mavlink_message_t& message); void _handleGimbalOrientation (const mavlink_message_t& message); void _handleObstacleDistance (const mavlink_message_t& message); - void _handleFenceStatus (const mavlink_message_t& message); void _handleEvent(uint8_t comp_id, std::unique_ptr event); // ArduPilot dialect messages #if !defined(NO_ARDUPILOT_DIALECT) void _handleCameraFeedback (const mavlink_message_t& message); - void _handleRangefinder (mavlink_message_t& message); #endif void _handleCameraImageCaptured (const mavlink_message_t& message); void _handleADSBVehicle (const mavlink_message_t& message); - void _handleRawImuTemp (mavlink_message_t& message); void _missionManagerError (int errorCode, const QString& errorMsg); void _geoFenceManagerError (int errorCode, const QString& errorMsg); void _rallyPointManagerError (int errorCode, const QString& errorMsg); @@ -1121,9 +1033,8 @@ private: void _chunkedStatusTextCompleted (uint8_t compId); void _setMessageInterval (int messageId, int rate); EventHandler& _eventHandler (uint8_t compid); - bool setFlightModeCustom (const QString& flightMode, uint8_t* base_mode, uint32_t* custom_mode); - static void _rebootCommandResultHandler(void* resultHandlerData, int compId, const mavlink_command_ack_t& ack, MavCmdResultFailureCode_t failureCode); + static void _rebootCommandResultHandler(void* resultHandlerData, int compId, MAV_RESULT commandResult, uint8_t progress, MavCmdResultFailureCode_t failureCode); int _id; ///< Mavlink system id int _defaultComponentId; @@ -1157,6 +1068,7 @@ private: int _currentWarningCount = 0; int _currentNormalCount = 0; MessageType_t _currentMessageType = MessageNone; + QString _latestError; int _updateCount = 0; int _rcRSSI = 255; double _rcRSSIstore = 255; @@ -1208,12 +1120,13 @@ private: ComponentInformationManager* _componentInformationManager = nullptr; VehicleObjectAvoidance* _objectAvoidance = nullptr; Autotune* _autotune = nullptr; +#if defined(QGC_AIRMAP_ENABLED) + AirspaceVehicleManager* _airspaceVehicleManager = nullptr; +#endif bool _armed = false; ///< true: vehicle is armed uint8_t _base_mode = 0; ///< base_mode from HEARTBEAT uint32_t _custom_mode = 0; ///< custom_mode from HEARTBEAT - uint32_t _custom_mode_user_intention = 0; ///< custom_mode_user_intention from CURRENT_MODE - bool _has_custom_mode_user_intention = false; /// Used to store a message being sent by sendMessageMultiple typedef struct { @@ -1290,7 +1203,6 @@ private: static const int _orbitTelemetryTimeoutMsecs = 3000; // No telemetry for this amount and orbit will go inactive QMap> _events; ///< One protocol handler for each component ID - HealthAndArmingCheckReport _healthAndArmingCheckReport; MAVLinkStreamConfig _mavlinkStreamConfig; @@ -1334,27 +1246,22 @@ private: mavlink_message_t message; } RequestMessageInfo_t; - static void _requestMessageCmdResultHandler (void* resultHandlerData, int compId, const mavlink_command_ack_t& ack, MavCmdResultFailureCode_t failureCode); + static void _requestMessageCmdResultHandler (void* resultHandlerData, int compId, MAV_RESULT result, uint8_t progress, MavCmdResultFailureCode_t failureCode); static void _requestMessageWaitForMessageResultHandler (void* resultHandlerData, bool noResponsefromVehicle, const mavlink_message_t& message); typedef struct MavCommandListEntry { - int targetCompId = MAV_COMP_ID_AUTOPILOT1; - bool useCommandInt = false; - MAV_CMD command; - MAV_FRAME frame; - float rgParam1 = 0; - float rgParam2 = 0; - float rgParam3 = 0; - float rgParam4 = 0; - double rgParam5 = 0; - double rgParam6 = 0; - float rgParam7 = 0; - bool showError = true; - MavCmdAckHandlerInfo_t ackHandlerInfo; - int maxTries = _mavCommandMaxRetryCount; - int tryCount = 0; - QElapsedTimer elapsedTimer; - int ackTimeoutMSecs = _mavCommandAckTimeoutMSecs; + int targetCompId = MAV_COMP_ID_AUTOPILOT1; + bool useCommandInt = false; + MAV_CMD command; + MAV_FRAME frame; + float rgParam[7] = { 0 }; + bool showError = true; + MavCmdResultHandler resultHandler; + void* resultHandlerData = nullptr; + int maxTries = _mavCommandMaxRetryCount; + int tryCount = 0; + QElapsedTimer elapsedTimer; + int ackTimeoutMSecs = _mavCommandAckTimeoutMSecs; } MavCommandListEntry_t; QList _mavCommandList; @@ -1364,11 +1271,7 @@ private: static const int _mavCommandAckTimeoutMSecs = 3000; static const int _mavCommandAckTimeoutMSecsHighLatency = 120000; - void _sendMavCommandWorker ( - bool commandInt, bool showError, - const MavCmdAckHandlerInfo_t* ackHandlerInfo, ///> nullptr to signale no handlers - int compId, MAV_CMD command, MAV_FRAME frame, - float param1, float param2, float param3, float param4, double param5, double param6, float param7); + void _sendMavCommandWorker (bool commandInt, bool showError, MavCmdResultHandler resultHandler, void* resultHandlerData, int compId, MAV_CMD command, MAV_FRAME frame, float param1, float param2, float param3, float param4, float param5, float param6, float param7); void _sendMavCommandFromList(int index); int _findMavCommandListEntryIndex(int targetCompId, MAV_CMD command); bool _sendMavCommandShouldRetry(MAV_CMD command); @@ -1378,10 +1281,6 @@ private: float _altitudeTuningOffset = qQNaN(); // altitude offset, so the plotted value is around 0 - // these flags are used to determine if the speed change action from fly view should be shown - bool _multirotor_speed_limits_available = false; - bool _fixed_wing_airspeed_limits_available = false; - // FactGroup facts Fact _rollFact; @@ -1396,7 +1295,6 @@ private: Fact _climbRateFact; Fact _altitudeRelativeFact; Fact _altitudeAMSLFact; - Fact _altitudeAboveTerrFact; Fact _altitudeTuningFact; Fact _altitudeTuningSetpointFact; Fact _xTrackErrorFact; @@ -1404,14 +1302,12 @@ private: Fact _flightDistanceFact; Fact _flightTimeFact; Fact _distanceToHomeFact; - Fact _timeToHomeFact; Fact _missionItemIndexFact; Fact _headingToNextWPFact; Fact _headingToHomeFact; Fact _distanceToGCSFact; Fact _hobbsFact; Fact _throttlePctFact; - Fact _imuTempFact; VehicleGPSFactGroup _gpsFactGroup; VehicleGPS2FactGroup _gps2FactGroup; @@ -1426,8 +1322,6 @@ private: VehicleEscStatusFactGroup _escStatusFactGroup; VehicleEstimatorStatusFactGroup _estimatorStatusFactGroup; VehicleHygrometerFactGroup _hygrometerFactGroup; - VehicleGeneratorFactGroup _generatorFactGroup; - VehicleEFIFactGroup _efiFactGroup; TerrainFactGroup _terrainFactGroup; QmlObjectListModel _batteryFactGroupListModel; @@ -1441,8 +1335,6 @@ private: ImageProtocolManager* _imageProtocolManager = nullptr; InitialConnectStateMachine* _initialConnectStateMachine = nullptr; Actuators* _actuators = nullptr; - RemoteIDManager* _remoteIDManager = nullptr; - StandardModes* _standardModes = nullptr; static const char* _rollFactName; static const char* _pitchFactName; @@ -1456,7 +1348,6 @@ private: static const char* _climbRateFactName; static const char* _altitudeRelativeFactName; static const char* _altitudeAMSLFactName; - static const char* _altitudeAboveTerrFactName; static const char* _altitudeTuningFactName; static const char* _altitudeTuningSetpointFactName; static const char* _xTrackErrorFactName; @@ -1464,14 +1355,12 @@ private: static const char* _flightDistanceFactName; static const char* _flightTimeFactName; static const char* _distanceToHomeFactName; - static const char* _timeToHomeFactName; static const char* _missionItemIndexFactName; static const char* _headingToNextWPFactName; static const char* _headingToHomeFactName; static const char* _distanceToGCSFactName; static const char* _hobbsFactName; static const char* _throttlePctFactName; - static const char* _imuTempFactName; static const char* _gpsFactGroupName; static const char* _gps2FactGroupName; @@ -1486,8 +1375,6 @@ private: static const char* _escStatusFactGroupName; static const char* _estimatorStatusFactGroupName; static const char* _hygrometerFactGroupName; - static const char* _generatorFactGroupName; - static const char* _efiFactGroupName; static const char* _terrainFactGroupName; static const int _vehicleUIUpdateRateMSecs = 100; @@ -1495,17 +1382,6 @@ private: // Settings keys static const char* _settingsGroup; static const char* _joystickEnabledSettingsKey; - - // Terrain query members, used to get terrain altitude for doSetHome() - TerrainAtCoordinateQuery* _currentDoSetHomeTerrainAtCoordinateQuery = nullptr; - QGeoCoordinate _doSetHomeCoordinate; - - // Terrain query members, used to get altitude above terrain Fact - QElapsedTimer _altitudeAboveTerrQueryTimer; - TerrainAtCoordinateQuery* _altitudeAboveTerrTerrainAtCoordinateQuery = nullptr; - // We use this to limit above terrain altitude queries based on distance and altitude change - QGeoCoordinate _altitudeAboveTerrLastCoord; - float _altitudeAboveTerrLastRelAlt = qQNaN(); }; Q_DECLARE_METATYPE(Vehicle::MavCmdResultFailureCode_t) diff --git a/src/Vehicle/VehicleClockFactGroup.cc b/src/Vehicle/VehicleClockFactGroup.cc index 210a9c9..c2c8d1a 100644 --- a/src/Vehicle/VehicleClockFactGroup.cc +++ b/src/Vehicle/VehicleClockFactGroup.cc @@ -11,29 +11,24 @@ #include "Vehicle.h" const char* VehicleClockFactGroup::_currentTimeFactName = "currentTime"; -const char* VehicleClockFactGroup::_currentUTCTimeFactName = "currentUTCTime"; const char* VehicleClockFactGroup::_currentDateFactName = "currentDate"; VehicleClockFactGroup::VehicleClockFactGroup(QObject* parent) : FactGroup(1000, ":/json/Vehicle/ClockFact.json", parent) , _currentTimeFact (0, _currentTimeFactName, FactMetaData::valueTypeString) - , _currentUTCTimeFact (0, _currentUTCTimeFactName, FactMetaData::valueTypeString) , _currentDateFact (0, _currentDateFactName, FactMetaData::valueTypeString) { _addFact(&_currentTimeFact, _currentTimeFactName); - _addFact(&_currentUTCTimeFact, _currentUTCTimeFactName); _addFact(&_currentDateFact, _currentDateFactName); // Start out as not available "--.--" _currentTimeFact.setRawValue(std::numeric_limits::quiet_NaN()); - _currentUTCTimeFact.setRawValue(std::numeric_limits::quiet_NaN()); _currentDateFact.setRawValue(std::numeric_limits::quiet_NaN()); } void VehicleClockFactGroup::_updateAllValues() { _currentTimeFact.setRawValue(QTime::currentTime().toString()); - _currentUTCTimeFact.setRawValue(QDateTime::currentDateTimeUtc().time().toString()); _currentDateFact.setRawValue(QDateTime::currentDateTime().toString(QLocale::system().dateFormat(QLocale::ShortFormat))); _setTelemetryAvailable(true); diff --git a/src/Vehicle/VehicleClockFactGroup.h b/src/Vehicle/VehicleClockFactGroup.h index ddeda24..0b886b8 100644 --- a/src/Vehicle/VehicleClockFactGroup.h +++ b/src/Vehicle/VehicleClockFactGroup.h @@ -22,15 +22,12 @@ public: VehicleClockFactGroup(QObject* parent = nullptr); Q_PROPERTY(Fact* currentTime READ currentTime CONSTANT) - Q_PROPERTY(Fact* currentUTCTime READ currentUTCTime CONSTANT) Q_PROPERTY(Fact* currentDate READ currentDate CONSTANT) Fact* currentTime () { return &_currentTimeFact; } - Fact* currentUTCTime () { return &_currentUTCTimeFact; } Fact* currentDate () { return &_currentDateFact; } static const char* _currentTimeFactName; - static const char* _currentUTCTimeFactName; static const char* _currentDateFactName; static const char* _settingsGroup; @@ -40,6 +37,5 @@ private slots: private: Fact _currentTimeFact; - Fact _currentUTCTimeFact; Fact _currentDateFact; }; diff --git a/src/Vehicle/VehicleEFIFactGroup.cc b/src/Vehicle/VehicleEFIFactGroup.cc deleted file mode 100644 index 72d9b48..0000000 --- a/src/Vehicle/VehicleEFIFactGroup.cc +++ /dev/null @@ -1,114 +0,0 @@ -#include "VehicleEFIFactGroup.h" -#include "Vehicle.h" - -const char* VehicleEFIFactGroup::_healthFactName = "health"; -const char* VehicleEFIFactGroup::_ecuIndexFactName = "ecuIndex"; -const char* VehicleEFIFactGroup::_rpmFactName = "rpm"; -const char* VehicleEFIFactGroup::_fuelConsumedFactName = "fuelConsumed"; -const char* VehicleEFIFactGroup::_fuelFlowFactName = "fuelFlow"; -const char* VehicleEFIFactGroup::_engineLoadFactName = "engineLoad"; -const char* VehicleEFIFactGroup::_throttlePosFactName = "throttlePos"; -const char* VehicleEFIFactGroup::_sparkTimeFactName = "sparkTime"; -const char* VehicleEFIFactGroup::_baroPressFactName = "baroPress"; -const char* VehicleEFIFactGroup::_intakePressFactName = "intakePress"; -const char* VehicleEFIFactGroup::_intakeTempFactName = "intakeTemp"; -const char* VehicleEFIFactGroup::_cylinderTempFactName = "cylinderTemp"; -const char* VehicleEFIFactGroup::_ignTimeFactName = "ignTime"; -const char* VehicleEFIFactGroup::_injTimeFactName = "injTime"; -const char* VehicleEFIFactGroup::_exGasTempFactName = "exGasTemp"; -const char* VehicleEFIFactGroup::_throttleOutFactName = "throttleOut"; -const char* VehicleEFIFactGroup::_ptCompFactName = "ptComp"; - - -VehicleEFIFactGroup::VehicleEFIFactGroup(QObject* parent) - : FactGroup(1000, ":/json/Vehicle/EFIFact.json", parent) - , _healthFact (0, _healthFactName, FactMetaData::valueTypeInt8) - , _ecuIndexFact (0, _ecuIndexFactName, FactMetaData::valueTypeFloat) - , _rpmFact (0, _rpmFactName, FactMetaData::valueTypeFloat) - , _fuelConsumedFact (0, _fuelConsumedFactName, FactMetaData::valueTypeFloat) - , _fuelFlowFact (0, _fuelFlowFactName, FactMetaData::valueTypeFloat) - , _engineLoadFact (0, _engineLoadFactName, FactMetaData::valueTypeFloat) - , _throttlePosFact (0, _throttlePosFactName, FactMetaData::valueTypeFloat) - , _sparkTimeFact (0, _sparkTimeFactName, FactMetaData::valueTypeFloat) - , _baroPressFact (0, _baroPressFactName, FactMetaData::valueTypeFloat) - , _intakePressFact (0, _intakePressFactName, FactMetaData::valueTypeFloat) - , _intakeTempFact (0, _intakeTempFactName, FactMetaData::valueTypeFloat) - , _cylinderTempFact (0, _cylinderTempFactName, FactMetaData::valueTypeFloat) - , _ignTimeFact (0, _ignTimeFactName, FactMetaData::valueTypeFloat) - , _injTimeFact (0, _injTimeFactName, FactMetaData::valueTypeFloat) - , _exGasTempFact (0, _exGasTempFactName, FactMetaData::valueTypeFloat) - , _throttleOutFact (0, _throttleOutFactName, FactMetaData::valueTypeFloat) - , _ptCompFact (0, _ptCompFactName, FactMetaData::valueTypeFloat) -{ - _addFact(&_healthFact, _healthFactName); - _addFact(&_ecuIndexFact, _ecuIndexFactName); - _addFact(&_rpmFact, _rpmFactName); - _addFact(&_fuelConsumedFact, _fuelConsumedFactName); - _addFact(&_fuelFlowFact, _fuelFlowFactName); - _addFact(&_engineLoadFact, _engineLoadFactName); - _addFact(&_sparkTimeFact, _sparkTimeFactName); - _addFact(&_throttlePosFact, _throttlePosFactName); - _addFact(&_baroPressFact, _baroPressFactName); - _addFact(&_intakePressFact, _intakePressFactName); - _addFact(&_intakeTempFact, _intakeTempFactName); - _addFact(&_cylinderTempFact, _cylinderTempFactName); - _addFact(&_ignTimeFact, _ignTimeFactName); - _addFact(&_exGasTempFact, _exGasTempFactName); - _addFact(&_injTimeFact, _injTimeFactName); - _addFact(&_throttleOutFact, _throttleOutFactName); - _addFact(&_ptCompFact, _ptCompFactName); - - // Start out as not available "--.--" - _healthFact.setRawValue(qQNaN()); - _ecuIndexFact.setRawValue(qQNaN()); - _rpmFact.setRawValue(qQNaN()); - _fuelConsumedFact.setRawValue(qQNaN()); - _fuelFlowFact.setRawValue(qQNaN()); - _engineLoadFact.setRawValue(qQNaN()); - _sparkTimeFact.setRawValue(qQNaN()); - _throttlePosFact.setRawValue(qQNaN()); - _baroPressFact.setRawValue(qQNaN()); - _intakePressFact.setRawValue(qQNaN()); - _intakeTempFact.setRawValue(qQNaN()); - _cylinderTempFact.setRawValue(qQNaN()); - _ignTimeFact.setRawValue(qQNaN()); - _exGasTempFact.setRawValue(qQNaN()); - _injTimeFact.setRawValue(qQNaN()); - _throttleOutFact.setRawValue(qQNaN()); - _ptCompFact.setRawValue(qQNaN()); -} - -void VehicleEFIFactGroup::handleMessage(Vehicle* /* vehicle */, mavlink_message_t& message) -{ - switch (message.msgid) { - case MAVLINK_MSG_ID_EFI_STATUS: - _handleEFIStatus(message); - break; - default: - break; - } -} - -void VehicleEFIFactGroup::_handleEFIStatus(mavlink_message_t& message) -{ - mavlink_efi_status_t efi; - mavlink_msg_efi_status_decode(&message, &efi); - - health()->setRawValue (efi.health == INT8_MAX ? qQNaN() : efi.health); - ecuIndex()->setRawValue (efi.ecu_index); - rpm()->setRawValue (efi.rpm); - fuelConsumed()->setRawValue (efi.fuel_consumed); - fuelFlow()->setRawValue (efi.fuel_flow); - engineLoad()->setRawValue (efi.engine_load); - throttlePos()->setRawValue (efi.throttle_position); - sparkTime()->setRawValue (efi.spark_dwell_time); - baroPress()->setRawValue (efi.barometric_pressure); - intakePress()->setRawValue (efi.intake_manifold_pressure); - intakeTemp()->setRawValue (efi.intake_manifold_temperature); - cylinderTemp()->setRawValue (efi.cylinder_head_temperature); - ignTime()->setRawValue (efi.ignition_timing); - injTime()->setRawValue (efi.injection_time); - exGasTemp()->setRawValue (efi.exhaust_gas_temperature); - throttleOut()->setRawValue (efi.throttle_out); - ptComp()->setRawValue (efi.pt_compensation); -} diff --git a/src/Vehicle/VehicleEFIFactGroup.h b/src/Vehicle/VehicleEFIFactGroup.h deleted file mode 100644 index 879a7a9..0000000 --- a/src/Vehicle/VehicleEFIFactGroup.h +++ /dev/null @@ -1,94 +0,0 @@ -#pragma once - -#include "FactGroup.h" -#include "QGCMAVLink.h" - -class VehicleEFIFactGroup : public FactGroup -{ - Q_OBJECT - -public: - VehicleEFIFactGroup(QObject* parent = nullptr); - - Q_PROPERTY(Fact* health READ health CONSTANT) - Q_PROPERTY(Fact* ecuIndex READ ecuIndex CONSTANT) - Q_PROPERTY(Fact* rpm READ rpm CONSTANT) - Q_PROPERTY(Fact* fuelConsumed READ fuelConsumed CONSTANT) - Q_PROPERTY(Fact* fuelFlow READ fuelFlow CONSTANT) - Q_PROPERTY(Fact* engineLoad READ engineLoad CONSTANT) - Q_PROPERTY(Fact* throttlePos READ throttlePos CONSTANT) - Q_PROPERTY(Fact* sparkTime READ sparkTime CONSTANT) - Q_PROPERTY(Fact* baroPress READ baroPress CONSTANT) - Q_PROPERTY(Fact* intakePress READ intakePress CONSTANT) - Q_PROPERTY(Fact* intakeTemp READ intakeTemp CONSTANT) - Q_PROPERTY(Fact* cylinderTemp READ cylinderTemp CONSTANT) - Q_PROPERTY(Fact* ignTime READ ignTime CONSTANT) - Q_PROPERTY(Fact* injTime READ injTime CONSTANT) - Q_PROPERTY(Fact* exGasTemp READ exGasTemp CONSTANT) - Q_PROPERTY(Fact* throttleOut READ throttleOut CONSTANT) - Q_PROPERTY(Fact* ptComp READ ptComp CONSTANT) - Q_PROPERTY(Fact* ignVoltage READ ignVoltage CONSTANT) - - Fact* health () { return &_healthFact; } - Fact* ecuIndex () { return &_ecuIndexFact; } - Fact* rpm () { return &_rpmFact; } - Fact* fuelConsumed () { return &_fuelConsumedFact; } - Fact* fuelFlow () { return &_fuelFlowFact; } - Fact* engineLoad () { return &_engineLoadFact; } - Fact* throttlePos () { return &_throttlePosFact; } - Fact* sparkTime () { return &_sparkTimeFact; } - Fact* baroPress () { return &_baroPressFact; } - Fact* intakePress () { return &_intakePressFact; } - Fact* intakeTemp () { return &_intakeTempFact; } - Fact* cylinderTemp () { return &_cylinderTempFact; } - Fact* ignTime () { return &_ignTimeFact; } - Fact* injTime () { return &_injTimeFact; } - Fact* exGasTemp () { return &_exGasTempFact; } - Fact* throttleOut () { return &_throttleOutFact; } - Fact* ptComp () { return &_ptCompFact; } - Fact* ignVoltage () { return &_ignVoltageFact; } - - // Overrides from FactGroup - virtual void handleMessage(Vehicle* vehicle, mavlink_message_t& message) override; - - static const char* _healthFactName; - static const char* _ecuIndexFactName; - static const char* _rpmFactName; - static const char* _fuelConsumedFactName; - static const char* _fuelFlowFactName; - static const char* _engineLoadFactName; - static const char* _throttlePosFactName; - static const char* _sparkTimeFactName; - static const char* _baroPressFactName; - static const char* _intakePressFactName; - static const char* _intakeTempFactName; - static const char* _cylinderTempFactName; - static const char* _ignTimeFactName; - static const char* _injTimeFactName; - static const char* _exGasTempFactName; - static const char* _throttleOutFactName; - static const char* _ptCompFactName; - static const char* _ignVoltageFactName; - -protected: - void _handleEFIStatus(mavlink_message_t& message); - - Fact _healthFact; - Fact _ecuIndexFact; - Fact _rpmFact; - Fact _fuelConsumedFact; - Fact _fuelFlowFact; - Fact _engineLoadFact; - Fact _throttlePosFact; - Fact _sparkTimeFact; - Fact _baroPressFact; - Fact _intakePressFact; - Fact _intakeTempFact; - Fact _cylinderTempFact; - Fact _ignTimeFact; - Fact _injTimeFact; - Fact _exGasTempFact; - Fact _throttleOutFact; - Fact _ptCompFact; - Fact _ignVoltageFact; -}; diff --git a/src/Vehicle/VehicleFact.json b/src/Vehicle/VehicleFact.json index 5336b00..f6688d3 100644 --- a/src/Vehicle/VehicleFact.json +++ b/src/Vehicle/VehicleFact.json @@ -80,13 +80,6 @@ "decimalPlaces": 1, "units": "m" }, -{ - "name": "altitudeAboveTerr", - "shortDesc": "Alt (Above Terrain)", - "type": "double", - "decimalPlaces": 1, - "units": "m" -}, { "name": "flightDistance", "shortDesc": "Flight Distance", @@ -101,13 +94,6 @@ "decimalPlaces": 1, "units": "m" }, -{ - "name": "timeToHome", - "shortDesc": "Time to Home", - "type": "double", - "decimalPlaces": 1, - "units": "s" -}, { "name": "headingToHome", "shortDesc": "Heading to Home", @@ -150,12 +136,6 @@ "shortDesc": "Throttle %", "type": "uint16", "units": "%" -}, -{ - "name": "imuTemp", - "shortDesc": "Imu temperature", - "type": "int16", - "units": "°C" } ] } diff --git a/src/Vehicle/VehicleGeneratorFactGroup.cc b/src/Vehicle/VehicleGeneratorFactGroup.cc deleted file mode 100644 index 9cfbd7d..0000000 --- a/src/Vehicle/VehicleGeneratorFactGroup.cc +++ /dev/null @@ -1,110 +0,0 @@ -#include "VehicleGeneratorFactGroup.h" -#include "Vehicle.h" -#include - -const char* VehicleGeneratorFactGroup::_statusFactName = "status"; -const char* VehicleGeneratorFactGroup::_genSpeedFactName = "genSpeed"; -const char* VehicleGeneratorFactGroup::_batteryCurrentFactName = "batteryCurrent"; -const char* VehicleGeneratorFactGroup::_loadCurrentFactName = "loadCurrent"; -const char* VehicleGeneratorFactGroup::_powerGeneratedFactName = "powerGenerated"; -const char* VehicleGeneratorFactGroup::_busVoltageFactName = "busVoltage"; -const char* VehicleGeneratorFactGroup::_rectifierTempFactName = "rectifierTemp"; -const char* VehicleGeneratorFactGroup::_batCurrentSetpointFactName = "batCurrentSetpoint"; -const char* VehicleGeneratorFactGroup::_genTempFactName = "genTemp"; -const char* VehicleGeneratorFactGroup::_runtimeFactName = "runtime"; -const char* VehicleGeneratorFactGroup::_timeMaintenanceFactName = "timeMaintenance"; - -VehicleGeneratorFactGroup::VehicleGeneratorFactGroup(QObject* parent) - : FactGroup(1000, ":/json/Vehicle/GeneratorFact.json", parent) - , _statusFact (0, _statusFactName, FactMetaData::valueTypeUint64) - , _genSpeedFact (0, _genSpeedFactName, FactMetaData::valueTypeUint16) - , _batteryCurrentFact (0, _batteryCurrentFactName, FactMetaData::valueTypeFloat) - , _loadCurrentFact (0, _loadCurrentFactName, FactMetaData::valueTypeFloat) - , _powerGeneratedFact (0, _powerGeneratedFactName, FactMetaData::valueTypeFloat) - , _busVoltageFact (0, _busVoltageFactName, FactMetaData::valueTypeFloat) - , _rectifierTempFact (0, _rectifierTempFactName, FactMetaData::valueTypeInt16) - , _batCurrentSetpointFact (0, _batCurrentSetpointFactName, FactMetaData::valueTypeFloat) - , _genTempFact (0, _genTempFactName, FactMetaData::valueTypeInt16) - , _runtimeFact (0, _runtimeFactName, FactMetaData::valueTypeUint32) - , _timeMaintenanceFact (0, _timeMaintenanceFactName, FactMetaData::valueTypeInt32) -{ - _addFact(&_statusFact, _statusFactName); - _addFact(&_genSpeedFact, _genSpeedFactName); - _addFact(&_batteryCurrentFact, _batteryCurrentFactName); - _addFact(&_loadCurrentFact, _loadCurrentFactName); - _addFact(&_powerGeneratedFact, _powerGeneratedFactName); - _addFact(&_busVoltageFact, _busVoltageFactName); - _addFact(&_batCurrentSetpointFact, _batCurrentSetpointFactName); - _addFact(&_rectifierTempFact, _rectifierTempFactName); - _addFact(&_genTempFact, _genTempFactName); - _addFact(&_runtimeFact, _runtimeFactName); - _addFact(&_timeMaintenanceFact, _timeMaintenanceFactName); - - // Start out as not available "--.--" - _statusFact.setRawValue(qQNaN()); - _genSpeedFact.setRawValue(qQNaN()); - _batteryCurrentFact.setRawValue(qQNaN()); - _loadCurrentFact.setRawValue(qQNaN()); - _powerGeneratedFact.setRawValue(qQNaN()); - _busVoltageFact.setRawValue(qQNaN()); - _batCurrentSetpointFact.setRawValue(qQNaN()); - _rectifierTempFact.setRawValue(qQNaN()); - _genTempFact.setRawValue(qQNaN()); - _runtimeFact.setRawValue(qQNaN()); - _timeMaintenanceFact.setRawValue(qQNaN()); -} - -void VehicleGeneratorFactGroup::handleMessage(Vehicle* /* vehicle */, mavlink_message_t& message) -{ - switch (message.msgid) { - case MAVLINK_MSG_ID_GENERATOR_STATUS: - _handleGeneratorStatus(message); - break; - default: - break; - } -} - -void VehicleGeneratorFactGroup::_handleGeneratorStatus(mavlink_message_t& message) -{ - mavlink_generator_status_t generator; - mavlink_msg_generator_status_decode(&message, &generator); - - status()->setRawValue (generator.status == UINT16_MAX ? qQNaN() : generator.status); - _updateGeneratorFlags(); - genSpeed()->setRawValue (generator.generator_speed == UINT16_MAX ? qQNaN() : generator.generator_speed); - batteryCurrent()->setRawValue (generator.battery_current); - loadCurrent()->setRawValue (generator.load_current); - powerGenerated()->setRawValue (generator.power_generated); - busVoltage()->setRawValue (generator.bus_voltage); - rectifierTemp()->setRawValue (generator.rectifier_temperature == INT16_MAX ? qQNaN() : generator.rectifier_temperature); - batCurrentSetpoint()->setRawValue (generator.bat_current_setpoint); - genTemp()->setRawValue (generator.generator_temperature == INT16_MAX ? qQNaN() : generator.generator_temperature); - runtime()->setRawValue (generator.runtime == UINT32_MAX ? qQNaN() : generator.runtime); - timeMaintenance()->setRawValue (generator.time_until_maintenance == INT32_MAX ? qQNaN() : generator.time_until_maintenance); -} - -void VehicleGeneratorFactGroup::_updateGeneratorFlags() { - - // Check the status received, and convert it to a List with the state of each flag - int statusFlag = _statusFact.rawValue().toInt(); - - // No need to update the list if we have the same flags - if ( statusFlag == _prevFlag) { - return; - } - - _prevFlag = statusFlag; - _flagsListGenerator.clear(); - - std::bitset<23> bitsetFlags(statusFlag); - - for (size_t i=0; i + * (c) 2009-2020 QGROUNDCONTROL PROJECT * * QGroundControl is licensed according to the terms in the file * COPYING.md in the root of the source code directory. @@ -46,7 +46,7 @@ void VehicleHygrometerFactGroup::_handleHygrometerSensor(mavlink_message_t& mess mavlink_hygrometer_sensor_t hygrometer; mavlink_msg_hygrometer_sensor_decode(&message, &hygrometer); - _hygroTempFact.setRawValue(hygrometer.temperature/100.f); + _hygroTempFact.setRawValue(hygrometer.temperature); _hygroHumiFact.setRawValue(hygrometer.humidity); _hygroIDFact.setRawValue(hygrometer.id); } diff --git a/src/VehicleSetup/FirmwareUpgrade.qml b/src/VehicleSetup/FirmwareUpgrade.qml index 5d4611d..35ff42a 100644 --- a/src/VehicleSetup/FirmwareUpgrade.qml +++ b/src/VehicleSetup/FirmwareUpgrade.qml @@ -66,6 +66,12 @@ SetupPage { property bool _singleFirmwareMode: QGroundControl.corePlugin.options.firmwareUpgradeSingleURL.length != 0 ///< true: running in special single firmware download mode + function cancelFlash() { + statusTextArea.append(highlightPrefix + qsTr("Upgrade cancelled") + highlightSuffix) + statusTextArea.append("------------------------------------------") + controller.cancel() + } + function setupPageCompleted() { controller.startBoardSearch() _defaultFirmwareIsPX4 = _defaultFirmwareFact.rawValue === _defaultFimwareTypePX4 // we don't want this to be bound and change as radios are selected @@ -130,17 +136,15 @@ SetupPage { } } - onShowFirmwareSelectDlg: firmwareSelectDialogComponent.createObject(mainWindow).open() + onShowFirmwareSelectDlg: mainWindow.showComponentDialog(firmwareSelectDialogComponent, title, mainWindow.showDialogDefaultWidth, StandardButton.Ok | StandardButton.Cancel) onError: statusTextArea.append(flashFailText) } Component { id: firmwareSelectDialogComponent - QGCPopupDialog { - id: firmwareSelectDialog - title: qsTr("Firmware Setup") - buttons: StandardButton.Ok | StandardButton.Cancel + QGCViewDialog { + id: pixhawkFirmwareSelectDialog property bool showFirmwareTypeSelection: _advanced.checked property bool px4Flow: controller.px4FlowBoard @@ -185,7 +189,7 @@ SetupPage { onError: reject() } - onAccepted: { + function accept() { if (_singleFirmwareMode) { controller.flashSingleFirmwareMode(controller.selectedFirmwareBuildType) } else { @@ -204,23 +208,14 @@ SetupPage { } else { if (controller.apmFirmwareNames.length === 0) { // Not ready yet, or no firmware available - mainWindow.showMessageDialog(firmwareSelectDialog.title, qsTr("Either firmware list is still downloading, or no firmware is available for current selection.")) - firmwareSelectDialog.preventClose = true return } - if (ardupilotFirmwareSelectionCombo.currentIndex == -1) { - mainWindow.showMessageDialog(firmwareSelectDialog.title, qsTr("You must choose a board type.")) - firmwareSelectDialog.preventClose = true - return - } - var firmwareUrl = controller.apmFirmwareUrls[ardupilotFirmwareSelectionCombo.currentIndex] if (firmwareUrl == "") { - mainWindow.showMessageDialog(firmwareSelectDialog.title, qsTr("No firmware was found for the current selection.")) - firmwareSelectDialog.preventClose = true return } controller.flashFirmwareUrl(controller.apmFirmwareUrls[ardupilotFirmwareSelectionCombo.currentIndex]) + hideDialog() return } } @@ -231,14 +226,13 @@ SetupPage { } else { controller.flash(stack, firmwareBuildType, vehicleType) } + hideDialog() } } function reject() { - statusTextArea.append(highlightPrefix + qsTr("Upgrade cancelled") + highlightSuffix) - statusTextArea.append("------------------------------------------") - controller.cancel() - close() + hideDialog() + cancelFlash() } ListModel { @@ -301,166 +295,212 @@ SetupPage { } } - ColumnLayout { - width: Math.max(ScreenTools.defaultFontPixelWidth * 40, firmwareRadiosColumn.width) - spacing: globals.defaultTextHeight / 2 - - QGCLabel { - Layout.fillWidth: true - wrapMode: Text.WordWrap - text: (_singleFirmwareMode || !QGroundControl.apmFirmwareSupported) ? _singleFirmwareLabel : (px4Flow ? _px4FlowLabel : _pixhawkLabel) - - readonly property string _px4FlowLabel: qsTr("Detected PX4 Flow board. The firmware you use on the PX4 Flow must match the AutoPilot firmware type you are using on the vehicle:") - readonly property string _pixhawkLabel: qsTr("Detected Pixhawk board. You can select from the following flight stacks:") - readonly property string _singleFirmwareLabel: qsTr("Press Ok to upgrade your vehicle.") - } + QGCFlickable { + anchors.fill: parent + contentHeight: mainColumn.height Column { - id: firmwareRadiosColumn - spacing: 0 + id: mainColumn + anchors.left: parent.left + anchors.right: parent.right + spacing: globals.defaultTextHeight - visible: !_singleFirmwareMode && !px4Flow && QGroundControl.apmFirmwareSupported + QGCLabel { + width: parent.width + wrapMode: Text.WordWrap + text: (_singleFirmwareMode || !QGroundControl.apmFirmwareSupported) ? _singleFirmwareLabel : (px4Flow ? _px4FlowLabel : _pixhawkLabel) - Component.onCompleted: { - if(!QGroundControl.apmFirmwareSupported) { - _defaultFirmwareFact.rawValue = _defaultFimwareTypePX4 - firmwareVersionChanged(firmwareBuildTypeList) + readonly property string _px4FlowLabel: qsTr("Detected PX4 Flow board. The firmware you use on the PX4 Flow must match the AutoPilot firmware type you are using on the vehicle:") + readonly property string _pixhawkLabel: qsTr("Detected Pixhawk board. You can select from the following flight stacks:") + readonly property string _singleFirmwareLabel: qsTr("Press Ok to upgrade your vehicle.") + } + + QGCLabel { text: qsTr("Flight Stack"); visible: QGroundControl.apmFirmwareSupported } + + Column { + + Component.onCompleted: { + if(!QGroundControl.apmFirmwareSupported) { + _defaultFirmwareFact.rawValue = _defaultFimwareTypePX4 + firmwareVersionChanged(firmwareBuildTypeList) + } + } + + QGCRadioButton { + id: px4FlightStackRadio + text: qsTr("PX4 Pro ") + font.bold: _defaultFirmwareIsPX4 + checked: _defaultFirmwareIsPX4 + visible: !_singleFirmwareMode && !px4Flow && QGroundControl.apmFirmwareSupported + + onClicked: { + _defaultFirmwareFact.rawValue = _defaultFimwareTypePX4 + firmwareVersionChanged(firmwareBuildTypeList) + } + } + + QGCRadioButton { + id: apmFlightStack + text: qsTr("ArduPilot") + font.bold: !_defaultFirmwareIsPX4 + checked: !_defaultFirmwareIsPX4 + visible: !_singleFirmwareMode && !px4Flow && QGroundControl.apmFirmwareSupported + + onClicked: { + _defaultFirmwareFact.rawValue = _defaultFimwareTypeAPM + firmwareVersionChanged(firmwareBuildTypeList) + } } } - QGCRadioButton { - id: px4FlightStackRadio - text: qsTr("PX4 Pro ") - font.bold: _defaultFirmwareIsPX4 - checked: _defaultFirmwareIsPX4 + FactComboBox { + anchors.left: parent.left + anchors.right: parent.right + visible: !px4Flow && apmFlightStack.checked + fact: _firmwareUpgradeSettings.apmChibiOS + indexModel: false + } - onClicked: { - _defaultFirmwareFact.rawValue = _defaultFimwareTypePX4 - firmwareVersionChanged(firmwareBuildTypeList) + FactComboBox { + id: apmVehicleTypeCombo + anchors.left: parent.left + anchors.right: parent.right + visible: !px4Flow && apmFlightStack.checked + fact: _firmwareUpgradeSettings.apmVehicleType + indexModel: false + } + + QGCComboBox { + id: ardupilotFirmwareSelectionCombo + anchors.left: parent.left + anchors.right: parent.right + visible: !px4Flow && apmFlightStack.checked && !controller.downloadingFirmwareList && controller.apmFirmwareNames.length !== 0 + model: controller.apmFirmwareNames + onModelChanged: currentIndex = controller.apmFirmwareNamesBestIndex + } + + QGCLabel { + anchors.left: parent.left + anchors.right: parent.right + wrapMode: Text.WordWrap + text: qsTr("Downloading list of available firmwares...") + visible: controller.downloadingFirmwareList + } + + QGCLabel { + anchors.left: parent.left + anchors.right: parent.right + wrapMode: Text.WordWrap + text: qsTr("No Firmware Available") + visible: !controller.downloadingFirmwareList && (QGroundControl.apmFirmwareSupported && controller.apmFirmwareNames.length === 0) + } + + QGCComboBox { + id: px4FlowTypeSelectionCombo + anchors.left: parent.left + anchors.right: parent.right + visible: px4Flow + model: px4FlowFirmwareList + textRole: "text" + currentIndex: _defaultFirmwareIsPX4 ? 0 : 1 + } + + Row { + width: parent.width + spacing: ScreenTools.defaultFontPixelWidth / 2 + visible: !px4Flow + + Rectangle { + height: 1 + width: ScreenTools.defaultFontPixelWidth * 5 + color: qgcPal.text + anchors.verticalCenter: _advanced.verticalCenter + } + + QGCCheckBox { + id: _advanced + text: qsTr("Advanced settings") + checked: px4Flow ? true : false + + onClicked: { + firmwareBuildTypeCombo.currentIndex = 0 + firmwareWarningMessageVisible = false + updatePX4VersionDisplay() + } + } + + Rectangle { + height: 1 + width: ScreenTools.defaultFontPixelWidth * 5 + color: qgcPal.text + anchors.verticalCenter: _advanced.verticalCenter } } - QGCRadioButton { - id: apmFlightStack - text: qsTr("ArduPilot") - font.bold: !_defaultFirmwareIsPX4 - checked: !_defaultFirmwareIsPX4 + QGCLabel { + width: parent.width + wrapMode: Text.WordWrap + visible: showFirmwareTypeSelection + text: _singleFirmwareMode ? qsTr("Select the standard version or one from the file system (previously downloaded):") : + (px4Flow ? qsTr("Select which version of the firmware you would like to install:") : + qsTr("Select which version of the above flight stack you would like to install:")) + } - onClicked: { - _defaultFirmwareFact.rawValue = _defaultFimwareTypeAPM - firmwareVersionChanged(firmwareBuildTypeList) + QGCComboBox { + id: firmwareBuildTypeCombo + anchors.left: parent.left + anchors.right: parent.right + visible: showFirmwareTypeSelection + textRole: "text" + model: _singleFirmwareMode ? singleFirmwareModeTypeList : (px4Flow ? px4FlowTypeList : firmwareBuildTypeList) + + onActivated: { + controller.selectedFirmwareBuildType = model.get(index).firmwareType + if (model.get(index).firmwareType === FirmwareUpgradeController.BetaFirmware) { + firmwareWarningMessageVisible = true + firmwareVersionWarningLabel.text = qsTr("WARNING: BETA FIRMWARE. ") + + qsTr("This firmware version is ONLY intended for beta testers. ") + + qsTr("Although it has received FLIGHT TESTING, it represents actively changed code. ") + + qsTr("Do NOT use for normal operation.") + } else if (model.get(index).firmwareType === FirmwareUpgradeController.DeveloperFirmware) { + firmwareWarningMessageVisible = true + firmwareVersionWarningLabel.text = qsTr("WARNING: CONTINUOUS BUILD FIRMWARE. ") + + qsTr("This firmware has NOT BEEN FLIGHT TESTED. ") + + qsTr("It is only intended for DEVELOPERS. ") + + qsTr("Run bench tests without props first. ") + + qsTr("Do NOT fly this without additional safety precautions. ") + + qsTr("Follow the forums actively when using it.") + } else { + firmwareWarningMessageVisible = false + } + updatePX4VersionDisplay() } } - } - FactComboBox { - Layout.fillWidth: true - visible: !px4Flow && apmFlightStack.checked - fact: _firmwareUpgradeSettings.apmChibiOS - indexModel: false - } - - FactComboBox { - id: apmVehicleTypeCombo - Layout.fillWidth: true - visible: !px4Flow && apmFlightStack.checked - fact: _firmwareUpgradeSettings.apmVehicleType - indexModel: false - } - - QGCComboBox { - id: ardupilotFirmwareSelectionCombo - Layout.fillWidth: true - visible: !px4Flow && apmFlightStack.checked && !controller.downloadingFirmwareList && controller.apmFirmwareNames.length !== 0 - model: controller.apmFirmwareNames - onModelChanged: currentIndex = controller.apmFirmwareNamesBestIndex - } - - QGCLabel { - Layout.fillWidth: true - wrapMode: Text.WordWrap - text: qsTr("Downloading list of available firmwares...") - visible: controller.downloadingFirmwareList - } - - QGCLabel { - Layout.fillWidth: true - wrapMode: Text.WordWrap - text: qsTr("No Firmware Available") - visible: !controller.downloadingFirmwareList && (QGroundControl.apmFirmwareSupported && controller.apmFirmwareNames.length === 0) - } - - QGCComboBox { - id: px4FlowTypeSelectionCombo - Layout.fillWidth: true - visible: px4Flow - model: px4FlowFirmwareList - textRole: "text" - currentIndex: _defaultFirmwareIsPX4 ? 0 : 1 - } - - QGCCheckBox { - id: _advanced - text: qsTr("Advanced settings") - checked: px4Flow ? true : false - visible: !px4Flow - - onClicked: { - firmwareBuildTypeCombo.currentIndex = 0 - firmwareWarningMessageVisible = false - updatePX4VersionDisplay() + QGCLabel { + id: firmwareVersionWarningLabel + width: parent.width + wrapMode: Text.WordWrap + visible: firmwareWarningMessageVisible } - } - - QGCLabel { - Layout.fillWidth: true - wrapMode: Text.WordWrap - visible: showFirmwareTypeSelection - text: _singleFirmwareMode ? qsTr("Select the standard version or one from the file system (previously downloaded):") : - (px4Flow ? qsTr("Select which version of the firmware you would like to install:") : - qsTr("Select which version of the above flight stack you would like to install:")) - } - - QGCComboBox { - id: firmwareBuildTypeCombo - Layout.fillWidth: true - visible: showFirmwareTypeSelection - textRole: "text" - model: _singleFirmwareMode ? singleFirmwareModeTypeList : (px4Flow ? px4FlowTypeList : firmwareBuildTypeList) - - onActivated: { - controller.selectedFirmwareBuildType = model.get(index).firmwareType - if (model.get(index).firmwareType === FirmwareUpgradeController.BetaFirmware) { - firmwareWarningMessageVisible = true - firmwareVersionWarningLabel.text = qsTr("WARNING: BETA FIRMWARE. ") + - qsTr("This firmware version is ONLY intended for beta testers. ") + - qsTr("Although it has received FLIGHT TESTING, it represents actively changed code. ") + - qsTr("Do NOT use for normal operation.") - } else if (model.get(index).firmwareType === FirmwareUpgradeController.DeveloperFirmware) { - firmwareWarningMessageVisible = true - firmwareVersionWarningLabel.text = qsTr("WARNING: CONTINUOUS BUILD FIRMWARE. ") + - qsTr("This firmware has NOT BEEN FLIGHT TESTED. ") + - qsTr("It is only intended for DEVELOPERS. ") + - qsTr("Run bench tests without props first. ") + - qsTr("Do NOT fly this without additional safety precautions. ") + - qsTr("Follow the forums actively when using it.") - } else { - firmwareWarningMessageVisible = false - } - updatePX4VersionDisplay() - } - } - - QGCLabel { - id: firmwareVersionWarningLabel - Layout.fillWidth: true - wrapMode: Text.WordWrap - visible: firmwareWarningMessageVisible - } - } // ColumnLayout - } // QGCPopupDialog + } // Column + } // QGCFLickable + } // QGCViewDialog } // Component - firmwareSelectDialogComponent + Component { + id: firmwareWarningDialog + + QGCViewMessage { + message: firmwareWarningMessage + + function accept() { + hideDialog() + controller.doFirmwareUpgrade(); + } + } + } + ProgressBar { id: progressBar Layout.preferredWidth: parent.width diff --git a/src/VehicleSetup/FirmwareUpgradeController.cc b/src/VehicleSetup/FirmwareUpgradeController.cc index 7524a12..b0ef691 100644 --- a/src/VehicleSetup/FirmwareUpgradeController.cc +++ b/src/VehicleSetup/FirmwareUpgradeController.cc @@ -62,7 +62,6 @@ static QMap px4_board_name_map { {54, "px4_fmu-v6u_default"}, {56, "px4_fmu-v6c_default"}, {57, "ark_fmu-v6x_default"}, - {58, "px4_fmu-v6xrt_default"}, {55, "sky-drones_smartap-airlink_default"}, {88, "airmind_mindpx-v2_default"}, {12, "bitcraze_crazyflie_default"}, @@ -110,6 +109,8 @@ FirmwareUpgradeController::FirmwareUpgradeController(void) : _singleFirmwareURL (qgcApp()->toolbox()->corePlugin()->options()->firmwareUpgradeSingleURL()) , _singleFirmwareMode (!_singleFirmwareURL.isEmpty()) , _downloadingFirmwareList (false) + , _downloadManager (nullptr) + , _downloadNetworkReply (nullptr) , _statusLog (nullptr) , _selectedFirmwareBuildType (StableFirmware) , _image (nullptr) @@ -141,7 +142,7 @@ FirmwareUpgradeController::FirmwareUpgradeController(void) connect(_threadController, &PX4FirmwareUpgradeThreadController::eraseComplete, this, &FirmwareUpgradeController::_eraseComplete); connect(_threadController, &PX4FirmwareUpgradeThreadController::flashComplete, this, &FirmwareUpgradeController::_flashComplete); connect(_threadController, &PX4FirmwareUpgradeThreadController::updateProgress, this, &FirmwareUpgradeController::_updateProgress); - + connect(&_eraseTimer, &QTimer::timeout, this, &FirmwareUpgradeController::_eraseProgressTick); #if !defined(NO_ARDUPILOT_DIALECT) @@ -259,7 +260,7 @@ void FirmwareUpgradeController::_foundBoard(bool firstAttempt, const QSerialPort DefaultVehicleFirmware); } } - + qCDebug(FirmwareUpgradeLog) << _boardType << _boardTypeName; emit boardFound(); } @@ -283,12 +284,12 @@ void FirmwareUpgradeController::_foundBoardInfo(int bootloaderVersion, int board _bootloaderVersion = static_cast(bootloaderVersion); _bootloaderBoardID = static_cast(boardID); _bootloaderBoardFlashSize = static_cast(flashSize); - + _appendStatusLog(tr("Connected to bootloader:")); _appendStatusLog(tr(" Version: %1").arg(_bootloaderVersion)); _appendStatusLog(tr(" Board ID: %1").arg(_bootloaderBoardID)); _appendStatusLog(tr(" Flash size: %1").arg(_bootloaderBoardFlashSize)); - + if (_startFlashWhenBootloaderFound) { flash(_startFlashWhenBootloaderFoundFirmwareIdentity); } else { @@ -379,7 +380,7 @@ void FirmwareUpgradeController::_getFirmwareFile(FirmwareIdentifier firmwareId) return; } } - + if (_firmwareFilename.isEmpty()) { _errorCancel(tr("No firmware file selected")); } else { @@ -391,10 +392,10 @@ void FirmwareUpgradeController::_getFirmwareFile(FirmwareIdentifier firmwareId) void FirmwareUpgradeController::_downloadFirmware(void) { Q_ASSERT(!_firmwareFilename.isEmpty()); - + _appendStatusLog(tr("Downloading firmware...")); _appendStatusLog(tr(" From: %1").arg(_firmwareFilename)); - + QGCFileDownload* downloader = new QGCFileDownload(this); connect(downloader, &QGCFileDownload::downloadComplete, this, &FirmwareUpgradeController::_firmwareDownloadComplete); connect(downloader, &QGCFileDownload::downloadProgress, this, &FirmwareUpgradeController::_firmwareDownloadProgress); @@ -415,23 +416,23 @@ void FirmwareUpgradeController::_firmwareDownloadComplete(QString /*remoteFile*/ { if (errorMsg.isEmpty()) { _appendStatusLog(tr("Download complete")); - + FirmwareImage* image = new FirmwareImage(this); - + connect(image, &FirmwareImage::statusMessage, this, &FirmwareUpgradeController::_status); connect(image, &FirmwareImage::errorMessage, this, &FirmwareUpgradeController::_error); - + if (!image->load(localFile, _bootloaderBoardID)) { _errorCancel(tr("Image load failed")); return; } - + // We can't proceed unless we have the bootloader if (!_bootloaderFound) { _errorCancel(tr("Bootloader not found")); return; } - + if (_bootloaderBoardFlashSize != 0 && image->imageSize() > _bootloaderBoardFlashSize) { _errorCancel(tr("Image size of %1 is too large for board flash size %2").arg(image->imageSize()).arg(_bootloaderBoardFlashSize)); return; @@ -464,7 +465,7 @@ void FirmwareUpgradeController::_flashComplete(void) { delete _image; _image = nullptr; - + _appendStatusLog(tr("Upgrade complete"), true); _appendStatusLog("------------------------------------------", false); emit flashComplete(); @@ -475,7 +476,7 @@ void FirmwareUpgradeController::_error(const QString& errorString) { delete _image; _image = nullptr; - + _errorCancel(QString("Error: %1").arg(errorString)); } @@ -504,16 +505,16 @@ void FirmwareUpgradeController::_eraseProgressTick(void) void FirmwareUpgradeController::_appendStatusLog(const QString& text, bool critical) { Q_ASSERT(_statusLog); - + QVariant returnedValue; QVariant varText; - + if (critical) { varText = QString("%1").arg(text); } else { varText = text; } - + QMetaObject::invokeMethod(_statusLog, "append", Q_RETURN_ARG(QVariant, returnedValue), @@ -687,7 +688,7 @@ void FirmwareUpgradeController::_downloadArduPilotManifest(void) QGCFileDownload* downloader = new QGCFileDownload(this); connect(downloader, &QGCFileDownload::downloadComplete, this, &FirmwareUpgradeController::_ardupilotManifestDownloadComplete); - downloader->download(QStringLiteral("https://firmware.ardupilot.org/manifest.json.gz")); + downloader->download(QStringLiteral("http://firmware.ardupilot.org/manifest.json.gz")); } void FirmwareUpgradeController::_ardupilotManifestDownloadComplete(QString remoteFile, QString localFile, QString errorMsg) diff --git a/src/VehicleSetup/FirmwareUpgradeController.h b/src/VehicleSetup/FirmwareUpgradeController.h index abd99b0..90ebb50 100644 --- a/src/VehicleSetup/FirmwareUpgradeController.h +++ b/src/VehicleSetup/FirmwareUpgradeController.h @@ -226,6 +226,9 @@ private: QString _firmwareFilename; ///< Image which we are going to flash to the board + QNetworkAccessManager* _downloadManager; ///< Used for firmware file downloading across the internet + QNetworkReply* _downloadNetworkReply; ///< Used for firmware file downloading across the internet + /// @brief Thread controller which is used to run bootloader commands on separate thread PX4FirmwareUpgradeThreadController* _threadController; diff --git a/src/VehicleSetup/JoystickConfig.qml b/src/VehicleSetup/JoystickConfig.qml index c7d4f1b..3ba6e90 100644 --- a/src/VehicleSetup/JoystickConfig.qml +++ b/src/VehicleSetup/JoystickConfig.qml @@ -48,9 +48,7 @@ SetupPage { height: bar.height + joyLoader.height readonly property real labelToMonitorMargin: ScreenTools.defaultFontPixelWidth * 3 - - property var _activeJoystick: joystickManager.activeJoystick - property bool _allowJoystickSelection: QGroundControl.corePlugin.options.allowJoystickSelection + property var _activeJoystick: joystickManager.activeJoystick function setupPageCompleted() { controller.start() @@ -64,31 +62,20 @@ SetupPage { id: bar width: parent.width Component.onCompleted: { - if (_activeJoystick) { - if (_activeJoystick.axisCount == 0) { - currentIndex = _allowJoystickSelection ? 0 : 1 - } else { - currentIndex = _activeJoystick.calibrated ? 0 : 2 - } - } else { - currentIndex = 0 - } + currentIndex = _activeJoystick && _activeJoystick.calibrated ? 0 : 2 } anchors.top: parent.top QGCTabButton { text: qsTr("General") - visible: _allowJoystickSelection } QGCTabButton { text: qsTr("Button Assigment") } QGCTabButton { text: qsTr("Calibration") - visible: _activeJoystick.axisCount != 0 } QGCTabButton { text: qsTr("Advanced") - visible: _activeJoystick.axisCount != 0 } } diff --git a/src/VehicleSetup/JoystickConfigController.cc b/src/VehicleSetup/JoystickConfigController.cc index 256f450..64f6200 100644 --- a/src/VehicleSetup/JoystickConfigController.cc +++ b/src/VehicleSetup/JoystickConfigController.cc @@ -538,7 +538,6 @@ void JoystickConfigController::_writeCalibration() Vehicle* vehicle = qgcApp()->toolbox()->multiVehicleManager()->activeVehicle(); if (vehicle) { vehicle->setJoystickEnabled(true); - vehicle->saveJoystickSettings(); } } diff --git a/src/VehicleSetup/JoystickConfigGeneral.qml b/src/VehicleSetup/JoystickConfigGeneral.qml index 8a479a1..e6b8428 100644 --- a/src/VehicleSetup/JoystickConfigGeneral.qml +++ b/src/VehicleSetup/JoystickConfigGeneral.qml @@ -21,14 +21,9 @@ import QGroundControl.FactSystem 1.0 import QGroundControl.FactControls 1.0 Item { - width: mainCol.width + (ScreenTools.defaultFontPixelWidth * 2) - height: mainCol.height + (ScreenTools.defaultFontPixelHeight * 2) - + width: mainCol.width + (ScreenTools.defaultFontPixelWidth * 2) + height: mainCol.height + (ScreenTools.defaultFontPixelHeight * 2) readonly property real axisMonitorWidth: ScreenTools.defaultFontPixelWidth * 32 - - property bool _buttonsOnly: _activeJoystick.axisCount == 0 - property bool _requiresCalibration: !_activeJoystick.calibrated && !_buttonsOnly - Column { id: mainCol anchors.centerIn: parent @@ -40,17 +35,14 @@ Item { //--------------------------------------------------------------------- //-- Enable Joystick QGCLabel { - text: _requiresCalibration ? qsTr("Enable not allowed (Calibrate First)") : qsTr("Enable joystick input") + text: _activeJoystick ? _activeJoystick.calibrated ? qsTr("Enable joystick input") : qsTr("Enable not allowed (Calibrate First)") : "" Layout.alignment: Qt.AlignVCenter Layout.minimumWidth: ScreenTools.defaultFontPixelWidth * 36 } QGCCheckBox { id: enabledSwitch - enabled: !_requiresCalibration - onClicked: { - globals.activeVehicle.joystickEnabled = checked - globals.activeVehicle.saveJoystickSettings() - } + enabled: _activeJoystick ? _activeJoystick.calibrated : false + onClicked: globals.activeVehicle.joystickEnabled = checked Component.onCompleted: { checked = globals.activeVehicle.joystickEnabled } @@ -104,11 +96,9 @@ Item { QGCLabel { text: qsTr("RC Mode:") Layout.alignment: Qt.AlignVCenter - visible: !_buttonsOnly } Row { spacing: ScreenTools.defaultFontPixelWidth - visible: !_buttonsOnly QGCRadioButton { text: "1" checked: controller.transmitterMode === 1 @@ -151,7 +141,6 @@ Item { radius: ScreenTools.defaultFontPixelWidth * 0.5 width: axisGrid.width + (ScreenTools.defaultFontPixelWidth * 2) height: axisGrid.height + (ScreenTools.defaultFontPixelHeight * 2) - visible: !_buttonsOnly GridLayout { id: axisGrid columns: 2 diff --git a/src/VehicleSetup/SetupView.qml b/src/VehicleSetup/SetupView.qml index cd190b3..70946d1 100644 --- a/src/VehicleSetup/SetupView.qml +++ b/src/VehicleSetup/SetupView.qml @@ -260,16 +260,12 @@ Rectangle { id: joystickButton imageResource: "/qmlimages/Joystick.png" setupIndicator: true - setupComplete: _activeJoystick ? _activeJoystick.calibrated || _buttonsOnly : false + setupComplete: joystickManager.activeJoystick ? joystickManager.activeJoystick.calibrated : false exclusiveGroup: setupButtonGroup visible: _fullParameterVehicleAvailable && joystickManager.joysticks.length !== 0 - text: _forcedToButtonsOnly ? qsTr("Buttons") : qsTr("Joystick") + text: qsTr("Joystick") Layout.fillWidth: true onClicked: showPanel(this, "JoystickConfig.qml") - - property var _activeJoystick: joystickManager.activeJoystick - property bool _buttonsOnly: _activeJoystick ? _activeJoystick.axisCount == 0 : false - property bool _forcedToButtonsOnly: !QGroundControl.corePlugin.options.allowJoystickSelection && _buttonsOnly } Repeater { diff --git a/src/VideoManager/VideoManager.cc b/src/VideoManager/VideoManager.cc index fd6d90a..c181776 100644 --- a/src/VideoManager/VideoManager.cc +++ b/src/VideoManager/VideoManager.cc @@ -124,12 +124,10 @@ VideoManager::setToolbox(QGCToolbox *toolbox) }); connect(_videoReceiver[0], &VideoReceiver::onStartComplete, this, [this](VideoReceiver::STATUS status) { - qCDebug(VideoManagerLog) << "Video 0 Start complete, status: " << status; if (status == VideoReceiver::STATUS_OK) { _videoStarted[0] = true; if (_videoSink[0] != nullptr) { - qCDebug(VideoManagerLog) << "Video 0 start decoding"; - // It is absolutely ok to have video receiver active (streaming) and decoding not active + // It is absolytely ok to have video receiver active (streaming) and decoding not active // It should be handy for cases when you have many streams and want to show only some of them // NOTE that even if decoder did not start it is still possible to record video _videoReceiver[0]->startDecoding(_videoSink[0]); @@ -143,24 +141,17 @@ VideoManager::setToolbox(QGCToolbox *toolbox) } }); - connect(_videoReceiver[0], &VideoReceiver::onStopComplete, this, [this](VideoReceiver::STATUS status) { - qCDebug(VideoManagerLog) << "Video 0 Stop complete, status: " << status; + connect(_videoReceiver[0], &VideoReceiver::onStopComplete, this, [this](VideoReceiver::STATUS) { _videoStarted[0] = false; - if (status == VideoReceiver::STATUS_INVALID_URL) { - qCDebug(VideoManagerLog) << "Invalid video URL. Not restarting"; - } else { - _startReceiver(0); - } + _startReceiver(0); }); connect(_videoReceiver[0], &VideoReceiver::decodingChanged, this, [this](bool active){ - qCDebug(VideoManagerLog) << "Video 0 decoding changed, active: " << (active ? "yes" : "no"); _decoding = active; emit decodingChanged(); }); connect(_videoReceiver[0], &VideoReceiver::recordingChanged, this, [this](bool active){ - qCDebug(VideoManagerLog) << "Video 0 recording changed, active: " << (active ? "yes" : "no"); _recording = active; if (!active) { _subtitleWriter.stopCapturingTelemetry(); @@ -169,12 +160,10 @@ VideoManager::setToolbox(QGCToolbox *toolbox) }); connect(_videoReceiver[0], &VideoReceiver::recordingStarted, this, [this](){ - qCDebug(VideoManagerLog) << "Video 0 recording started"; _subtitleWriter.startCapturingTelemetry(_videoFile); }); connect(_videoReceiver[0], &VideoReceiver::videoSizeChanged, this, [this](QSize size){ - qCDebug(VideoManagerLog) << "Video 0 resized. New resolution: " << size.width() << "x" << size.height(); _videoSize = ((quint32)size.width() << 16) | (quint32)size.height(); emit videoSizeChanged(); }); @@ -470,28 +459,16 @@ void VideoManager::_updateUVC() { #ifndef QGC_DISABLE_UVC - QString oldUvcVideoSrcID = _uvcVideoSourceID; - if (!hasVideo() || isGStreamer()) { - _uvcVideoSourceID = ""; - } else { - QString videoSource = _videoSettings->videoSource()->rawValue().toString(); - QList cameras = QCameraInfo::availableCameras(); - for (const QCameraInfo &cameraInfo : cameras) { - if (cameraInfo.description() == videoSource) { - _uvcVideoSourceID = cameraInfo.deviceName(); - qCDebug(VideoManagerLog) - << "Found USB source:" << _uvcVideoSourceID << " Name:" << videoSource; - break; - } + QString videoSource = _videoSettings->videoSource()->rawValue().toString(); + QList cameras = QCameraInfo::availableCameras(); + for (const QCameraInfo &cameraInfo: cameras) { + if(cameraInfo.description() == videoSource) { + _videoSourceID = cameraInfo.deviceName(); + emit videoSourceIDChanged(); + qCDebug(VideoManagerLog) << "Found USB source:" << _videoSourceID << " Name:" << videoSource; + break; } } - - if (oldUvcVideoSrcID != _uvcVideoSourceID) { - qCDebug(VideoManagerLog) << "UVC changed from [" << oldUvcVideoSrcID << "] to [" << _uvcVideoSourceID << "]"; - emit uvcVideoSourceIDChanged(); - emit isUvcChanged(); - } - #endif } @@ -500,16 +477,10 @@ void VideoManager::_videoSourceChanged() { _updateUVC(); - _updateSettings(0); emit hasVideoChanged(); emit isGStreamerChanged(); - emit isUvcChanged(); emit isAutoStreamChanged(); - if (hasVideo()) { - _restartVideo(0); - } else { - stopVideo(); - } + _restartVideo(0); } //----------------------------------------------------------------------------- @@ -565,26 +536,12 @@ VideoManager::isGStreamer() videoSource == VideoSettings::videoSource3DRSolo || videoSource == VideoSettings::videoSourceParrotDiscovery || videoSource == VideoSettings::videoSourceYuneecMantisG || - videoSource == VideoSettings::videoSourceHerelinkAirUnit || - videoSource == VideoSettings::videoSourceHerelinkHotspot || autoStreamConfigured(); #else return false; #endif } -bool -VideoManager::isUvc() -{ -#ifndef QGC_DISABLE_UVC - auto isUvc = hasVideo() && !_uvcVideoSourceID.isEmpty(); - qCDebug(VideoManagerLog) << "Is Video source UVC: " << (isUvc ? "yes" : "no"); - return isUvc; -#else - return false; -#endif -} - //----------------------------------------------------------------------------- #ifndef QGC_DISABLE_UVC bool @@ -712,7 +669,11 @@ VideoManager::_updateSettings(unsigned id) settingsChanged |= _updateVideoUri(id, pTinfo->uri()); break; case VIDEO_STREAM_TYPE_RTPUDP: - settingsChanged |= _updateVideoUri(id, QStringLiteral("udp://0.0.0.0:%1").arg(pTinfo->uri())); + settingsChanged |= _updateVideoUri( + id, + pInfo->uri().contains("udp://") + ? pInfo->uri() // Specced case + : QStringLiteral("udp://0.0.0.0:%1").arg(pInfo->uri())); break; case VIDEO_STREAM_TYPE_MPEG_TS_H264: settingsChanged |= _updateVideoUri(id, QStringLiteral("mpegts://0.0.0.0:%1").arg(pTinfo->uri())); @@ -743,19 +704,6 @@ VideoManager::_updateSettings(unsigned id) settingsChanged |= _updateVideoUri(0, QStringLiteral("udp://0.0.0.0:8888")); else if (source == VideoSettings::videoSourceYuneecMantisG) settingsChanged |= _updateVideoUri(0, QStringLiteral("rtsp://192.168.42.1:554/live")); - else if (source == VideoSettings::videoSourceHerelinkAirUnit) - settingsChanged |= _updateVideoUri(0, QStringLiteral("rtsp://192.168.0.10:8554/H264Video")); - else if (source == VideoSettings::videoSourceHerelinkHotspot) - settingsChanged |= _updateVideoUri(0, QStringLiteral("rtsp://192.168.43.1:8554/fpv_stream")); - else if (source == VideoSettings::videoDisabled || source == VideoSettings::videoSourceNoVideo) - settingsChanged |= _updateVideoUri(0, ""); - else { - settingsChanged |= _updateVideoUri(0, ""); - if (!isUvc()) { - qCCritical(VideoManagerLog) - << "Video source URI \"" << source << "\" is not supported. Please add support!"; - } - } return settingsChanged; } @@ -807,9 +755,9 @@ VideoManager::_restartVideo(unsigned id) _updateSettings(id); bool newLowLatencyStreaming = _lowLatencyStreaming[id]; QString newUri = _videoUri[id]; - qCDebug(VideoManagerLog) << "New Video URI " << newUri; + // FIXME: AV: use _updateSettings() result to check if settings were changed - if (_videoStarted[id] && oldUri == newUri && oldLowLatencyStreaming == newLowLatencyStreaming) { + if (oldUri == newUri && oldLowLatencyStreaming == newLowLatencyStreaming && _videoStarted[id]) { qCDebug(VideoManagerLog) << "No sense to restart video streaming, skipped" << id; return; } @@ -837,11 +785,7 @@ void VideoManager::_startReceiver(unsigned id) { #if defined(QGC_GST_STREAMING) - const QString source = _videoSettings->videoSource()->rawValue().toString(); - const unsigned rtsptimeout = _videoSettings->rtspTimeout()->rawValue().toUInt(); - /* The gstreamer rtsp source will switch to tcp if udp is not available after 5 seconds. - So we should allow for some negotiation time for rtsp */ - const unsigned timeout = (source == VideoSettings::videoSourceRTSP ? rtsptimeout : 2 ); + const unsigned timeout = _videoSettings->rtspTimeout()->rawValue().toUInt(); if (id > 1) { qCDebug(VideoManagerLog) << "Unsupported receiver id" << id; diff --git a/src/VideoManager/VideoManager.h b/src/VideoManager/VideoManager.h index e936ba7..543b1af 100644 --- a/src/VideoManager/VideoManager.h +++ b/src/VideoManager/VideoManager.h @@ -38,9 +38,8 @@ public: Q_PROPERTY(bool hasVideo READ hasVideo NOTIFY hasVideoChanged) Q_PROPERTY(bool isGStreamer READ isGStreamer NOTIFY isGStreamerChanged) - Q_PROPERTY(bool isUvc READ isUvc NOTIFY isUvcChanged) Q_PROPERTY(bool isTaisync READ isTaisync WRITE setIsTaisync NOTIFY isTaisyncChanged) - Q_PROPERTY(QString uvcVideoSourceID READ uvcVideoSourceID NOTIFY uvcVideoSourceIDChanged) + Q_PROPERTY(QString videoSourceID READ videoSourceID NOTIFY videoSourceIDChanged) Q_PROPERTY(bool uvcEnabled READ uvcEnabled CONSTANT) Q_PROPERTY(bool fullScreen READ fullScreen WRITE setfullScreen NOTIFY fullScreenChanged) Q_PROPERTY(VideoReceiver* videoReceiver READ videoReceiver CONSTANT) @@ -59,10 +58,9 @@ public: virtual bool hasVideo (); virtual bool isGStreamer (); - virtual bool isUvc (); virtual bool isTaisync () { return _isTaisync; } virtual bool fullScreen () { return _fullScreen; } - virtual QString uvcVideoSourceID () { return _uvcVideoSourceID; } + virtual QString videoSourceID () { return _videoSourceID; } virtual double aspectRatio (); virtual double thermalAspectRatio (); virtual double hfov (); @@ -116,8 +114,7 @@ public: signals: void hasVideoChanged (); void isGStreamerChanged (); - void isUvcChanged (); - void uvcVideoSourceIDChanged (); + void videoSourceIDChanged (); void fullScreenChanged (); void isAutoStreamChanged (); void isTaisyncChanged (); @@ -173,7 +170,7 @@ protected: QAtomicInteger _recording = false; QAtomicInteger _videoSize = 0; VideoSettings* _videoSettings = nullptr; - QString _uvcVideoSourceID; + QString _videoSourceID; bool _fullScreen = false; Vehicle* _activeVehicle = nullptr; }; diff --git a/src/VideoReceiver/GStreamer.cc b/src/VideoReceiver/GStreamer.cc index 4fe2b10..0515d6a 100644 --- a/src/VideoReceiver/GStreamer.cc +++ b/src/VideoReceiver/GStreamer.cc @@ -136,12 +136,10 @@ GStreamer::blacklist(VideoSettings::VideoDecoderOptions option) case VideoSettings::ForceVideoDecoderDefault: break; case VideoSettings::ForceVideoDecoderSoftware: - for(auto name : {"avdec_h264", "avdec_h265"}) { - changeRank(name, GST_RANK_PRIMARY + 1); - } + changeRank("avdec_h264", GST_RANK_PRIMARY + 1); break; case VideoSettings::ForceVideoDecoderVAAPI: - for(auto name : {"vaapimpeg2dec", "vaapimpeg4dec", "vaapih263dec", "vaapih264dec", "vaapih265dec", "vaapivc1dec"}) { + for(auto name : {"vaapimpeg2dec", "vaapimpeg4dec", "vaapih263dec", "vaapih264dec", "vaapivc1dec"}) { changeRank(name, GST_RANK_PRIMARY + 1); } break; diff --git a/src/VideoReceiver/GstVideoReceiver.cc b/src/VideoReceiver/GstVideoReceiver.cc index 620706c..479b6bd 100644 --- a/src/VideoReceiver/GstVideoReceiver.cc +++ b/src/VideoReceiver/GstVideoReceiver.cc @@ -63,7 +63,6 @@ GstVideoReceiver::GstVideoReceiver(QObject* parent) GstVideoReceiver::~GstVideoReceiver(void) { - stop(); _slotHandler.shutdown(); } @@ -123,7 +122,7 @@ GstVideoReceiver::start(const QString& uri, unsigned timeout, int buffer) _lastSourceFrameTime = 0; - _teeProbeId = gst_pad_add_probe(pad, GST_PAD_PROBE_TYPE_BUFFER, _teeProbe, this, nullptr); + gst_pad_add_probe(pad, GST_PAD_PROBE_TYPE_BUFFER, _teeProbe, this, nullptr); gst_object_unref(pad); pad = nullptr; @@ -288,15 +287,6 @@ GstVideoReceiver::stop(void) qCDebug(VideoReceiverLog) << "Stopping" << _uri; - if (_teeProbeId != 0) { - GstPad* sinkpad; - if ((sinkpad = gst_element_get_static_pad(_tee, "sink")) != nullptr) { - gst_pad_remove_probe(sinkpad, _teeProbeId); - sinkpad = nullptr; - } - _teeProbeId = 0; - } - if (_pipeline != nullptr) { GstBus* bus; @@ -1361,7 +1351,6 @@ GstVideoReceiver::_onBusMessage(GstBus* bus, GstMessage* msg, gpointer data) gst_message_parse_error(msg, &error, &debug); if (debug != nullptr) { - qCDebug(VideoReceiverLog) << "GStreamer debug: " << debug; g_free(debug); debug = nullptr; } diff --git a/src/VideoReceiver/GstVideoReceiver.h b/src/VideoReceiver/GstVideoReceiver.h index 44aa4f1..db63de8 100644 --- a/src/VideoReceiver/GstVideoReceiver.h +++ b/src/VideoReceiver/GstVideoReceiver.h @@ -148,9 +148,7 @@ protected: qint64 _lastSourceFrameTime; qint64 _lastVideoFrameTime; bool _resetVideoSink; - gulong _videoSinkProbeId = 0; - - gulong _teeProbeId = 0; + gulong _videoSinkProbeId; QTimer _watchdogTimer; diff --git a/src/VideoReceiver/README.md b/src/VideoReceiver/README.md index 06fea54..db79152 100644 --- a/src/VideoReceiver/README.md +++ b/src/VideoReceiver/README.md @@ -68,11 +68,11 @@ The build system is setup to use pkgconfig and it will find the necessary header ### Mac OS -Download the gstreamer framework from here: http://gstreamer.freedesktop.org/data/pkg/osx. Supported version is 1.18.6. QGC may work with newer version, but it is untested. +Download the gstreamer framework from here: http://gstreamer.freedesktop.org/data/pkg/osx. Supported version is 1.18.1. QGC may work with newer version, but it is untested. You need two packages: -- [gstreamer-1.0-devel-1.18.6-x86_64.pkg](https://gstreamer.freedesktop.org/data/pkg/osx/1.18.6/gstreamer-1.0-devel-1.18.6-x86_64.pkg) -- [gstreamer-1.0-1.18.6-x86_64.pkg](https://gstreamer.freedesktop.org/data/pkg/osx/1.18.6/gstreamer-1.0-1.18.6-x86_64.pkg) +- [gstreamer-1.0-devel-1.18.1-x86_64.pkg](https://gstreamer.freedesktop.org/data/pkg/osx/1.18.1/gstreamer-1.0-devel-1.18.1-x86_64.pkg) +- [gstreamer-1.0-1.18.1-x86_64.pkg](https://gstreamer.freedesktop.org/data/pkg/osx/1.18.1/gstreamer-1.0-1.18.1-x86_64.pkg) The installer places them under /Library/Frameworks/GStreamer.framework, which is where the QGC build system will look for it. That's all that is needed. When you build QGC and it finds the gstreamer framework, it automatically builds video streaming support. diff --git a/src/VideoReceiver/VideoReceiver.pri b/src/VideoReceiver/VideoReceiver.pri index 4d51aa9..7dc6245 100644 --- a/src/VideoReceiver/VideoReceiver.pri +++ b/src/VideoReceiver/VideoReceiver.pri @@ -25,7 +25,9 @@ LinuxBuild { CONFIG += VideoEnabled INCLUDEPATH += $$GST_ROOT/Headers LIBS += -F/Library/Frameworks -framework GStreamer - QMAKE_LIBDIR += $$GST_ROOT/Versions/1.0/lib/ + QMAKE_LFLAGS += -Wl,-rpath,@executable_path/../Frameworks/GStreamer.framework/Versions/1.0/lib + QMAKE_LFLAGS += -Wl,-rpath,@executable_path/../Frameworks/GStreamer.framework/Versions/1.0 + QMAKE_LFLAGS += -Wl,-rpath,/Library/Frameworks/GStreamer.framework/Versions/1.0 } } else:iOSBuild { #- gstreamer framework installed by the gstreamer iOS SDK installer (default to home directory) @@ -39,11 +41,6 @@ LinuxBuild { #- gstreamer installed by default under c:/gstreamer GST_ROOT = c:/gstreamer/1.0/msvc_x86_64 - !exists($$GST_ROOT) { - # In GitHub actions windows runner installation is on D drive, so try there as well - GST_ROOT = d:/gstreamer/1.0/msvc_x86_64 - } - exists($$GST_ROOT) { CONFIG += VideoEnabled diff --git a/src/VideoReceiver/gstqgcvideosinkbin.c b/src/VideoReceiver/gstqgcvideosinkbin.c index ed962e5..6ed2db4 100644 --- a/src/VideoReceiver/gstqgcvideosinkbin.c +++ b/src/VideoReceiver/gstqgcvideosinkbin.c @@ -16,7 +16,6 @@ #include #include -#include GST_DEBUG_CATEGORY_STATIC(gst_qgc_video_sink_bin_debug); #define GST_CAT_DEFAULT gst_qgc_video_sink_bin_debug @@ -65,12 +64,12 @@ enum { static GstBinClass *parent_class; -static void _vsb_init(GTypeInstance *instanceData, void *vsbVoid); +static void _vsb_init(GstQgcVideoSinkBin *vsb); static void _vsb_dispose(GObject *object); static void _vsb_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); static void _vsb_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); static GType _vsb_get_type(void); -static void _vsb_class_init(void *klass, void *classData); +static void _vsb_class_init(GstQgcVideoSinkBinClass *klass); static gboolean _vsb_sink_pad_query(GstPad* pad, GstObject* parent, GstQuery* query) @@ -112,13 +111,8 @@ _vsb_sink_pad_query(GstPad* pad, GstObject* parent, GstQuery* query) } static void -_vsb_init(GTypeInstance *instanceData, void *vsbVoid) +_vsb_init(GstQgcVideoSinkBin *vsb) { - Q_UNUSED(vsbVoid); - - GstQgcVideoSinkBin *vsb; - vsb = (GstQgcVideoSinkBin *)instanceData; - gboolean initialized = FALSE; GstElement* glcolorconvert = NULL; GstPad* pad = NULL; @@ -332,10 +326,8 @@ _vsb_get_type(void) } static void -_vsb_class_init(void *klass, void *classData) +_vsb_class_init(GstQgcVideoSinkBinClass *klass) { - Q_UNUSED(classData); - GObjectClass *gobject_klass; GstElementClass *gstelement_klass; diff --git a/src/api/QGCCorePlugin.cc b/src/api/QGCCorePlugin.cc index 318c7a9..4bc51f7 100644 --- a/src/api/QGCCorePlugin.cc +++ b/src/api/QGCCorePlugin.cc @@ -54,6 +54,10 @@ public: #if defined(QGC_GST_MICROHARD_ENABLED) if(pMicrohard) delete pMicrohard; +#endif +#if defined(QGC_AIRMAP_ENABLED) + if(pAirmap) + delete pAirmap; #endif if(pMAVLink) delete pMAVLink; @@ -67,8 +71,6 @@ public: if(pQmlTest) delete pQmlTest; #endif - if(pRemoteID) - delete pRemoteID; if(defaultOptions) delete defaultOptions; } @@ -81,6 +83,9 @@ public: #endif #if defined(QGC_GST_MICROHARD_ENABLED) QmlComponentInfo* pMicrohard = nullptr; +#endif +#if defined(QGC_AIRMAP_ENABLED) + QmlComponentInfo* pAirmap = nullptr; #endif QmlComponentInfo* pMAVLink = nullptr; QmlComponentInfo* pConsole = nullptr; @@ -90,7 +95,6 @@ public: QmlComponentInfo* pDebug = nullptr; QmlComponentInfo* pQmlTest = nullptr; #endif - QmlComponentInfo* pRemoteID = nullptr; QGCOptions* defaultOptions = nullptr; QVariantList settingsList; @@ -150,14 +154,17 @@ QVariantList &QGCCorePlugin::settingsPages() QUrl::fromUserInput("qrc:/qml/MicrohardSettings.qml"), QUrl::fromUserInput("")); _p->settingsList.append(QVariant::fromValue(reinterpret_cast(_p->pMicrohard))); +#endif +#if defined(QGC_AIRMAP_ENABLED) + _p->pAirmap = new QmlComponentInfo(tr("AirMap"), + QUrl::fromUserInput("qrc:/qml/AirmapSettings.qml"), + QUrl::fromUserInput("")); + _p->settingsList.append(QVariant::fromValue(reinterpret_cast(_p->pAirmap))); #endif _p->pMAVLink = new QmlComponentInfo(tr("MAVLink"), QUrl::fromUserInput("qrc:/qml/MavlinkSettings.qml"), QUrl::fromUserInput("qrc:/res/waves.svg")); _p->settingsList.append(QVariant::fromValue(reinterpret_cast(_p->pMAVLink))); - _p->pRemoteID = new QmlComponentInfo(tr("Remote ID"), - QUrl::fromUserInput("qrc:/qml/RemoteIDSettings.qml")); - _p->settingsList.append(QVariant::fromValue(reinterpret_cast(_p->pRemoteID))); _p->pConsole = new QmlComponentInfo(tr("Console"), QUrl::fromUserInput("qrc:/qml/QGroundControl/Controls/AppMessages.qml")); _p->settingsList.append(QVariant::fromValue(reinterpret_cast(_p->pConsole))); @@ -248,13 +255,6 @@ bool QGCCorePlugin::adjustSettingMetaData(const QString& settingsGroup, FactMeta return true; } #endif - -#ifndef __android__ - if (metaData.name() == AppSettings::androidSaveToSDCardName) { - // This only shows on android builds - return false; - } -#endif } return true; // Show setting in ui diff --git a/src/api/QGCOptions.h b/src/api/QGCOptions.h index 7b5926d..43f0116 100644 --- a/src/api/QGCOptions.h +++ b/src/api/QGCOptions.h @@ -80,7 +80,6 @@ public: Q_PROPERTY(bool showMavlinkLogOptions READ showMavlinkLogOptions CONSTANT) Q_PROPERTY(bool enableSaveMainWindowPosition READ enableSaveMainWindowPosition CONSTANT) Q_PROPERTY(QStringList surveyBuiltInPresetNames READ surveyBuiltInPresetNames CONSTANT) - Q_PROPERTY(bool allowJoystickSelection READ allowJoystickSelection NOTIFY allowJoystickSelectionChanged) Q_PROPERTY(QGCFlyViewOptions* flyView READ flyViewOptions CONSTANT) @@ -126,7 +125,6 @@ public: virtual bool disableVehicleConnection () const { return false; } ///< true: vehicle connection is disabled virtual bool checkFirmwareVersion () const { return true; } virtual bool showMavlinkLogOptions () const { return true; } - virtual bool allowJoystickSelection () const { return true; } ///< false: custom build has automatically enabled a specific joystick /// Desktop builds save the main application size and position on close (and restore it on open) virtual bool enableSaveMainWindowPosition () const { return true; } virtual QStringList surveyBuiltInPresetNames () const { return QStringList(); } // Built in presets cannot be deleted @@ -157,7 +155,6 @@ signals: void showFirmwareUpgradeChanged (bool show); void missionWaypointsOnlyChanged (bool missionWaypointsOnly); void multiVehicleEnabledChanged (bool multiVehicleEnabled); - void allowJoystickSelectionChanged (bool allow); void showOfflineMapExportChanged (); void showOfflineMapImportChanged (); void showMissionAbsoluteAltitudeChanged (); diff --git a/src/comm/LinkManager.cc b/src/comm/LinkManager.cc index 864ef8c..afa440f 100644 --- a/src/comm/LinkManager.cc +++ b/src/comm/LinkManager.cc @@ -46,9 +46,8 @@ QGC_LOGGING_CATEGORY(LinkManagerLog, "LinkManagerLog") QGC_LOGGING_CATEGORY(LinkManagerVerboseLog, "LinkManagerVerboseLog") -const char* LinkManager::_defaultUDPLinkName = "UDP Link (AutoConnect)"; -const char* LinkManager::_mavlinkForwardingLinkName = "MAVLink Forwarding Link"; -const char* LinkManager::_mavlinkForwardingSupportLinkName = "MAVLink Support Forwarding Link"; +const char* LinkManager::_defaultUDPLinkName = "UDP Link (AutoConnect)"; +const char* LinkManager::_mavlinkForwardingLinkName = "MAVLink Forwarding Link"; const int LinkManager::_autoconnectUpdateTimerMSecs = 1000; #ifdef Q_OS_WIN @@ -161,9 +160,6 @@ bool LinkManager::createConnectedLink(SharedLinkConfigurationPtr& config, bool i _mavlinkProtocol->setVersion(_mavlinkProtocol->getCurrentVersion()); if (!link->_connect()) { - link->_freeMavlinkChannel(); - _rgLinks.removeAt(_rgLinks.indexOf(link)); - config->setLink(nullptr); return false; } @@ -175,21 +171,10 @@ bool LinkManager::createConnectedLink(SharedLinkConfigurationPtr& config, bool i SharedLinkInterfacePtr LinkManager::mavlinkForwardingLink() { - for (auto& link : _rgLinks) { - SharedLinkConfigurationPtr linkConfig = link->linkConfiguration(); + for (int i = 0; i < _rgLinks.count(); i++) { + SharedLinkConfigurationPtr linkConfig = _rgLinks[i]->linkConfiguration(); if (linkConfig->type() == LinkConfiguration::TypeUdp && linkConfig->name() == _mavlinkForwardingLinkName) { - return link; - } - } - - return nullptr; -} - -SharedLinkInterfacePtr LinkManager::mavlinkForwardingSupportLink() -{ - for (auto& link : _rgLinks) { - SharedLinkConfigurationPtr linkConfig = link->linkConfiguration(); - if (linkConfig->type() == LinkConfiguration::TypeUdp && linkConfig->name() == _mavlinkForwardingSupportLinkName) { + SharedLinkInterfacePtr& link = _rgLinks[i]; return link; } } @@ -422,8 +407,16 @@ void LinkManager::_addMAVLinkForwardingLink(void) } if (!foundMAVLinkForwardingLink) { + qCDebug(LinkManagerLog) << "New MAVLink forwarding port added"; + + UDPConfiguration* udpConfig = new UDPConfiguration(_mavlinkForwardingLinkName); + udpConfig->setDynamic(true); + QString hostName = _toolbox->settingsManager()->appSettings()->forwardMavlinkHostName()->rawValue().toString(); - _createDynamicForwardLink(_mavlinkForwardingLinkName, hostName); + udpConfig->addHost(hostName); + + SharedLinkConfigurationPtr config = addConfiguration(udpConfig); + createConnectedLink(config); } } } @@ -467,7 +460,6 @@ void LinkManager::_addZeroConfAutoConnectLink(void) if(service.type().startsWith("_mavlink._udp")) { static QString udpName("ZeroConf UDP"); if (checkIfConnectionLinkExist(LinkConfiguration::TypeUdp, udpName)) { - qCDebug(LinkManagerVerboseLog) << "Connection already exist"; return; } @@ -483,12 +475,12 @@ void LinkManager::_addZeroConfAutoConnectLink(void) if(service.type().startsWith("_mavlink._tcp")) { static QString tcpName("ZeroConf TCP"); if (checkIfConnectionLinkExist(LinkConfiguration::TypeTcp, tcpName)) { - qCDebug(LinkManagerVerboseLog) << "Connection already exist"; return; } auto link = new TCPConfiguration(tcpName); - link->setHost(hostname); + QHostAddress address(hostname); + link->setAddress(address); link->setPort(service.port()); link->setAutoConnect(true); link->setDynamic(true); @@ -713,8 +705,8 @@ void LinkManager::_updateSerialPorts() _commPortList.clear(); _commPortDisplayList.clear(); #ifndef NO_SERIAL_LINK - QList portList = QGCSerialPortInfo::availablePorts(); - for (const QGCSerialPortInfo &info: portList) + QList portList = QSerialPortInfo::availablePorts(); + for (const QSerialPortInfo &info: portList) { QString port = info.systemLocation().trimmed(); _commPortList += port; @@ -816,14 +808,6 @@ void LinkManager::removeConfiguration(LinkConfiguration* config) } } -void LinkManager::createMavlinkForwardingSupportLink(void) -{ - QString hostName = _toolbox->settingsManager()->appSettings()->forwardMavlinkAPMSupportHostName()->rawValue().toString(); - _createDynamicForwardLink(_mavlinkForwardingSupportLinkName, hostName); - _mavlinkSupportForwardingEnabled = true; - emit mavlinkSupportForwardingEnabledChanged(); -} - void LinkManager::_removeConfiguration(LinkConfiguration* config) { _qmlConfigurations.removeOne(config); @@ -920,16 +904,3 @@ bool LinkManager::_isSerialPortConnected(void) #endif return false; } - -void LinkManager::_createDynamicForwardLink(const char* linkName, QString hostName) -{ - UDPConfiguration* udpConfig = new UDPConfiguration(linkName); - udpConfig->setDynamic(true); - - udpConfig->addHost(hostName); - - SharedLinkConfigurationPtr config = addConfiguration(udpConfig); - createConnectedLink(config); - - qCDebug(LinkManagerLog) << "New dynamic MAVLink forwarding port added: " << linkName << " hostname: " << hostName; -} \ No newline at end of file diff --git a/src/comm/LinkManager.h b/src/comm/LinkManager.h index 1c24584..7895a03 100644 --- a/src/comm/LinkManager.h +++ b/src/comm/LinkManager.h @@ -52,22 +52,20 @@ public: LinkManager(QGCApplication* app, QGCToolbox* toolbox); ~LinkManager(); - Q_PROPERTY(bool isBluetoothAvailable READ isBluetoothAvailable CONSTANT) - Q_PROPERTY(QmlObjectListModel* linkConfigurations READ _qmlLinkConfigurations CONSTANT) - Q_PROPERTY(QStringList linkTypeStrings READ linkTypeStrings CONSTANT) - Q_PROPERTY(QStringList serialBaudRates READ serialBaudRates CONSTANT) - Q_PROPERTY(QStringList serialPortStrings READ serialPortStrings NOTIFY commPortStringsChanged) - Q_PROPERTY(QStringList serialPorts READ serialPorts NOTIFY commPortsChanged) - Q_PROPERTY(bool mavlinkSupportForwardingEnabled READ mavlinkSupportForwardingEnabled NOTIFY mavlinkSupportForwardingEnabledChanged) + Q_PROPERTY(bool isBluetoothAvailable READ isBluetoothAvailable CONSTANT) + Q_PROPERTY(QmlObjectListModel* linkConfigurations READ _qmlLinkConfigurations CONSTANT) + Q_PROPERTY(QStringList linkTypeStrings READ linkTypeStrings CONSTANT) + Q_PROPERTY(QStringList serialBaudRates READ serialBaudRates CONSTANT) + Q_PROPERTY(QStringList serialPortStrings READ serialPortStrings NOTIFY commPortStringsChanged) + Q_PROPERTY(QStringList serialPorts READ serialPorts NOTIFY commPortsChanged) /// Create/Edit Link Configuration - Q_INVOKABLE LinkConfiguration* createConfiguration (int type, const QString& name); - Q_INVOKABLE LinkConfiguration* startConfigurationEditing (LinkConfiguration* config); - Q_INVOKABLE void cancelConfigurationEditing (LinkConfiguration* config) { delete config; } - Q_INVOKABLE bool endConfigurationEditing (LinkConfiguration* config, LinkConfiguration* editedConfig); - Q_INVOKABLE bool endCreateConfiguration (LinkConfiguration* config); - Q_INVOKABLE void removeConfiguration (LinkConfiguration* config); - Q_INVOKABLE void createMavlinkForwardingSupportLink (void); + Q_INVOKABLE LinkConfiguration* createConfiguration (int type, const QString& name); + Q_INVOKABLE LinkConfiguration* startConfigurationEditing (LinkConfiguration* config); + Q_INVOKABLE void cancelConfigurationEditing (LinkConfiguration* config) { delete config; } + Q_INVOKABLE bool endConfigurationEditing (LinkConfiguration* config, LinkConfiguration* editedConfig); + Q_INVOKABLE bool endCreateConfiguration (LinkConfiguration* config); + Q_INVOKABLE void removeConfiguration (LinkConfiguration* config); // Called to signal app shutdown. Disconnects all links while turning off auto-connect. Q_INVOKABLE void shutdown(void); @@ -78,12 +76,11 @@ public: bool isBluetoothAvailable (void); - QList links (void) { return _rgLinks; } - QStringList linkTypeStrings (void) const; - QStringList serialBaudRates (void); - QStringList serialPortStrings (void); - QStringList serialPorts (void); - bool mavlinkSupportForwardingEnabled (void) { return _mavlinkSupportForwardingEnabled; } + QList links (void) { return _rgLinks; } + QStringList linkTypeStrings (void) const; + QStringList serialBaudRates (void); + QStringList serialPortStrings (void); + QStringList serialPorts (void); void loadLinkConfigurationList(); void saveLinkConfigurationList(); @@ -107,9 +104,6 @@ public: /// Returns pointer to the mavlink forwarding link, or nullptr if it does not exist SharedLinkInterfacePtr mavlinkForwardingLink(); - /// Returns pointer to the mavlink support forwarding link, or nullptr if it does not exist - SharedLinkInterfacePtr mavlinkForwardingSupportLink(); - void disconnectAll(void); #ifdef QT_DEBUG @@ -142,7 +136,6 @@ public: signals: void commPortStringsChanged(); void commPortsChanged(); - void mavlinkSupportForwardingEnabledChanged(); private slots: void _linkDisconnected (void); @@ -157,7 +150,6 @@ private: void _addZeroConfAutoConnectLink (void); void _addMAVLinkForwardingLink (void); bool _isSerialPortConnected (void); - void _createDynamicForwardLink (const char* linkName, QString hostName); #ifndef NO_SERIAL_LINK bool _portAlreadyConnected (const QString& portName); @@ -198,10 +190,8 @@ private: static const char* _defaultUDPLinkName; static const char* _mavlinkForwardingLinkName; - static const char* _mavlinkForwardingSupportLinkName; static const int _autoconnectUpdateTimerMSecs; static const int _autoconnectConnectDelayMSecs; - bool _mavlinkSupportForwardingEnabled = false; }; diff --git a/src/comm/MAVLinkProtocol.cc b/src/comm/MAVLinkProtocol.cc index 93f17ba..6daef39 100644 --- a/src/comm/MAVLinkProtocol.cc +++ b/src/comm/MAVLinkProtocol.cc @@ -272,18 +272,6 @@ void MAVLinkProtocol::receiveBytes(LinkInterface* link, QByteArray b) } } - // MAVLink forwarding support - bool forwardingSupportEnabled = _linkMgr->mavlinkSupportForwardingEnabled(); - if (forwardingSupportEnabled) { - SharedLinkInterfacePtr forwardingSupportLink = _linkMgr->mavlinkForwardingSupportLink(); - - if (forwardingSupportLink) { - uint8_t buf[MAVLINK_MAX_PACKET_LEN]; - int len = mavlink_msg_to_send_buffer(buf, &_message); - forwardingSupportLink->writeBytesThreadSafe((const char*)buf, len); - } - } - //----------------------------------------------------------------- // Log data if (!_logSuspendError && !_logSuspendReplay && _tempLogFile.isOpen()) { diff --git a/src/comm/MockLink.cc b/src/comm/MockLink.cc index 025662f..1659c21 100644 --- a/src/comm/MockLink.cc +++ b/src/comm/MockLink.cc @@ -55,9 +55,6 @@ constexpr MAV_CMD MockLink::MAV_CMD_MOCKLINK_SECOND_ATTEMPT_RESULT_ACCEPTED; constexpr MAV_CMD MockLink::MAV_CMD_MOCKLINK_SECOND_ATTEMPT_RESULT_FAILED; constexpr MAV_CMD MockLink::MAV_CMD_MOCKLINK_NO_RESPONSE; constexpr MAV_CMD MockLink::MAV_CMD_MOCKLINK_NO_RESPONSE_NO_RETRY; -constexpr MAV_CMD MockLink::MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_ACCEPTED; -constexpr MAV_CMD MockLink::MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_FAILED; -constexpr MAV_CMD MockLink::MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_NO_ACK; // The LinkManager is only forward declared in the header, so a static_assert is here instead to ensure we update if the value changes. static_assert(LinkManager::invalidMavlinkChannel() == std::numeric_limits::max(), "update MockLink::_mavlinkAuxChannel"); @@ -202,23 +199,15 @@ void MockLink::run(void) QTimer timer1HzTasks; QTimer timer10HzTasks; QTimer timer500HzTasks; - QTimer timerStatusText; - QObject::connect(&timer1HzTasks, &QTimer::timeout, this, &MockLink::_run1HzTasks); - QObject::connect(&timer10HzTasks, &QTimer::timeout, this, &MockLink::_run10HzTasks); + QObject::connect(&timer1HzTasks, &QTimer::timeout, this, &MockLink::_run1HzTasks); + QObject::connect(&timer10HzTasks, &QTimer::timeout, this, &MockLink::_run10HzTasks); QObject::connect(&timer500HzTasks, &QTimer::timeout, this, &MockLink::_run500HzTasks); - QObject::connect(&timerStatusText, &QTimer::timeout, this, &MockLink::_sendStatusTextMessages); timer1HzTasks.start(1000); timer10HzTasks.start(100); timer500HzTasks.start(2); - // Wait a little bit for the ui to finish loading up before sending out status text messages - if (_sendStatusText) { - timerStatusText.setSingleShot(true); - timerStatusText.start(10000); - } - // Send first set right away _run1HzTasks(); _run10HzTasks(); @@ -253,6 +242,10 @@ void MockLink::_run1HzTasks(void) } else { _sendHomePosition(); } + if (_sendStatusText) { + _sendStatusText = false; + _sendStatusTextMessages(); + } } } } @@ -434,7 +427,7 @@ void MockLink::_sendSysStatus(void) 4200 * 4, // voltage_battery 8000, // current_battery _battery1PctRemaining, // battery_remaining - 0,0,0,0,0,0,0,0,0); + 0,0,0,0,0,0); respondWithMavlinkMessage(msg); } @@ -1055,53 +1048,6 @@ void MockLink::_handleFTP(const mavlink_message_t& msg) _mockLinkFTP->mavlinkMessageReceived(msg); } -void MockLink::_handleInProgressCommandLong(const mavlink_command_long_t& request) -{ - uint8_t commandResult = MAV_RESULT_UNSUPPORTED; - - switch (request.command) { - case MockLink::MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_ACCEPTED: - // Test command which sends in progress messages and then acceptance ack - commandResult = MAV_RESULT_ACCEPTED; - break; - case MockLink::MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_FAILED: - // Test command which sends in progress messages and then failure ack - commandResult = MAV_RESULT_FAILED; - break; - case MockLink::MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_NO_ACK: - // Test command which sends in progress messages and then never sends final result ack - break; - } - - mavlink_message_t commandAck; - - mavlink_msg_command_ack_pack_chan(_vehicleSystemId, - _vehicleComponentId, - mavlinkChannel(), - &commandAck, - request.command, - MAV_RESULT_IN_PROGRESS, - 1, // progress - 0, // result_param2 - 0, // target_system - 0); // target_component - respondWithMavlinkMessage(commandAck); - - if (request.command != MockLink::MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_NO_ACK) { - mavlink_msg_command_ack_pack_chan(_vehicleSystemId, - _vehicleComponentId, - mavlinkChannel(), - &commandAck, - request.command, - commandResult, - 0, // progress - 0, // result_param2 - 0, // target_system - 0); // target_component - respondWithMavlinkMessage(commandAck); - } -} - void MockLink::_handleCommandLong(const mavlink_message_t& msg) { static bool firstCmdUser3 = true; @@ -1113,7 +1059,7 @@ void MockLink::_handleCommandLong(const mavlink_message_t& msg) mavlink_msg_command_long_decode(&msg, &request); - _receivedMavCommandCountMap[static_cast(request.command)]++; + _sendMavCommandCountMap[static_cast(request.command)]++; switch (request.command) { case MAV_CMD_COMPONENT_ARM_DISARM: @@ -1161,7 +1107,7 @@ void MockLink::_handleCommandLong(const mavlink_message_t& msg) commandResult = MAV_RESULT_FAILED; break; case MAV_CMD_MOCKLINK_SECOND_ATTEMPT_RESULT_ACCEPTED: - // Test command which does not respond to first request and returns MAV_RESULT_ACCEPTED on second attempt + // Test command which returns MAV_RESULT_ACCEPTED on second attempt if (firstCmdUser3) { firstCmdUser3 = false; return; @@ -1171,7 +1117,7 @@ void MockLink::_handleCommandLong(const mavlink_message_t& msg) } break; case MAV_CMD_MOCKLINK_SECOND_ATTEMPT_RESULT_FAILED: - // Test command which does not respond to first request and returns MAV_RESULT_FAILED on second attempt + // Test command which returns MAV_RESULT_FAILED on second attempt if (firstCmdUser4) { firstCmdUser4 = false; return; @@ -1182,12 +1128,7 @@ void MockLink::_handleCommandLong(const mavlink_message_t& msg) break; case MAV_CMD_MOCKLINK_NO_RESPONSE: case MAV_CMD_MOCKLINK_NO_RESPONSE_NO_RETRY: - // Test command which never responds - return; - case MockLink::MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_ACCEPTED: - case MockLink::MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_FAILED: - case MockLink::MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_NO_ACK: - _handleInProgressCommandLong(request); + // No response return; } @@ -1740,7 +1681,7 @@ bool MockLink::_handleRequestMessage(const mavlink_command_long_t& request, bool } return true; - case MAVLINK_MSG_ID_COMPONENT_METADATA: + case MAVLINK_MSG_ID_COMPONENT_INFORMATION: if (_firmwareType == MAV_AUTOPILOT_PX4) { _sendGeneralMetaData(); return true; @@ -1777,18 +1718,21 @@ void MockLink::_sendGeneralMetaData(void) { mavlink_message_t responseMsg; #if 1 - char metaDataURI[MAVLINK_MSG_COMPONENT_METADATA_FIELD_URI_LEN] = "mftp://[;comp=1]general.json"; + char metaDataURI[MAVLINK_MSG_COMPONENT_INFORMATION_FIELD_GENERAL_METADATA_URI_LEN] = "mftp://[;comp=1]general.json"; #else - char metaDataURI[MAVLINK_MSG_COMPONENT_METADATA_FIELD_URI_LEN] = "https://bit.ly/31nm0fs"; + char metaDataURI[MAVLINK_MSG_COMPONENT_INFORMATION_FIELD_GENERAL_METADATA_URI_LEN] = "https://bit.ly/31nm0fs"; #endif + char peripheralsMetaDataURI[MAVLINK_MSG_COMPONENT_INFORMATION_FIELD_PERIPHERALS_METADATA_URI_LEN] = ""; - mavlink_msg_component_metadata_pack_chan(_vehicleSystemId, - _vehicleComponentId, - mavlinkChannel(), - &responseMsg, - 0, // time_boot_ms - 100, // general_metadata_file_crc - metaDataURI); + mavlink_msg_component_information_pack_chan(_vehicleSystemId, + _vehicleComponentId, + mavlinkChannel(), + &responseMsg, + 0, // time_boot_ms + 100, // general_metadata_file_crc + metaDataURI, + 0, // peripherals_metadata_file_crc + peripheralsMetaDataURI); respondWithMavlinkMessage(responseMsg); } diff --git a/src/comm/MockLink.h b/src/comm/MockLink.h index dca13e9..a729fb0 100644 --- a/src/comm/MockLink.h +++ b/src/comm/MockLink.h @@ -162,19 +162,16 @@ public: static MockLink* startAPMArduSubMockLink (bool sendStatusText, MockConfiguration::FailureMode_t failureMode = MockConfiguration::FailNone); static MockLink* startAPMArduRoverMockLink (bool sendStatusText, MockConfiguration::FailureMode_t failureMode = MockConfiguration::FailNone); - // Special commands for testing Vehicle::sendMavCommandWithHandler + // Special commands for testing COMMAND_LONG handlers. By default all commands except for MAV_CMD_MOCKLINK_NO_RESPONSE_NO_RETRY should retry. static constexpr MAV_CMD MAV_CMD_MOCKLINK_ALWAYS_RESULT_ACCEPTED = MAV_CMD_USER_1; static constexpr MAV_CMD MAV_CMD_MOCKLINK_ALWAYS_RESULT_FAILED = MAV_CMD_USER_2; static constexpr MAV_CMD MAV_CMD_MOCKLINK_SECOND_ATTEMPT_RESULT_ACCEPTED = MAV_CMD_USER_3; static constexpr MAV_CMD MAV_CMD_MOCKLINK_SECOND_ATTEMPT_RESULT_FAILED = MAV_CMD_USER_4; static constexpr MAV_CMD MAV_CMD_MOCKLINK_NO_RESPONSE = MAV_CMD_USER_5; static constexpr MAV_CMD MAV_CMD_MOCKLINK_NO_RESPONSE_NO_RETRY = static_cast(MAV_CMD_USER_5 + 1); - static constexpr MAV_CMD MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_ACCEPTED = static_cast(MAV_CMD_USER_5 + 2); - static constexpr MAV_CMD MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_FAILED = static_cast(MAV_CMD_USER_5 + 3); - static constexpr MAV_CMD MAV_CMD_MOCKLINK_RESULT_IN_PROGRESS_NO_ACK = static_cast(MAV_CMD_USER_5 + 4); - void clearReceivedMavCommandCounts(void) { _receivedMavCommandCountMap.clear(); } - int receivedMavCommandCount(MAV_CMD command) { return _receivedMavCommandCountMap[command]; } + void clearSendMavCommandCounts(void) { _sendMavCommandCountMap.clear(); } + int sendMavCommandCount(MAV_CMD command) { return _sendMavCommandCountMap[command]; } typedef enum { FailRequestMessageNone, @@ -192,11 +189,10 @@ private slots: // LinkInterface overrides void _writeBytes(const QByteArray bytes) final; - void _writeBytesQueued (const QByteArray bytes); - void _run1HzTasks (void); - void _run10HzTasks (void); - void _run500HzTasks (void); - void _sendStatusTextMessages(void); + void _writeBytesQueued(const QByteArray bytes); + void _run1HzTasks(void); + void _run10HzTasks(void); + void _run500HzTasks(void); private: // LinkInterface overrides @@ -223,7 +219,6 @@ private: void _handleParamRequestRead (const mavlink_message_t& msg); void _handleFTP (const mavlink_message_t& msg); void _handleCommandLong (const mavlink_message_t& msg); - void _handleInProgressCommandLong (const mavlink_command_long_t& request); void _handleManualControl (const mavlink_message_t& msg); void _handlePreFlightCalibration (const mavlink_command_long_t& request); void _handleLogRequestList (const mavlink_message_t& msg); @@ -237,6 +232,7 @@ private: void _sendVibration (void); void _sendSysStatus (void); void _sendBatteryStatus (void); + void _sendStatusTextMessages (void); void _sendChunkedStatusText (uint16_t chunkId, bool missingChunks); void _respondWithAutopilotVersion (void); void _sendRCChannels (void); @@ -314,7 +310,7 @@ private: RequestMessageFailureMode_t _requestMessageFailureMode = FailRequestMessageNone; - QMap _receivedMavCommandCountMap; + QMap _sendMavCommandCountMap; QMap> _mapParamName2Value; QMap> _mapParamName2MavParamType; diff --git a/src/comm/MockLinkFTP.cc b/src/comm/MockLinkFTP.cc index d8fba00..e531f51 100644 --- a/src/comm/MockLinkFTP.cc +++ b/src/comm/MockLinkFTP.cc @@ -125,8 +125,6 @@ void MockLinkFTP::_openCommand(uint8_t senderSystemId, uint8_t senderComponentId tmpFilename = ":MockLink/Parameter.MetaData.json"; } else if (path == "/parameter.json.xz") { tmpFilename = ":MockLink/Parameter.MetaData.json.xz"; - } else if (_BinParamFileEnabled && path == "@PARAM/param.pck") { - tmpFilename = ":MockLink/Arduplane.params.ftp.bin"; } if (!tmpFilename.isEmpty()) { @@ -146,8 +144,7 @@ void MockLinkFTP::_openCommand(uint8_t senderSystemId, uint8_t senderComponentId // Data contains file length response.hdr.size = sizeof(uint32_t); - /* Ardupilot sends constant wrong file size for parameter file due to dynamic on the fly generation */ - response.openFileLength = (path == "@PARAM/param.pck" ? 1024*1024 : _currentFile.size()); + response.openFileLength = _currentFile.size(); _sendResponse(senderSystemId, senderComponentId, &response, outgoingSeqNumber); } diff --git a/src/comm/MockLinkFTP.h b/src/comm/MockLinkFTP.h index 24fa784..3cab8e1 100644 --- a/src/comm/MockLinkFTP.h +++ b/src/comm/MockLinkFTP.h @@ -54,7 +54,6 @@ public: void mavlinkMessageReceived(const mavlink_message_t& message); void enableRandromDrops(bool enable) { _randomDropsEnabled = enable; } - void enableBinParamFile(bool enable) { _BinParamFileEnabled = enable; } static const char* sizeFilenamePrefix; @@ -93,7 +92,6 @@ private: uint16_t _lastReplySequence = 0; mavlink_message_t _lastReply; bool _randomDropsEnabled = false; - bool _BinParamFileEnabled = false; static const uint8_t _sessionId = 1; ///< We only support a single fixed session }; diff --git a/src/comm/MockLinkOptionsDlg.qml b/src/comm/MockLinkOptionsDlg.qml index 079de09..be9fb77 100644 --- a/src/comm/MockLinkOptionsDlg.qml +++ b/src/comm/MockLinkOptionsDlg.qml @@ -23,7 +23,7 @@ QGCPopupDialog { title: qsTr("MockLink Options") buttons: StandardButton.Close - property var link + property var link: dialogProperties.link ColumnLayout { spacing: ScreenTools.defaultFontPixelHeight / 2 @@ -33,7 +33,7 @@ QGCPopupDialog { text: qsTr("Stop Heartbeats") onClicked: { link.setCommLost(true) - close() + reject() } } @@ -42,7 +42,7 @@ QGCPopupDialog { text: qsTr("Start Heartbeats") onClicked: { link.setCommLost(false) - close() + reject() } } @@ -51,7 +51,7 @@ QGCPopupDialog { text: qsTr("Connection Removed") onClicked: { link.simulateConnectionRemoved() - close() + reject() } } } diff --git a/src/comm/Mocklink.Arduplane.params.ftp.bin b/src/comm/Mocklink.Arduplane.params.ftp.bin deleted file mode 100644 index a38a672..0000000 Binary files a/src/comm/Mocklink.Arduplane.params.ftp.bin and /dev/null differ diff --git a/src/comm/QGCMAVLink.cc b/src/comm/QGCMAVLink.cc index 2f20bc2..bf9188d 100644 --- a/src/comm/QGCMAVLink.cc +++ b/src/comm/QGCMAVLink.cc @@ -125,12 +125,12 @@ QGCMAVLink::VehicleClass_t QGCMAVLink::vehicleClass(MAV_TYPE mavType) case MAV_TYPE_OCTOROTOR: case MAV_TYPE_TRICOPTER: return VehicleClassMultiRotor; - case MAV_TYPE_VTOL_TAILSITTER_DUOROTOR: - case MAV_TYPE_VTOL_TAILSITTER_QUADROTOR: + case MAV_TYPE_VTOL_DUOROTOR: + case MAV_TYPE_VTOL_QUADROTOR: case MAV_TYPE_VTOL_TILTROTOR: - case MAV_TYPE_VTOL_FIXEDROTOR: - case MAV_TYPE_VTOL_TAILSITTER: - case MAV_TYPE_VTOL_TILTWING: + case MAV_TYPE_VTOL_RESERVED2: + case MAV_TYPE_VTOL_RESERVED3: + case MAV_TYPE_VTOL_RESERVED4: case MAV_TYPE_VTOL_RESERVED5: return VehicleClassVTOL; case MAV_TYPE_FIXED_WING: @@ -222,7 +222,6 @@ QString QGCMAVLink::mavSysStatusSensorToString(MAV_SYS_STATUS_SENSOR sysStatusSe { MAV_SYS_STATUS_SENSOR_SATCOM, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Satellite Communication") }, { MAV_SYS_STATUS_PREARM_CHECK, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Pre-Arm Check") }, { MAV_SYS_STATUS_OBSTACLE_AVOIDANCE, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Avoidance/collision prevention") }, - { MAV_SYS_STATUS_SENSOR_PROPULSION, QT_TRANSLATE_NOOP("MAVLink SYS_STATUS_SENSOR value", "Propulsion") } }; for (size_t i=0; i QGCSerialPortInfo::availablePorts(void) VidPidPair_t vidPid(portInfo.vendorIdentifier(), portInfo.productIdentifier()); if (seenSerialNumbers.contains(vidPid) && seenSerialNumbers[vidPid].contains(portInfo.serialNumber())) { // Some boards are a composite USB device, with the first port being mavlink and the second something else. We only expose to first mavlink port. - // However internal NMEA devices can present like this, so dont skip anything with NMEA in description - if(!portInfo.description().contains("NMEA")) - { - qCDebug(QGCSerialPortInfoLog) << "Skipping secondary port on same device" << portInfo.portName() << portInfo.vendorIdentifier() << portInfo.productIdentifier() << portInfo.serialNumber(); - continue; - } + qCDebug(QGCSerialPortInfoLog) << "Skipping secondary port on same device" << portInfo.portName() << portInfo.vendorIdentifier() << portInfo.productIdentifier() << portInfo.serialNumber(); + continue; } seenSerialNumbers[vidPid].append(portInfo.serialNumber()); } diff --git a/src/comm/SerialLink.cc b/src/comm/SerialLink.cc index 8527212..ca523ef 100644 --- a/src/comm/SerialLink.cc +++ b/src/comm/SerialLink.cc @@ -177,11 +177,7 @@ bool SerialLink::_hardwareConnect(QSerialPort::SerialPortError& error, QString& _port = new QSerialPort(_serialConfig->portName(), this); -#ifdef Q_OS_ANDROID - QObject::connect(_port, SIGNAL(&QSerialPort::error), this, SLOT(&SerialLink::linkError)); -#else - QObject::connect(_port, &QSerialPort::errorOccurred, this, &SerialLink::linkError); -#endif + QObject::connect(_port, static_cast(&QSerialPort::error), this, &SerialLink::linkError); QObject::connect(_port, &QIODevice::readyRead, this, &SerialLink::_readBytes); // After the bootloader times out, it still can take a second or so for the Pixhawk USB driver to come up and make diff --git a/src/comm/TCPLink.cc b/src/comm/TCPLink.cc index d932bda..6eafbc3 100644 --- a/src/comm/TCPLink.cc +++ b/src/comm/TCPLink.cc @@ -50,7 +50,7 @@ void TCPLink::_writeDebugBytes(const QByteArray data) ascii.append(219); } } - qDebug() << "Sent" << size << "bytes to" << _tcpConfig->host() << ":" << _tcpConfig->port() << "data:"; + qDebug() << "Sent" << size << "bytes to" << _tcpConfig->address().toString() << ":" << _tcpConfig->port() << "data:"; qDebug() << bytes; qDebug() << "ASCII:" << ascii; } @@ -117,7 +117,7 @@ bool TCPLink::_hardwareConnect() QSignalSpy errorSpy(_socket, &QAbstractSocket::errorOccurred); QObject::connect(_socket, &QAbstractSocket::errorOccurred, this, &TCPLink::_socketError); - _socket->connectToHost(_tcpConfig->host(), _tcpConfig->port()); + _socket->connectToHost(_tcpConfig->address(), _tcpConfig->port()); // Give the socket a second to connect to the other side otherwise error out if (!_socket->waitForConnected(1000)) @@ -155,16 +155,48 @@ bool TCPLink::isConnected() const //-------------------------------------------------------------------------- //-- TCPConfiguration +static bool is_ip(const QString& address) +{ + int a,b,c,d; + if (sscanf(address.toStdString().c_str(), "%d.%d.%d.%d", &a, &b, &c, &d) != 4 + && strcmp("::1", address.toStdString().c_str())) { + return false; + } else { + return true; + } +} + +static QString get_ip_address(const QString& address) +{ + if(is_ip(address)) + return address; + // Need to look it up + QHostInfo info = QHostInfo::fromName(address); + if (info.error() == QHostInfo::NoError) + { + QList hostAddresses = info.addresses(); + for (int i = 0; i < hostAddresses.size(); i++) + { + // Exclude all IPv6 addresses + if (!hostAddresses.at(i).toString().contains(":")) + { + return hostAddresses.at(i).toString(); + } + } + } + return {}; +} + TCPConfiguration::TCPConfiguration(const QString& name) : LinkConfiguration(name) { _port = QGC_TCP_PORT; - _host = QLatin1String("0.0.0.0"); + _address = QHostAddress::Any; } TCPConfiguration::TCPConfiguration(TCPConfiguration* source) : LinkConfiguration(source) { _port = source->port(); - _host = source->host(); + _address = source->address(); } void TCPConfiguration::copyFrom(LinkConfiguration *source) @@ -173,7 +205,7 @@ void TCPConfiguration::copyFrom(LinkConfiguration *source) auto* usource = qobject_cast(source); Q_ASSERT(usource != nullptr); _port = usource->port(); - _host = usource->host(); + _address = usource->address(); } void TCPConfiguration::setPort(quint16 port) @@ -181,16 +213,26 @@ void TCPConfiguration::setPort(quint16 port) _port = port; } +void TCPConfiguration::setAddress(const QHostAddress& address) +{ + _address = address; +} + void TCPConfiguration::setHost(const QString host) { - _host = host; + QString ipAdd = get_ip_address(host); + if(ipAdd.isEmpty()) { + qWarning() << "TCP:" << "Could not resolve host:" << host; + } else { + _address = QHostAddress(ipAdd); + } } void TCPConfiguration::saveSettings(QSettings& settings, const QString& root) { settings.beginGroup(root); settings.setValue("port", (int)_port); - settings.setValue("host", _host); + settings.setValue("host", address().toString()); settings.endGroup(); } @@ -198,6 +240,7 @@ void TCPConfiguration::loadSettings(QSettings& settings, const QString& root) { settings.beginGroup(root); _port = (quint16)settings.value("port", QGC_TCP_PORT).toUInt(); - _host = settings.value("host", _host).toString(); + QString address = settings.value("host", _address.toString()).toString(); + _address = QHostAddress(address); settings.endGroup(); } diff --git a/src/comm/TCPLink.h b/src/comm/TCPLink.h index d7f0fc4..489d8bd 100644 --- a/src/comm/TCPLink.h +++ b/src/comm/TCPLink.h @@ -43,8 +43,10 @@ public: TCPConfiguration(TCPConfiguration* source); quint16 port (void) const { return _port; } - QString host (void) const { return _host; } + const QHostAddress& address (void) { return _address; } + const QString host (void) { return _address.toString(); } void setPort (quint16 port); + void setAddress (const QHostAddress& address); void setHost (const QString host); //LinkConfiguration overrides @@ -60,7 +62,7 @@ signals: void hostChanged(void); private: - QString _host; + QHostAddress _address; quint16 _port; }; diff --git a/src/comm/USBBoardInfo.json b/src/comm/USBBoardInfo.json index 813a5cb..cba910b 100644 --- a/src/comm/USBBoardInfo.json +++ b/src/comm/USBBoardInfo.json @@ -17,16 +17,13 @@ { "vendorID": 7052, "productID": 54, "boardClass": "Pixhawk", "name": "PX4 FMU V6U" }, { "vendorID": 12677, "productID": 53, "boardClass": "Pixhawk", "name": "PX4 FMU V6X" }, { "vendorID": 12677, "productID": 56, "boardClass": "Pixhawk", "name": "PX4 FMU V6C" }, - { "vendorID": 13891, "productID": 29, "boardClass": "Pixhawk", "name": "PX4 FMU V6X-RT" }, { "vendorID": 9900, "productID": 64, "boardClass": "Pixhawk", "name": "TAP V1" }, { "vendorID": 9900, "productID": 65, "boardClass": "Pixhawk", "name": "ASC V1" }, { "vendorID": 9900, "productID": 22, "boardClass": "Pixhawk", "name": "Crazyflie 2" }, { "vendorID": 9900, "productID": 1, "boardClass": "Pixhawk", "name": "Omnibus F4 SD" }, { "vendorID": 8137, "productID": 28, "boardClass": "Pixhawk", "name": "PX4 FMUK66 v3.x" }, { "vendorID": 1155, "productID": 41775, "boardClass": "Pixhawk", "name": "PX4 FMU ModalAI FCv1" }, - { "vendorID": 1155, "productID": 41776, "boardClass": "Pixhawk", "name": "PX4 FMU ModalAI FCv2" }, { "vendorID":12642, "productID": 75, "boardClass": "Pixhawk", "name": "PX4 DurandalV1" }, - { "vendorID":12642, "productID": 80, "boardClass": "Pixhawk", "name": "Holybro Kakute Flight Controller" }, { "vendorID": 4104, "productID": 1, "boardClass": "Pixhawk", "name": "PX4 FMU UVify Core" }, { "vendorID": 12643, "productID": 76, "boardClass": "Pixhawk", "name": "CUAV Flight Controller" }, { "vendorID": 1155, "productID": 55, "boardClass": "Pixhawk", "name": "PX4 FMU SmartAP AIRLink" }, @@ -38,10 +35,7 @@ { "vendorID": 12642, "productID": 0, "boardClass": "Pixhawk", "name": "Holybro" }, - { "vendorID": 11694, "productID": 0, "boardClass": "Pixhawk", "name": "CubePilot" }, - - { "vendorID": 13735, "productID": 1, "boardClass": "Pixhawk", "name": "ThePeach FCC-K1" }, - { "vendorID": 13735, "productID": 2, "boardClass": "Pixhawk", "name": "ThePeach FCC-R1" }, + { "vendorID": 11694, "productID": 0, "boardClass": "Pixhawk", "name": "Hex/ProfiCNC" }, { "vendorID": 9900, "productID": 21, "boardClass": "PX4 Flow", "name": "PX4 Flow" }, @@ -64,8 +58,6 @@ { "regExp": "^PX4 BL FMU v6U.x$", "boardClass": "Pixhawk" }, { "regExp": "^PX4 FMU v6X.x$", "boardClass": "Pixhawk" }, { "regExp": "^PX4 BL FMU v6X.x$", "boardClass": "Pixhawk" }, - { "regExp": "^PX4 FMU v6XRT.x$", "boardClass": "Pixhawk" }, - { "regExp": "^PX4 BL FMU v6XRT.x$", "boardClass": "Pixhawk" }, { "regExp": "^PX4 FMU v5X.x$", "boardClass": "Pixhawk" }, { "regExp": "^PX4 BL FMU v5X.x$", "boardClass": "Pixhawk" }, { "regExp": "^PX4 FMU v5.x$", "boardClass": "Pixhawk" }, diff --git a/src/qgcunittest/CMakeLists.txt b/src/qgcunittest/CMakeLists.txt index 9de2956..c1228f2 100644 --- a/src/qgcunittest/CMakeLists.txt +++ b/src/qgcunittest/CMakeLists.txt @@ -6,8 +6,6 @@ add_library(qgcunittest #FileManagerTest.h ComponentInformationCacheTest.cc ComponentInformationCacheTest.h - ComponentInformationTranslationTest.cc - ComponentInformationTranslationTest.h GeoTest.cc GeoTest.h #MainWindowTest.cc diff --git a/src/qgcunittest/ComponentInformationTranslationTest.cc b/src/qgcunittest/ComponentInformationTranslationTest.cc deleted file mode 100644 index 3e1c477..0000000 --- a/src/qgcunittest/ComponentInformationTranslationTest.cc +++ /dev/null @@ -1,46 +0,0 @@ -/**************************************************************************** - * - * (c) 2021 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - - -#include "ComponentInformationTranslationTest.h" - -void ComponentInformationTranslationTest::_basic_test() -{ - QString translationJson = ":/unittest/TranslationTest.json"; - QString translationTs = ":/unittest/TranslationTest_de_DE.ts"; - ComponentInformationTranslation* translation = new ComponentInformationTranslation(this, new QGCCachedFileDownload(this, "")); - QString tempFilename = translation->translateJsonUsingTS(translationJson, translationTs); - - QVERIFY(!tempFilename.isEmpty()); - - // Compare json files - QFile translationJsonFile(translationJson); - QVERIFY(translationJsonFile.open(QFile::ReadOnly | QFile::Text)); - QByteArray expectedOutput = translationJsonFile.readAll().replace("translate-me", "TRANSLATED"); - - QJsonDocument expectedJson; - readJson(expectedOutput, expectedJson); - - QFile tempJson(tempFilename); - QVERIFY(tempJson.open(QFile::ReadOnly | QFile::Text)); - QByteArray translatedOutput = tempJson.readAll(); - QJsonDocument translatedJson; - readJson(translatedOutput, translatedJson); - - QVERIFY(expectedJson == translatedJson); -} - -void ComponentInformationTranslationTest::readJson(const QByteArray& bytes, QJsonDocument& jsonDoc) -{ - QJsonParseError parseError; - jsonDoc = QJsonDocument::fromJson(bytes, &parseError); - QTEST_ASSERT(parseError.error == QJsonParseError::NoError); - QVERIFY(!jsonDoc.isEmpty()); -} - diff --git a/src/qgcunittest/ComponentInformationTranslationTest.h b/src/qgcunittest/ComponentInformationTranslationTest.h deleted file mode 100644 index e1d9908..0000000 --- a/src/qgcunittest/ComponentInformationTranslationTest.h +++ /dev/null @@ -1,34 +0,0 @@ -/**************************************************************************** - * - * (c) 2021 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - - -#pragma once - -#include "ComponentInformationTranslation.h" - -#include "UnitTest.h" - -#include -#include -#include - -class ComponentInformationTranslationTest : public UnitTest -{ - Q_OBJECT - -public: - ComponentInformationTranslationTest() = default; - virtual ~ComponentInformationTranslationTest() = default; - -private slots: - void _basic_test(); -private: - void readJson(const QByteArray& bytes, QJsonDocument& jsonDoc); -}; - diff --git a/src/qgcunittest/RadioConfigTest.cc b/src/qgcunittest/RadioConfigTest.cc index f60a4bd..123b7a5 100644 --- a/src/qgcunittest/RadioConfigTest.cc +++ b/src/qgcunittest/RadioConfigTest.cc @@ -365,6 +365,16 @@ void RadioConfigTest::_fullCalibrationWorker(MAV_AUTOPILOT firmwareType) for (int channel=0; channel<_chanMax(); channel++) { if (_channelSettings()[channel].function == function) { + if (_px4Vehicle()) { + // Make sure this function isn't being use for a switch + QStringList switchList; + switchList << "RC_MAP_MODE_SW" << "RC_MAP_LOITER_SW" << "RC_MAP_RETURN_SW" << "RC_MAP_POSCTL_SW" << "RC_MAP_ACRO_SW"; + + for (const QString &switchParam: switchList) { + Q_ASSERT(_vehicle->parameterManager()->getParameter(FactSystem::defaultComponentId, switchParam)->rawValue().toInt() != channel + 1); + } + } + _rgFunctionChannelMap[function] = channel; found = true; diff --git a/src/qgcunittest/TranslationTest.json b/src/qgcunittest/TranslationTest.json deleted file mode 100644 index cb24643..0000000 --- a/src/qgcunittest/TranslationTest.json +++ /dev/null @@ -1,151 +0,0 @@ -{ - "version": 1, - "translation": { - "items": { - "first_element": { - "items": { - "first_list_element": { - "list": { - "key": "name", - "translate": ["label", "text"] - } - }, - "second_list_element": { - "list": { - "translate": ["label", "text"] - } - }, - "object1": { - "translate": ["list_of_strings"] - }, - "object2": { - "items": { - "*": { - "translate": ["name"] - } - } - } - } - }, - "second_element": { - "items": { - "*": { - "translate-global": ["category"] - } - } - }, - "third_element": { - "items": { - "subgroups": { - "$ref": "#/$defs/recursive-def" - } - } - } - }, - "$defs": { - "recursive-def": { - "list": { - "translate": ["description"], - "items": { - "subgroups": { - "$ref": "#/$defs/recursive-def" - } - } - } - } - } - }, - - "first_element": { - "first_list_element": [ - { - "name": "1. element", - "label": "translate-me-list1-1.0", - "text": "translate-me-list1-1.1" - }, - { - "name": "2. element", - "label": "translate-me-list1-2.0", - "text": "translate-me-list1-2.1" - }, - { - "name": "3. element", - "label": "translate-me-list1-3.0", - "text": "translate-me-list1-3.1" - } - ], - "second_list_element": [ - { - "name": "1. element", - "label": "translate-me-list2-1.0", - "text": "translate-me-list2-1.1" - }, - { - "name": "2. element", - "label": "translate-me-list2-2.0", - "text": "translate-me-list2-2.1" - }, - { - "name": "3. element", - "label": "translate-me-list2-3.0", - "text": "translate-me-list2-3.1" - } - ], - "object1": { - "list_of_strings": ["translate-me-list-of-strings-1", "translate-me-list-of-strings-2", "translate-me-list-of-strings-3"] - }, - "object2": { - "key1": { - "name": "translate-me-name1" - }, - "key2": { - "name": "translate-me-name2" - }, - "key3": { - "name": "translate-me-name3" - } - } - }, - "second_element": { - "element1": { - "category": "translate-me-global-cat1" - }, - "element2": { - "category": "translate-me-global-cat2" - }, - "element3": { - "category": "translate-me-global-cat1" - }, - "element4": { - "category": "translate-me-global-cat2" - }, - "element5": { - "category": "translate-me-global-cat <> special symbol" - } - }, - "third_element": { - "subgroups": [ - { - "description": "translate-me-subgroup1", - "subgroups": [ - { - "description": "translate-me-subgroup1-1", - "subgroups": [ - { - "description": "translate-me-subgroup1-1-1" - } - ] - }, - { - "description": "translate-me-subgroup1-2", - "subgroups": [ - { - "description": "translate-me-subgroup1-2-1" - } - ] - } - ] - } - ] - } -} diff --git a/src/qgcunittest/TranslationTest_de_DE.ts b/src/qgcunittest/TranslationTest_de_DE.ts deleted file mode 100644 index 5666215..0000000 --- a/src/qgcunittest/TranslationTest_de_DE.ts +++ /dev/null @@ -1,186 +0,0 @@ - - - - - /first_element/first_list_element/1. element/label - - translate-me-list1-1.0 - TRANSLATED-list1-1.0 - - - - /first_element/first_list_element/1. element/text - - translate-me-list1-1.1 - TRANSLATED-list1-1.1 - - - - /first_element/first_list_element/2. element/label - - translate-me-list1-2.0 - TRANSLATED-list1-2.0 - - - - /first_element/first_list_element/2. element/text - - translate-me-list1-2.1 - TRANSLATED-list1-2.1 - - - - /first_element/first_list_element/3. element/label - - translate-me-list1-3.0 - TRANSLATED-list1-3.0 - - - - /first_element/first_list_element/3. element/text - - translate-me-list1-3.1 - TRANSLATED-list1-3.1 - - - - /first_element/second_list_element/0/label - - translate-me-list2-1.0 - TRANSLATED-list2-1.0 - - - - /first_element/second_list_element/0/text - - translate-me-list2-1.1 - TRANSLATED-list2-1.1 - - - - /first_element/second_list_element/1/label - - translate-me-list2-2.0 - TRANSLATED-list2-2.0 - - - - /first_element/second_list_element/1/text - - translate-me-list2-2.1 - TRANSLATED-list2-2.1 - - - - /first_element/second_list_element/2/label - - translate-me-list2-3.0 - TRANSLATED-list2-3.0 - - - - /first_element/second_list_element/2/text - - translate-me-list2-3.1 - TRANSLATED-list2-3.1 - - - - /first_element/object1/list_of_strings/0 - - translate-me-list-of-strings-1 - TRANSLATED-list-of-strings-1 - - - - /first_element/object1/list_of_strings/1 - - translate-me-list-of-strings-2 - TRANSLATED-list-of-strings-2 - - - - /first_element/object1/list_of_strings/2 - - translate-me-list-of-strings-3 - TRANSLATED-list-of-strings-3 - - - - /first_element/object2/key1/name - - translate-me-name1 - TRANSLATED-name1 - - - - /first_element/object2/key2/name - - translate-me-name2 - TRANSLATED-name2 - - - - /first_element/object2/key3/name - - translate-me-name3 - TRANSLATED-name3 - - - - /third_element/subgroups/0/description - - translate-me-subgroup1 - TRANSLATED-subgroup1 - - - - /third_element/subgroups/0/subgroups/0/description - - translate-me-subgroup1-1 - TRANSLATED-subgroup1-1 - - - - /third_element/subgroups/0/subgroups/0/subgroups/0/description - - translate-me-subgroup1-1-1 - TRANSLATED-subgroup1-1-1 - - - - /third_element/subgroups/0/subgroups/1/description - - translate-me-subgroup1-2 - TRANSLATED-subgroup1-2 - - - - /third_element/subgroups/0/subgroups/1/subgroups/0/description - - translate-me-subgroup1-2-1 - TRANSLATED-subgroup1-2-1 - - - - $globals/category/translate-me-global-cat <> special symbol - - translate-me-global-cat <> special symbol - TRANSLATED-global-cat <> special symbol - - - - $globals/category/translate-me-global-cat2 - - translate-me-global-cat2 - TRANSLATED-global-cat2 - - - - $globals/category/translate-me-global-cat1 - - translate-me-global-cat1 - TRANSLATED-global-cat1 - - - diff --git a/src/qgcunittest/UnitTestList.cc b/src/qgcunittest/UnitTestList.cc index ec912e8..222c49f 100644 --- a/src/qgcunittest/UnitTestList.cc +++ b/src/qgcunittest/UnitTestList.cc @@ -12,7 +12,6 @@ // ones are enabled/disabled #include "ComponentInformationCacheTest.h" -#include "ComponentInformationTranslationTest.h" #include "FactSystemTestGeneric.h" #include "FactSystemTestPX4.h" //#include "FileDialogTest.h" @@ -53,7 +52,6 @@ #include "InitialConnectTest.h" UT_REGISTER_TEST(ComponentInformationCacheTest) -UT_REGISTER_TEST(ComponentInformationTranslationTest) UT_REGISTER_TEST(FactSystemTestGeneric) UT_REGISTER_TEST(FactSystemTestPX4) //UT_REGISTER_TEST(FileDialogTest) diff --git a/src/uas/UASMessageHandler.cc b/src/uas/UASMessageHandler.cc index 13e9539..f801cfd 100644 --- a/src/uas/UASMessageHandler.cc +++ b/src/uas/UASMessageHandler.cc @@ -103,19 +103,13 @@ void UASMessageHandler::_activeVehicleChanged(Vehicle* vehicle) } } -void UASMessageHandler::handleTextMessage(int, int compId, int severity, QString text, QString description) +void UASMessageHandler::handleTextMessage(int, int compId, int severity, QString text) { // Hack to prevent calibration messages from cluttering things up if (_activeVehicle->px4Firmware() && text.startsWith(QStringLiteral("[cal] "))) { return; } - text = text.replace("\n", "
"); - // TODO: handle text + description separately in the UI - if (!description.isEmpty()) { - text += "
" + description.replace("\n", "
") + "
"; - } - // Color the output depending on the message severity. We have 3 distinct cases: // 1: If we have an ERROR or worse, make it bigger, bolder, and highlight it red. // 2: If we have a warning or notice, just make it bold and color it orange. @@ -195,6 +189,10 @@ void UASMessageHandler::handleTextMessage(int, int compId, int severity, QString } message->_setFormatedText(QString("[%2%3]%4 %5
").arg(style).arg(dateString).arg(compString).arg(severityText).arg(text)); + if (message->severityIsError()) { + _latestError = severityText + " " + text; + } + _mutex.unlock(); emit textMessageReceived(message); diff --git a/src/uas/UASMessageHandler.h b/src/uas/UASMessageHandler.h index 6cb329d..402eccd 100644 --- a/src/uas/UASMessageHandler.h +++ b/src/uas/UASMessageHandler.h @@ -37,7 +37,7 @@ public: */ int getSeverity() const { return _severity; } /** - * @brief Get (html escaped) message text (e.g. "[pm] sending list") + * @brief Get message text (e.g. "[pm] sending list") */ QString getText() { return _text; } /** @@ -98,6 +98,10 @@ public: * @brief Get normal message count (Resets count once read) */ int getNormalCount(); + /** + * @brief Get latest error message + */ + QString getLatestError() { return _latestError; } /// Begin to show message which are errors in the toolbar void showErrorsInToolbar(void) { _showErrorsInToolbar = true; } @@ -111,10 +115,9 @@ public slots: * @param uasid UAS Id * @param componentid Component Id * @param severity Message severity - * @param text Message Text (html escaped) - * @param description Optional detailed description (html escaped) + * @param text Message Text */ - void handleTextMessage(int uasid, int componentid, int severity, QString text, QString description); + void handleTextMessage(int uasid, int componentid, int severity, QString text); signals: /** @@ -141,6 +144,7 @@ private: int _errorCountTotal; int _warningCount; int _normalCount; + QString _latestError; bool _showErrorsInToolbar; MultiVehicleManager* _multiVehicleManager; }; diff --git a/src/ui/AppSettings.qml b/src/ui/AppSettings.qml index ded4121..b7a717c 100644 --- a/src/ui/AppSettings.qml +++ b/src/ui/AppSettings.qml @@ -30,18 +30,11 @@ Rectangle { property bool _first: true - property bool _commingFromRIDSettings: false - QGCPalette { id: qgcPal } Component.onCompleted: { //-- Default Settings - if (globals.commingFromRIDIndicator) { - __rightPanel.source = "qrc:/qml/RemoteIDSettings.qml" - globals.commingFromRIDIndicator = false - } else { - __rightPanel.source = QGroundControl.corePlugin.settingsPages[QGroundControl.corePlugin.defaultSettings].url - } + __rightPanel.source = QGroundControl.corePlugin.settingsPages[QGroundControl.corePlugin.defaultSettings].url } QGCFlickable { @@ -69,7 +62,6 @@ Rectangle { text: modelData.title autoExclusive: true Layout.fillWidth: true - visible: modelData.url != "qrc:/qml/RemoteIDSettings.qml" ? true : QGroundControl.settingsManager.remoteIDSettings.enable.rawValue onClicked: { if (mainWindow.preventViewSwitch()) { @@ -82,20 +74,10 @@ Rectangle { } Component.onCompleted: { - if (globals.commingFromRIDIndicator) { - _commingFromRIDSettings = true - } if(_first) { _first = false checked = true } - if (_commingFromRIDSettings) { - checked = false - _commingFromRIDSettings = false - if (modelData.url == "qrc:/qml/RemoteIDSettings.qml") { - checked = true - } - } } } } diff --git a/src/ui/MainRootWindow.qml b/src/ui/MainRootWindow.qml index 93274b3..a8d5ece 100644 --- a/src/ui/MainRootWindow.qml +++ b/src/ui/MainRootWindow.qml @@ -48,6 +48,8 @@ ApplicationWindow { property var rgPromptIds: QGroundControl.corePlugin.firstRunPromptsToShow() property int nextPromptIdIndex: 0 + onRgPromptIdsChanged: console.log(QGroundControl.corePlugin, QGroundControl.corePlugin.firstRunPromptsToShow()) + function clearNextPromptSignal() { if (currentDialog) { currentDialog.closed.disconnect(nextPrompt) @@ -56,10 +58,8 @@ ApplicationWindow { function nextPrompt() { if (nextPromptIdIndex < rgPromptIds.length) { - var component = Qt.createComponent(QGroundControl.corePlugin.firstRunPromptResource(rgPromptIds[nextPromptIdIndex])); - currentDialog = component.createObject(mainWindow) + currentDialog = showPopupDialogFromSource(QGroundControl.corePlugin.firstRunPromptResource(rgPromptIds[nextPromptIdIndex])) currentDialog.closed.connect(nextPrompt) - currentDialog.open() nextPromptIdIndex++ } else { currentDialog = null @@ -86,9 +86,6 @@ ApplicationWindow { property var planMasterControllerPlanView: null property var currentPlanMissionItem: planMasterControllerPlanView ? planMasterControllerPlanView.missionController.currentPlanViewItem : null - - // Property to manage RemoteID quick acces to settings page - property bool commingFromRIDIndicator: false } /// Default color palette used throughout the UI @@ -170,19 +167,26 @@ ApplicationWindow { //------------------------------------------------------------------------- //-- Global simple message dialog - function showMessageDialog(dialogTitle, dialogText, buttons = StandardButton.Ok, acceptFunction = null) { - simpleMessageDialogComponent.createObject(mainWindow, { title: dialogTitle, text: dialogText, buttons: buttons, acceptFunction: acceptFunction }).open() - } - - // This variant is only meant to be called by QGCApplication - function _showMessageDialog(dialogTitle, dialogText) { - showMessageDialog(dialogTitle, dialogText) + function showMessageDialog(dialogTitle, dialogText) { + showPopupDialogFromComponent(simpleMessageDialog, { title: dialogTitle, text: dialogText }) } Component { - id: simpleMessageDialogComponent + id: simpleMessageDialog - QGCSimpleMessageDialog { + QGCPopupDialog { + title: dialogProperties.title + buttons: StandardButton.Ok + + ColumnLayout { + QGCLabel { + id: textLabel + wrapMode: Text.WordWrap + text: dialogProperties.text + Layout.fillWidth: true + Layout.maximumWidth: mainWindow.width / 2 + } + } } } @@ -191,6 +195,53 @@ ApplicationWindow { window: mainWindow } + //------------------------------------------------------------------------- + //-- Global complex dialog + + /// Shows a QGCViewDialogContainer based dialog + /// @param component The dialog contents + /// @param title Title for dialog + /// @param charWidth Width of dialog in characters + /// @param buttons Buttons to show in dialog using StandardButton enum + + readonly property int showDialogFullWidth: -1 ///< Use for full width dialog + readonly property int showDialogDefaultWidth: 40 ///< Use for default dialog width + + function showComponentDialog(component, title, charWidth, buttons) { + var dialogWidth = charWidth === showDialogFullWidth ? mainWindow.width : ScreenTools.defaultFontPixelWidth * charWidth + var dialog = dialogDrawerComponent.createObject(mainWindow, { width: dialogWidth, dialogComponent: component, dialogTitle: title, dialogButtons: buttons }) + mainWindow.pushPreventViewSwitch() + dialog.open() + } + + Component { + id: dialogDrawerComponent + QGCViewDialogContainer { + y: mainWindow.header.height + height: mainWindow.height - mainWindow.header.height + onClosed: mainWindow.popPreventViewSwitch() + } + } + + // Dialogs based on QGCPopupDialog + + function showPopupDialogFromComponent(component, properties) { + var dialog = popupDialogContainerComponent.createObject(mainWindow, { dialogComponent: component, dialogProperties: properties }) + dialog.open() + return dialog + } + + function showPopupDialogFromSource(source, properties) { + var dialog = popupDialogContainerComponent.createObject(mainWindow, { dialogSource: source, dialogProperties: properties }) + dialog.open() + return dialog + } + + Component { + id: popupDialogContainerComponent + QGCPopupDialogContainer { } + } + property bool _forceClose: false function finishCloseProcess() { @@ -207,48 +258,63 @@ ApplicationWindow { // Unsaved missions - then // Pending parameter writes - then // Active connections - - property string closeDialogTitle: qsTr("Close %1").arg(QGroundControl.appName) - - function checkForUnsavedMission() { - if (globals.planMasterControllerPlanView && globals.planMasterControllerPlanView.dirty) { - showMessageDialog(closeDialogTitle, - qsTr("You have a mission edit in progress which has not been saved/sent. If you close you will lose changes. Are you sure you want to close?"), - StandardButton.Yes | StandardButton.No, - function() { checkForPendingParameterWrites() }) - } else { - checkForPendingParameterWrites() - } - } - - function checkForPendingParameterWrites() { - for (var index=0; index 5 + color: qgcPal.alertText + MouseArea { + anchors.fill: parent + onClicked: { + criticalVehicleMessageFlick.flick(0,-500) } } } @@ -679,42 +733,4 @@ ApplicationWindow { indicatorPopup.currentIndicator = null } } - - // We have to create the popup windows for the Analyze pages here so that the creation context is rooted - // to mainWindow. Otherwise if they are rooted to the AnalyzeView itself they will die when the analyze viewSwitch - // closes. - - function createrWindowedAnalyzePage(title, source) { - var windowedPage = windowedAnalyzePage.createObject(mainWindow) - windowedPage.title = title - windowedPage.source = source - } - - Component { - id: windowedAnalyzePage - - Window { - width: ScreenTools.defaultFontPixelWidth * 100 - height: ScreenTools.defaultFontPixelHeight * 40 - visible: true - - property alias source: loader.source - - Rectangle { - color: QGroundControl.globalPalette.window - anchors.fill: parent - - Loader { - id: loader - anchors.fill: parent - onLoaded: item.popped = true - } - } - - onClosing: { - visible = false - source = "" - } - } - } } diff --git a/src/ui/preferences/GeneralSettings.qml b/src/ui/preferences/GeneralSettings.qml index 1b9b9d6..43c77e4 100644 --- a/src/ui/preferences/GeneralSettings.qml +++ b/src/ui/preferences/GeneralSettings.qml @@ -181,77 +181,6 @@ Rectangle { property Fact _showDumbCameraControl: QGroundControl.settingsManager.flyViewSettings.showSimpleCameraControl } - FactCheckBox { - text: qsTr("Update home position based on device location. This will affect return to home") - fact: _updateHomePosition - visible: _updateHomePosition.visible - property Fact _updateHomePosition: QGroundControl.settingsManager.flyViewSettings.updateHomePosition - } - - FactCheckBox { - text: qsTr("Enable Custom Actions") - visible: _enableCustomActions.visible - fact: _enableCustomActions - - property Fact _enableCustomActions: QGroundControl.settingsManager.flyViewSettings.enableCustomActions - } - - //----------------------------------------------------------------- - //-- CustomAction definition path - GridLayout { - id: customActions - - columns: 2 - visible: QGroundControl.settingsManager.flyViewSettings.enableCustomActions.rawValue - - onVisibleChanged: { - if (jsonFile.rawValue === "" && ScreenTools.isMobile) { - jsonFile.rawValue = _defaultFile - } - } - - property Fact jsonFile: QGroundControl.settingsManager.flyViewSettings.customActionDefinitions - property string _defaultDir: QGroundControl.settingsManager.appSettings.customActionsSavePath - property string _defaultFile: _defaultDir + "/CustomActions.json" - - QGCLabel { - text: qsTr("Custom Action Definitions") - - Layout.columnSpan: 2 - Layout.alignment: Qt.AlignHCenter - } - - QGCTextField { - Layout.fillWidth: true - readOnly: true - text: customActions.jsonFile.rawValue === "" ? qsTr("") : customActions.jsonFile.rawValue - } - QGCButton { - visible: !ScreenTools.isMobile - text: qsTr("Browse") - onClicked: customActionPathBrowseDialog.openForLoad() - QGCFileDialog { - id: customActionPathBrowseDialog - title: qsTr("Choose the Custom Action Definitions file") - folder: customActions.jsonFile.rawValue - selectExisting: true - selectFolder: false - onAcceptedForLoad: customActions.jsonFile.rawValue = file - nameFilters: ["JSON files (*.json)"] - } - } - // The file loader on Android doesn't work, so we hard code the path to the - // JSON file. However, we need a button to force a refresh if the JSON file - // is changed. - QGCButton { - visible: ScreenTools.isMobile - text: qsTr("Reload") - onClicked: { - customActions.jsonFile.valueChanged(customActions.jsonFile.rawValue) - } - } - } - GridLayout { columns: 2 @@ -364,7 +293,7 @@ Rectangle { QGCLabel { id: videoFileFormatLabel - text: qsTr("Record File Format") + text: qsTr("File Format") visible: _showSaveVideoSettings && _videoSettings.recordingFormat.visible } FactComboBox { @@ -685,13 +614,6 @@ Rectangle { property Fact _audioMuted: QGroundControl.settingsManager.appSettings.audioMuted } - FactCheckBox { - text: qsTr("Save application data to SD Card") - fact: _androidSaveToSDCard - visible: _androidSaveToSDCard.visible - property Fact _androidSaveToSDCard: QGroundControl.settingsManager.appSettings.androidSaveToSDCard - } - FactCheckBox { text: qsTr("Check for Internet connection") fact: _checkInternet @@ -723,17 +645,11 @@ Rectangle { } } } - - // Check box to show/hide Remote ID submenu in App settings - FactCheckBox { - text: qsTr("Enable Remote ID") - fact: _remoteIDEnable - visible: _remoteIDEnable.visible - property Fact _remoteIDEnable: QGroundControl.settingsManager.remoteIDSettings.enable - } } } + //----------------------------------------------------------------- + //-- Save path RowLayout { id: pathRow anchors.margins: _margins @@ -899,7 +815,7 @@ Rectangle { visible: nmeaPortCombo.currentText !== gpsUdpPort && nmeaPortCombo.currentText !== gpsDisabled id: nmeaBaudCombo Layout.preferredWidth: _comboFieldWidth - model: [1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600] + model: [4800, 9600, 19200, 38400, 57600, 115200] onActivated: { if (index != -1) { @@ -1107,7 +1023,7 @@ Rectangle { FactTextField { fact: adsbGrid.adsbSettings.adsbServerHostAddress visible: adsbGrid.adsbSettings.adsbServerHostAddress.visible - Layout.fillWidth: true + Layout.preferredWidth: _valueFieldWidth } QGCLabel { diff --git a/src/ui/preferences/LinkSettings.qml b/src/ui/preferences/LinkSettings.qml index 0a3a27e..1c19711 100644 --- a/src/ui/preferences/LinkSettings.qml +++ b/src/ui/preferences/LinkSettings.qml @@ -78,7 +78,6 @@ Rectangle { onClicked: { checked = true _currentSelection = object - console.log("clicked", object, object.link) } } } @@ -130,20 +129,12 @@ Rectangle { QGCButton { text: qsTr("Disconnect") enabled: _currentSelection && _currentSelection.link - onClicked: { - _currentSelection.link.disconnect() - _currentSelection.linkChanged() - } + onClicked: _currentSelection.link.disconnect() } QGCButton { text: qsTr("MockLink Options") visible: _currentSelection && _currentSelection.link && _currentSelection.link.isMockLink - onClicked: mockLinkOptionDialog.open() - - MockLinkOptionsDlg { - id: mockLinkOptionDialog - link: _currentSelection ? _currentSelection.link : undefined - } + onClicked: mainWindow.showPopupDialogFromSource("qrc:/unittest/MockLinkOptionsDlg.qml", { link: _currentSelection.link }) } } diff --git a/src/ui/preferences/MavlinkSettings.qml b/src/ui/preferences/MavlinkSettings.qml index 8174d82..b0370ef 100644 --- a/src/ui/preferences/MavlinkSettings.qml +++ b/src/ui/preferences/MavlinkSettings.qml @@ -33,10 +33,7 @@ Rectangle { property real _columnSpacing: ScreenTools.defaultFontPixelHeight * 0.25 property bool _uploadedSelected: false property bool _showMavlinkLog: QGroundControl.corePlugin.options.showMavlinkLogOptions - property bool _showAPMStreamRates: QGroundControl.apmFirmwareSupported && QGroundControl.settingsManager.apmMavlinkStreamRateSettings.visible && _isAPM - property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle - property bool _isPX4: _activeVehicle ? _activeVehicle.px4Firmware : false - property bool _isAPM: _activeVehicle ? _activeVehicle.apmFirmware : false + property bool _showAPMStreamRates: QGroundControl.apmFirmwareSupported && QGroundControl.settingsManager.apmMavlinkStreamRateSettings.visible property Fact _disableDataPersistenceFact: QGroundControl.settingsManager.appSettings.disableAllPersistence property bool _disableDataPersistence: _disableDataPersistenceFact ? _disableDataPersistenceFact.rawValue : false @@ -372,7 +369,7 @@ Rectangle { height: mavlogLabel.height anchors.margins: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter - visible: _showMavlinkLog && _isPX4 + visible: _showMavlinkLog QGCLabel { id: mavlogLabel text: qsTr("MAVLink 2.0 Logging (PX4 Pro Only)") @@ -385,7 +382,7 @@ Rectangle { color: qgcPal.windowShade anchors.margins: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter - visible: _showMavlinkLog && _isPX4 + visible: _showMavlinkLog Column { id: mavlogColumn width: gcsColumn.width @@ -435,7 +432,7 @@ Rectangle { height: logLabel.height anchors.margins: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter - visible: _showMavlinkLog && _isPX4 + visible: _showMavlinkLog QGCLabel { id: logLabel text: qsTr("MAVLink 2.0 Log Uploads (PX4 Pro Only)") @@ -448,7 +445,7 @@ Rectangle { color: qgcPal.windowShade anchors.margins: ScreenTools.defaultFontPixelWidth anchors.horizontalCenter: parent.horizontalCenter - visible: _showMavlinkLog && _isPX4 + visible: _showMavlinkLog Column { id: logColumn spacing: _columnSpacing @@ -627,8 +624,8 @@ Rectangle { text: QGroundControl.mavlinkLogManager.feedback enabled: !_disableDataPersistence style: TextAreaStyle { - textColor: qgcPal.textFieldText - backgroundColor: qgcPal.textField + textColor: qgcPal.windowShade + backgroundColor: qgcPal.text } } } diff --git a/src/ui/preferences/RemoteIDSettings.qml b/src/ui/preferences/RemoteIDSettings.qml deleted file mode 100644 index 11f723f..0000000 --- a/src/ui/preferences/RemoteIDSettings.qml +++ /dev/null @@ -1,922 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2022 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -import QtQuick 2.3 -import QtQuick.Controls 1.2 -import QtQuick.Controls.Styles 1.4 -import QtQuick.Dialogs 1.2 -import QtQuick.Layouts 1.2 - -import QGroundControl 1.0 -import QGroundControl.FactSystem 1.0 -import QGroundControl.FactControls 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.ScreenTools 1.0 -import QGroundControl.MultiVehicleManager 1.0 -import QGroundControl.Palette 1.0 - -Rectangle { - id: remoteIDRoot - color: qgcPal.window - anchors.fill: parent - - // Visual properties - property real _margins: ScreenTools.defaultFontPixelWidth - property real _labelWidth: ScreenTools.defaultFontPixelWidth * 28 - property real _valueWidth: ScreenTools.defaultFontPixelWidth * 24 - property real _columnSpacing: ScreenTools.defaultFontPixelHeight * 0.25 - property real _comboFieldWidth: ScreenTools.defaultFontPixelWidth * 30 - property real _valueFieldWidth: ScreenTools.defaultFontPixelWidth * 10 - property int _borderWidth: 3 - // Flags visual properties - property real flagsWidth: ScreenTools.defaultFontPixelWidth * 15 - property real flagsHeight: ScreenTools.defaultFontPixelWidth * 7 - property int radiusFlags: 5 - - // Flag to get active vehicle and active RID - property var _activeRID: _activeVehicle && _activeVehicle.remoteIDManager ? _activeVehicle.remoteIDManager : null - - // Healthy connection with RID device - property bool commsGood: _activeVehicle && _activeVehicle.remoteIDManager ? _activeVehicle.remoteIDManager.commsGood : false - - // General properties - property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle - property int _regionOperation: QGroundControl.settingsManager.remoteIDSettings.region.value - property int _locationType: QGroundControl.settingsManager.remoteIDSettings.locationType.value - property int _classificationType: QGroundControl.settingsManager.remoteIDSettings.classificationType.value - - enum RegionOperation { - FAA, - EU - } - - enum LocationType { - TAKEOFF, - LIVE, - FIXED - } - - enum ClassificationType { - UNDEFINED, - EU - } - - // GPS properties - property var gcsPosition: QGroundControl.qgcPositionManger.gcsPosition - property real gcsHeading: QGroundControl.qgcPositionManger.gcsHeading - property real gcsHDOP: QGroundControl.qgcPositionManger.gcsPositionHorizontalAccuracy - property string gpsDisabled: "Disabled" - property string gpsUdpPort: "UDP Port" - - QGCPalette { id: qgcPal } - - // Function to get the corresponding Self ID label depending on the Self ID Type selected - function getSelfIdLabelText() { - switch (selfIDComboBox.currentIndex) { - case 0: - return QGroundControl.settingsManager.remoteIDSettings.selfIDFree.shortDescription - break - case 1: - return QGroundControl.settingsManager.remoteIDSettings.selfIDEmergency.shortDescription - break - case 2: - return QGroundControl.settingsManager.remoteIDSettings.selfIDExtended.shortDescription - break - default: - return QGroundControl.settingsManager.remoteIDSettings.selfIDFree.shortDescription - } - } - - // Function to get the corresponding Self ID fact depending on the Self ID Type selected - function getSelfIDFact() { - switch (selfIDComboBox.currentIndex) { - case 0: - return QGroundControl.settingsManager.remoteIDSettings.selfIDFree - break - case 1: - return QGroundControl.settingsManager.remoteIDSettings.selfIDEmergency - break - case 2: - return QGroundControl.settingsManager.remoteIDSettings.selfIDExtended - break - default: - return QGroundControl.settingsManager.remoteIDSettings.selfIDFree - } - } - - // Function to move flickable to desire position - function getFlickableToPosition(y) { - flicakbleRID.contentY = y - } - - Item { - id: flagsItem - anchors.top: parent.top - anchors.horizontalCenter: parent.horizontalCenter - anchors.horizontalCenterOffset: ScreenTools.defaultFontPixelWidth // Need this to account for the slight offset in the flickable - width: flicakbleRID.innerWidth - height: flagsColumn.height - - ColumnLayout { - id: flagsColumn - anchors.horizontalCenter: parent.horizontalCenter - spacing: _margins - - // ---------------------------------------- STATUS ----------------------------------------- - // Status flags. Visual representation for the state of all necesary information for remoteID - // to work propely. - Rectangle { - id: flagsRectangle - Layout.preferredHeight: statusGrid.height + (_margins * 2) - Layout.preferredWidth: statusGrid.width + (_margins * 2) - color: qgcPal.windowShade - visible: _activeVehicle - Layout.fillWidth: true - - GridLayout { - id: statusGrid - anchors.margins: _margins - anchors.top: parent.top - anchors.horizontalCenter: parent.horizontalCenter - rows: 1 - rowSpacing: _margins * 3 - columnSpacing: _margins * 2 - - Rectangle { - id: armFlag - Layout.preferredHeight: flagsHeight - Layout.preferredWidth: flagsWidth - color: _activeRID ? (_activeVehicle.remoteIDManager.armStatusGood ? qgcPal.colorGreen : qgcPal.colorRed) : qgcPal.colorGrey - radius: radiusFlags - visible: commsGood - - QGCLabel { - anchors.fill: parent - text: qsTr("ARM STATUS") - wrapMode: Text.WordWrap - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - font.bold: true - } - - // On clikced we go to the corresponding settings - MouseArea { - anchors.fill: parent - onClicked: getFlickableToPosition(flicakbleRID.armstatusY) - } - - } - - Rectangle { - id: commsFlag - Layout.preferredHeight: flagsHeight - Layout.preferredWidth: flagsWidth - color: _activeRID ? (_activeVehicle.remoteIDManager.commsGood ? qgcPal.colorGreen : qgcPal.colorRed) : qgcPal.colorGrey - radius: radiusFlags - - QGCLabel { - anchors.fill: parent - text: _activeRID && _activeVehicle.remoteIDManager.commsGood ? qsTr("RID COMMS") : qsTr("NOT CONNECTED") - wrapMode: Text.WordWrap - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - font.bold: true - } - } - - Rectangle { - id: gpsFlag - Layout.preferredHeight: flagsHeight - Layout.preferredWidth: flagsWidth - color: _activeRID ? (_activeVehicle.remoteIDManager.gcsGPSGood ? qgcPal.colorGreen : qgcPal.colorRed) : qgcPal.colorGrey - radius: radiusFlags - visible: commsGood - - QGCLabel { - anchors.fill: parent - text: qsTr("GCS GPS") - wrapMode: Text.WordWrap - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - font.bold: true - } - - // On clikced we go to the corresponding settings - MouseArea { - anchors.fill: parent - onClicked: getFlickableToPosition(flicakbleRID.gpsY) - } - } - - Rectangle { - id: basicIDFlag - Layout.preferredHeight: flagsHeight - Layout.preferredWidth: flagsWidth - color: _activeRID ? (_activeVehicle.remoteIDManager.basicIDGood ? qgcPal.colorGreen : qgcPal.colorRed) : qgcPal.colorGrey - radius: radiusFlags - visible: commsGood - - QGCLabel { - anchors.fill: parent - text: qsTr("BASIC ID") - wrapMode: Text.WordWrap - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - font.bold: true - } - - // On clikced we go to the corresponding settings - MouseArea { - anchors.fill: parent - onClicked: getFlickableToPosition(flicakbleRID.basicIDY) - } - } - - Rectangle { - id: operaotrIDFlag - Layout.preferredHeight: flagsHeight - Layout.preferredWidth: flagsWidth - color: _activeRID ? (_activeVehicle.remoteIDManager.operatorIDGood ? qgcPal.colorGreen : qgcPal.colorRed) : qgcPal.colorGrey - radius: radiusFlags - visible: commsGood && _activeRID ? (QGroundControl.settingsManager.remoteIDSettings.sendOperatorID.value || _regionOperation == RemoteIDSettings.RegionOperation.EU) : false - - QGCLabel { - anchors.fill: parent - text: qsTr("OPERATOR ID") - wrapMode: Text.WordWrap - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - font.bold: true - } - - // On clicked we go to the corresponding settings - MouseArea { - anchors.fill: parent - onClicked: getFlickableToPosition(flicakbleRID.operatorIDY) - } - } - } - } - } - } - - QGCFlickable { - id: flicakbleRID - clip: true - anchors.top: flagsItem.visible ? flagsItem.bottom : parent.top - anchors.left: parent.left - anchors.right: parent.right - anchors.bottom: parent.bottom - anchors.margins: ScreenTools.defaultFontPixelWidth - contentHeight: outerItem.height - contentWidth: outerItem.width - flickableDirection: Flickable.VerticalFlick - - property var innerWidth: settingsItem.width - - // Properties to position flickable - property var armstatusY: armStatusLabel.y - property var gpsY: gpsLabel.y - property var basicIDY: basicIDLabel.y - property var operatorIDY: operatorIDLabel.y - - Item { - id: outerItem - width: Math.max(remoteIDRoot.width, settingsItem.width) - height: settingsItem.height - - ColumnLayout { - id: settingsItem - anchors.horizontalCenter: parent.horizontalCenter - spacing: _margins - - // ----------------------------------------------------------------------------------------- - // ---------------------------------------- ARM STATUS ----------------------------------------- - // Arm status error - QGCLabel { - id: armStatusLabel - text: qsTr("ARM STATUS") - Layout.alignment: Qt.AlignHCenter - font.pointSize: ScreenTools.mediumFontPointSize - visible: _activeVehicle && !_activeVehicle.remoteIDManager.armStatusGood - } - - Rectangle { - id: armStatusRectangle - Layout.preferredHeight: armStatusGrid.height + (_margins * 2) - Layout.preferredWidth: armStatusGrid.width + (_margins * 2) - color: qgcPal.windowShade - Layout.fillWidth: true - border.width: _borderWidth - border.color: _activeRID ? (_activeVehicle.remoteIDManager.armStatusGood ? color : qgcPal.colorRed) : color - - visible: _activeVehicle && !_activeVehicle.remoteIDManager.armStatusGood - - GridLayout { - id: armStatusGrid - anchors.margins: _margins - anchors.top: parent.top - anchors.horizontalCenter: parent.horizontalCenter - columns: 2 - rowSpacing: _margins * 3 - columnSpacing: _margins * 2 - - QGCLabel { - text: qsTr("Arm status error: ") - Layout.fillWidth: true - } - QGCLabel { - text: _activeVehicle ? _activeVehicle.remoteIDManager.armStatusError : "" - Layout.fillWidth: true - } - } - } - // ----------------------------------------------------------------------------------------- - - // ---------------------------------------- REGION ----------------------------------------- - // Region of operation to accomodate for different requirements - QGCLabel { - id: regionLabel - text: qsTr("Region") - Layout.alignment: Qt.AlignHCenter - font.pointSize: ScreenTools.mediumFontPointSize - } - - Rectangle { - id: regionRectangle - Layout.preferredHeight: regionGrid.height + (_margins * 2) - Layout.preferredWidth: regionGrid.width + (_margins * 2) - color: qgcPal.windowShade - visible: true - Layout.fillWidth: true - - GridLayout { - id: regionGrid - anchors.margins: _margins - anchors.top: parent.top - anchors.horizontalCenter: parent.horizontalCenter - columns: 2 - rowSpacing: _margins * 3 - columnSpacing: _margins * 2 - - QGCLabel { - text: QGroundControl.settingsManager.remoteIDSettings.region.shortDescription - visible: QGroundControl.settingsManager.remoteIDSettings.region.visible - Layout.fillWidth: true - } - FactComboBox { - fact: QGroundControl.settingsManager.remoteIDSettings.region - visible: QGroundControl.settingsManager.remoteIDSettings.region.visible - Layout.fillWidth: true - sizeToContents: true - // In case we change from EU to FAA having the location Type to FIXED, since its not supported in FAA - // we need to change it to Live GNSS - onActivated: { - if (currentIndex == RemoteIDSettings.RegionOperation.FAA && QGroundControl.settingsManager.remoteIDSettings.locationType.value != RemoteIDSettings.LocationType.LIVE) - QGroundControl.settingsManager.remoteIDSettings.locationType.value = RemoteIDSettings.LocationType.LIVE - } - } - - QGCLabel { - text: QGroundControl.settingsManager.remoteIDSettings.classificationType.shortDescription - visible: _regionOperation == RemoteIDSettings.RegionOperation.EU - Layout.fillWidth: true - } - FactComboBox { - fact: QGroundControl.settingsManager.remoteIDSettings.classificationType - visible: _regionOperation == RemoteIDSettings.RegionOperation.EU - Layout.fillWidth: true - sizeToContents: true - } - - QGCLabel { - text: QGroundControl.settingsManager.remoteIDSettings.categoryEU.shortDescription - visible: (_classificationType == RemoteIDSettings.ClassificationType.EU) && (_regionOperation == RemoteIDSettings.RegionOperation.EU) - Layout.fillWidth: true - } - FactComboBox { - fact: QGroundControl.settingsManager.remoteIDSettings.categoryEU - visible: (_classificationType == RemoteIDSettings.ClassificationType.EU) && (_regionOperation == RemoteIDSettings.RegionOperation.EU) - Layout.fillWidth: true - sizeToContents: true - } - - QGCLabel { - text: QGroundControl.settingsManager.remoteIDSettings.classEU.shortDescription - visible: (_classificationType == RemoteIDSettings.ClassificationType.EU) && (_regionOperation == RemoteIDSettings.RegionOperation.EU) - Layout.fillWidth: true - } - FactComboBox { - fact: QGroundControl.settingsManager.remoteIDSettings.classEU - visible: (_classificationType == RemoteIDSettings.ClassificationType.EU) && (_regionOperation == RemoteIDSettings.RegionOperation.EU) - Layout.fillWidth: true - sizeToContents: true - } - } - } - // ----------------------------------------------------------------------------------------- - - // ----------------------------------------- GPS ------------------------------------------- - // Data representation and connection options for GCS GPS. - QGCLabel { - id: gpsLabel - text: qsTr("GPS GCS") - Layout.alignment: Qt.AlignHCenter - font.pointSize: ScreenTools.mediumFontPointSize - } - - Rectangle { - id: gpsRectangle - Layout.preferredHeight: gpsGrid.height + gpsGridData.height + (_margins * 3) - Layout.preferredWidth: gpsGrid.width + (_margins * 2) - color: qgcPal.windowShade - visible: true - Layout.fillWidth: true - - border.width: _borderWidth - border.color: _activeRID ? (_activeVehicle.remoteIDManager.gcsGPSGood ? color : qgcPal.colorRed) : color - - property var locationTypeValue: QGroundControl.settingsManager.remoteIDSettings.locationType.value - - // In case we change from FAA to EU region, having selected Location Type FIXED, - // We have to change the currentindex to the locationType forced when we change region - onLocationTypeValueChanged: { - if (locationTypeComboBox.currentIndex != locationTypeValue) { - locationTypeComboBox.currentIndex = locationTypeValue - } - } - - GridLayout { - id: gpsGridData - anchors.margins: _margins - anchors.top: parent.top - anchors.horizontalCenter: parent.horizontalCenter - rowSpacing: _margins - columns: 2 - columnSpacing: _margins * 2 - - QGCLabel { - text: QGroundControl.settingsManager.remoteIDSettings.locationType.shortDescription - visible: QGroundControl.settingsManager.remoteIDSettings.locationType.visible - Layout.fillWidth: true - } - FactComboBox { - id: locationTypeComboBox - fact: QGroundControl.settingsManager.remoteIDSettings.locationType - visible: QGroundControl.settingsManager.remoteIDSettings.locationType.visible - Layout.fillWidth: true - sizeToContents: true - - onActivated: { - // FAA doesnt allow to set a Fixed position. Is either Live GNSS or Takeoff - if (_regionOperation == RemoteIDSettings.RegionOperation.FAA) { - if (currentIndex != 1) { - QGroundControl.settingsManager.remoteIDSettings.locationType.value = 1 - currentIndex = 1 - } - } else { - // TODO: this lines below efectively disable TAKEOFF option. Uncoment when we add support for it - if (currentIndex == 0) { - QGroundControl.settingsManager.remoteIDSettings.locationType.value = 1 - currentIndex = 1 - } else { - QGroundControl.settingsManager.remoteIDSettings.locationType.value = index - currentIndex = index - } - // -------------------------------------------------------------------------------------------------- - } - } - } - - QGCLabel { - text: qsTr("Latitude Fixed(-90 to 90)") - visible: _locationType == RemoteIDSettings.LocationType.FIXED - Layout.fillWidth: true - } - FactTextField { - visible: _locationType == RemoteIDSettings.LocationType.FIXED - Layout.fillWidth: true - fact: QGroundControl.settingsManager.remoteIDSettings.latitudeFixed - } - - QGCLabel { - text: qsTr("Longitude Fixed(-180 to 180)") - visible: _locationType == RemoteIDSettings.LocationType.FIXED - Layout.fillWidth: true - } - FactTextField { - visible: _locationType == RemoteIDSettings.LocationType.FIXED - Layout.fillWidth: true - fact: QGroundControl.settingsManager.remoteIDSettings.longitudeFixed - } - - QGCLabel { - text: qsTr("Altitude Fixed") - visible: _locationType == RemoteIDSettings.LocationType.FIXED - Layout.fillWidth: true - } - FactTextField { - visible: _locationType == RemoteIDSettings.LocationType.FIXED - Layout.fillWidth: true - fact: QGroundControl.settingsManager.remoteIDSettings.altitudeFixed - } - - QGCLabel { - text: qsTr("Latitude") - Layout.fillWidth: true - visible: _locationType != RemoteIDSettings.LocationType.TAKEOFF - } - QGCLabel { - text: gcsPosition.isValid ? gcsPosition.latitude : "N/A" - Layout.fillWidth: true - visible: _locationType != RemoteIDSettings.LocationType.TAKEOFF - } - - QGCLabel { - text: qsTr("Longitude") - Layout.fillWidth: true - visible: _locationType != RemoteIDSettings.LocationType.TAKEOFF - } - QGCLabel { - text: gcsPosition.isValid ? gcsPosition.longitude : "N/A" - Layout.fillWidth: true - visible: _locationType != RemoteIDSettings.LocationType.TAKEOFF - } - - QGCLabel { - text: _regionOperation == RemoteIDSettings.RegionOperation.FAA ? - qsTr("Altitude") + qsTr(" (Mandatory)") : - qsTr("Altitude") - Layout.fillWidth: true - visible: _locationType != RemoteIDSettings.LocationType.TAKEOFF - } - QGCLabel { - text: gcsPosition.isValid && !isNaN(gcsPosition.altitude) ? gcsPosition.altitude : "N/A" - Layout.fillWidth: true - visible: _locationType != RemoteIDSettings.LocationType.TAKEOFF - } - - QGCLabel { - text: qsTr("Heading") - Layout.fillWidth: true - visible: _locationType != RemoteIDSettings.LocationType.TAKEOFF - } - QGCLabel { - text: gcsPosition.isValid && !isNaN(gcsHeading) ? gcsHeading : "N/A" - Layout.fillWidth: true - visible: _locationType != RemoteIDSettings.LocationType.TAKEOFF - } - - QGCLabel { - text: qsTr("Hor. Accuracy") - Layout.fillWidth: true - visible: _locationType != RemoteIDSettings.LocationType.TAKEOFF - } - QGCLabel { - text: gcsPosition.isValid && gcsHDOP ? ( gcsHDOP + " m" ) : "N/A" - Layout.fillWidth: true - visible: _locationType != RemoteIDSettings.LocationType.TAKEOFF - } - } - - GridLayout { - id: gpsGrid - visible: !ScreenTools.isMobile - && QGroundControl.settingsManager.autoConnectSettings.autoConnectNmeaPort.visible - && QGroundControl.settingsManager.autoConnectSettings.autoConnectNmeaBaud.visible - && _locationType != RemoteIDSettings.LocationType.TAKEOFF - anchors.margins: _margins - anchors.top: gpsGridData.bottom - anchors.horizontalCenter: parent.horizontalCenter - rowSpacing: _margins * 3 - columns: 2 - columnSpacing: _margins * 2 - - QGCLabel { - text: qsTr("NMEA External GPS Device") - } - QGCComboBox { - id: nmeaPortCombo - Layout.preferredWidth: _comboFieldWidth - - model: ListModel { - } - - onActivated: { - if (index != -1) { - QGroundControl.settingsManager.autoConnectSettings.autoConnectNmeaPort.value = textAt(index); - } - } - Component.onCompleted: { - model.append({text: gpsDisabled}) - model.append({text: gpsUdpPort}) - - for (var i in QGroundControl.linkManager.serialPorts) { - nmeaPortCombo.model.append({text:QGroundControl.linkManager.serialPorts[i]}) - } - var index = nmeaPortCombo.find(QGroundControl.settingsManager.autoConnectSettings.autoConnectNmeaPort.valueString); - nmeaPortCombo.currentIndex = index; - if (QGroundControl.linkManager.serialPorts.length === 0) { - nmeaPortCombo.model.append({text: "Serial "}) - } - } - } - - QGCLabel { - visible: nmeaPortCombo.currentText !== gpsUdpPort && nmeaPortCombo.currentText !== gpsDisabled - text: qsTr("NMEA GPS Baudrate") - } - QGCComboBox { - visible: nmeaPortCombo.currentText !== gpsUdpPort && nmeaPortCombo.currentText !== gpsDisabled - id: nmeaBaudCombo - Layout.preferredWidth: _comboFieldWidth - model: [1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600] - - onActivated: { - if (index != -1) { - QGroundControl.settingsManager.autoConnectSettings.autoConnectNmeaBaud.value = textAt(index); - } - } - Component.onCompleted: { - var index = nmeaBaudCombo.find(QGroundControl.settingsManager.autoConnectSettings.autoConnectNmeaBaud.valueString); - nmeaBaudCombo.currentIndex = index; - } - } - - QGCLabel { - text: qsTr("NMEA stream UDP port") - visible: nmeaPortCombo.currentText === gpsUdpPort - } - FactTextField { - visible: nmeaPortCombo.currentText === gpsUdpPort - Layout.preferredWidth: _valueFieldWidth - fact: QGroundControl.settingsManager.autoConnectSettings.nmeaUdpPort - } - } - } - // ----------------------------------------------------------------------------------------- - - // -------------------------------------- BASIC ID ------------------------------------------- - QGCLabel { - id: basicIDLabel - text: qsTr("BASIC ID") - Layout.alignment: Qt.AlignHCenter - font.pointSize: ScreenTools.mediumFontPointSize - } - - Rectangle { - id: basicIDRectangle - Layout.preferredHeight: basicIDGrid.height + basicIDnote.height + (_margins * 4) - Layout.preferredWidth: basicIDGrid.width + basicIDnote.width + (_margins * 2) - color: qgcPal.windowShade - Layout.fillWidth: true - - border.width: _borderWidth - border.color: _activeRID ? (_activeVehicle.remoteIDManager.basicIDGood ? color : qgcPal.colorRed) : color - - QGCLabel { - id: basicIDnote - anchors.margins: _margins - anchors.top: parent.top - anchors.horizontalCenter: parent.horizontalCenter - anchors.bottomMargin: _margins * 2 - width: basicIDGrid.width - text: qsTr("Note: This parameter is optional if Basic ID is already set on RID device. " + - "On that case, this one will be registered as Basic ID 2") - wrapMode: Text.Wrap - visible: QGroundControl.settingsManager.remoteIDSettings.basicIDType.visible - - } - - GridLayout { - id: basicIDGrid - anchors.margins: _margins - anchors.top: basicIDnote.bottom - anchors.horizontalCenter: parent.horizontalCenter - columns: 2 - rowSpacing: _margins * 3 - columnSpacing: _margins * 2 - - QGCLabel { - text: QGroundControl.settingsManager.remoteIDSettings.basicIDType.shortDescription - visible: QGroundControl.settingsManager.remoteIDSettings.basicIDType.visible - Layout.fillWidth: true - } - FactComboBox { - fact: QGroundControl.settingsManager.remoteIDSettings.basicIDType - visible: QGroundControl.settingsManager.remoteIDSettings.basicIDType.visible - Layout.fillWidth: true - sizeToContents: true - } - - QGCLabel { - text: QGroundControl.settingsManager.remoteIDSettings.basicIDUaType.shortDescription - visible: QGroundControl.settingsManager.remoteIDSettings.basicIDUaType.visible - Layout.fillWidth: true - } - FactComboBox { - fact: QGroundControl.settingsManager.remoteIDSettings.basicIDUaType - visible: QGroundControl.settingsManager.remoteIDSettings.basicIDUaType.visible - Layout.fillWidth: true - sizeToContents: true - } - - QGCLabel { - text: _activeRID && _activeVehicle.remoteIDManager.basicIDGood ? - QGroundControl.settingsManager.remoteIDSettings.basicID.shortDescription : - QGroundControl.settingsManager.remoteIDSettings.basicID.shortDescription + qsTr(" (Mandatory)") - visible: QGroundControl.settingsManager.remoteIDSettings.basicID.visible - Layout.alignment: Qt.AlignHCenter - Layout.fillWidth: true - } - FactTextField { - fact: QGroundControl.settingsManager.remoteIDSettings.basicID - visible: QGroundControl.settingsManager.remoteIDSettings.basicID.visible - Layout.fillWidth: true - } - - QGCLabel { - text: QGroundControl.settingsManager.remoteIDSettings.sendBasicID.shortDescription - Layout.fillWidth: true - visible: QGroundControl.settingsManager.remoteIDSettings.basicID.visible - } - FactCheckBox { - fact: QGroundControl.settingsManager.remoteIDSettings.sendBasicID - visible: QGroundControl.settingsManager.remoteIDSettings.basicID.visible - } - } - } - // ------------------------------------------------------------------------------------------ - - // ------------------------------------ OPERATOR ID ---------------------------------------- - QGCLabel { - id: operatorIDLabel - text: qsTr("Operator ID") - Layout.alignment: Qt.AlignHCenter - font.pointSize: ScreenTools.mediumFontPointSize - } - - Rectangle { - id: operatorIDRectangle - Layout.preferredHeight: operatorIDGrid.height + (_margins * 3) - Layout.preferredWidth: operatorIDGrid.width + (_margins * 2) - color: qgcPal.windowShade - Layout.fillWidth: true - - border.width: _borderWidth - border.color: (_regionOperation == RemoteIDSettings.RegionOperation.EU || QGroundControl.settingsManager.remoteIDSettings.sendOperatorID.value) ? - (_activeRID && !_activeVehicle.remoteIDManager.operatorIDGood ? qgcPal.colorRed : color) : color - - GridLayout { - id: operatorIDGrid - anchors.margins: _margins - anchors.top: parent.top - anchors.horizontalCenter: parent.horizontalCenter - columns: 2 - rowSpacing: _margins * 3 - columnSpacing: _margins * 2 - - QGCLabel { - text: QGroundControl.settingsManager.remoteIDSettings.operatorIDType.shortDescription - visible: QGroundControl.settingsManager.remoteIDSettings.operatorIDType.visible - Layout.fillWidth: true - } - FactComboBox { - id: operatorIDFactComboBox - fact: QGroundControl.settingsManager.remoteIDSettings.operatorIDType - visible: QGroundControl.settingsManager.remoteIDSettings.operatorIDType.visible && (QGroundControl.settingsManager.remoteIDSettings.operatorIDType.enumValues.length > 1) - Layout.fillWidth: true - sizeToContents: true - } - QGCLabel{ - text: QGroundControl.settingsManager.remoteIDSettings.operatorIDType.enumStringValue - visible: !operatorIDFactComboBox.visible - Layout.fillWidth: true - } - - QGCLabel { - text: _regionOperation == RemoteIDSettings.RegionOperation.FAA ? - QGroundControl.settingsManager.remoteIDSettings.operatorID.shortDescription : - QGroundControl.settingsManager.remoteIDSettings.operatorID.shortDescription + qsTr(" (Mandatory)") - visible: QGroundControl.settingsManager.remoteIDSettings.operatorID.visible - Layout.alignment: Qt.AlignHCenter - Layout.fillWidth: true - } - FactTextField { - id: operatorIDTextField - fact: QGroundControl.settingsManager.remoteIDSettings.operatorID - visible: QGroundControl.settingsManager.remoteIDSettings.operatorID.visible - Layout.fillWidth: true - maximumLength: 20 // Maximum defined by Mavlink definition of OPEN_DRONE_ID_OPERATOR_ID message - onEditingFinished: { - if (_activeVehicle) { - _activeVehicle.remoteIDManager.checkOperatorID() - } - } - - } - - QGCLabel { - text: QGroundControl.settingsManager.remoteIDSettings.sendOperatorID.shortDescription - Layout.fillWidth: true - visible: _regionOperation == RemoteIDSettings.RegionOperation.FAA - } - FactCheckBox { - fact: QGroundControl.settingsManager.remoteIDSettings.sendOperatorID - visible: _regionOperation == RemoteIDSettings.RegionOperation.FAA - onClicked: { - if (checked) { - if (_activeVehicle) { - _activeVehicle.remoteIDManager.checkOperatorID() - } - } - } - } - } - } - // ----------------------------------------------------------------------------------------- - - // -------------------------------------- SELF ID ------------------------------------------ - QGCLabel { - id: selfIDLabel - text: qsTr("Self ID") - Layout.alignment: Qt.AlignHCenter - font.pointSize: ScreenTools.mediumFontPointSize - } - - Rectangle { - id: selfIDRectangle - Layout.preferredHeight: selfIDGrid.height + selfIDnote.height + (_margins * 3) - Layout.preferredWidth: selfIDGrid.width + (_margins * 2) - color: qgcPal.windowShade - visible: true - Layout.fillWidth: true - - GridLayout { - id: selfIDGrid - anchors.margins: _margins - anchors.top: parent.top - anchors.horizontalCenter: parent.horizontalCenter - columns: 2 - rowSpacing: _margins * 3 - columnSpacing: _margins * 2 - - QGCLabel { - text: QGroundControl.settingsManager.remoteIDSettings.selfIDType.shortDescription - visible: QGroundControl.settingsManager.remoteIDSettings.selfIDType.visible - Layout.fillWidth: true - } - FactComboBox { - id: selfIDComboBox - fact: QGroundControl.settingsManager.remoteIDSettings.selfIDType - visible: QGroundControl.settingsManager.remoteIDSettings.selfIDType.visible - Layout.fillWidth: true - sizeToContents: true - } - - QGCLabel { - text: getSelfIdLabelText() - Layout.fillWidth: true - } - FactTextField { - fact: getSelfIDFact() - Layout.fillWidth: true - maximumLength: 23 // Maximum defined by Mavlink definition of OPEN_DRONE_ID_SELF_ID message - } - - QGCLabel { - text: QGroundControl.settingsManager.remoteIDSettings.sendSelfID.shortDescription - Layout.fillWidth: true - } - FactCheckBox { - fact: QGroundControl.settingsManager.remoteIDSettings.sendSelfID - visible: QGroundControl.settingsManager.remoteIDSettings.sendSelfID.visible - } - } - - QGCLabel { - id: selfIDnote - width: selfIDGrid.width - anchors.margins: _margins - anchors.top: selfIDGrid.bottom - anchors.horizontalCenter: parent.horizontalCenter - anchors.bottomMargin: _margins * 2 - text: qsTr("Note: Even if this box is unset, QGroundControl will send self ID message " + - "if an emergency is set, or after it has been cleared. \ - The message for each kind of selfID is saved and preserves reboots. Select " + - "each type on the Self ID type dropdown to configure the message to be sent") - wrapMode: Text.Wrap - visible: QGroundControl.settingsManager.remoteIDSettings.selfIDType.visible - } - } - // ----------------------------------------------------------------------------------------- - } - } - } -} diff --git a/src/ui/toolbar/APMSupportForwardingIndicator.qml b/src/ui/toolbar/APMSupportForwardingIndicator.qml deleted file mode 100644 index 91e1a4a..0000000 --- a/src/ui/toolbar/APMSupportForwardingIndicator.qml +++ /dev/null @@ -1,75 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2023 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -import QtQuick 2.11 -import QtQuick.Layouts 1.11 - -import QGroundControl 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.ScreenTools 1.0 -import QGroundControl.Palette 1.0 - -//------------------------------------------------------------------------- -//-- Telemetry RSSI -Item { - id: _root - anchors.top: parent.top - anchors.bottom: parent.bottom - width: forwardingSupportIcon.width * 1.1 - - property bool showIndicator: QGroundControl.linkManager.mavlinkSupportForwardingEnabled - - Component { - id: forwardingSupportInfo - - Rectangle { - width: telemGrid.width + ScreenTools.defaultFontPixelWidth * 3 - height: telemGrid.height + ScreenTools.defaultFontPixelHeight * 2 - radius: ScreenTools.defaultFontPixelHeight * 0.5 - color: qgcPal.window - - GridLayout { - id: telemGrid - anchors.margins: ScreenTools.defaultFontPixelHeight - columnSpacing: ScreenTools.defaultFontPixelWidth - columns: 2 - anchors.centerIn: parent - - QGCLabel { - Layout.columnSpan: 2 - text: qsTr("Mavlink traffic is being forwarded to a support server") - } - - QGCLabel { - text: qsTr("Server name:") - } - QGCLabel { - text: QGroundControl.settingsManager.appSettings.forwardMavlinkAPMSupportHostName.value - } - } - } - } - - Image { - id: forwardingSupportIcon - anchors.top: parent.top - anchors.bottom: parent.bottom - width: height - sourceSize.height: height - source: "/qmlimages/ForwardingSupportIconGreen.svg" - fillMode: Image.PreserveAspectFit - } - - MouseArea { - anchors.fill: parent - onClicked: { - mainWindow.showIndicatorPopup(_root, forwardingSupportInfo) - } - } -} diff --git a/src/ui/toolbar/CMakeLists.txt b/src/ui/toolbar/CMakeLists.txt index a3bcb71..eff7ef2 100644 --- a/src/ui/toolbar/CMakeLists.txt +++ b/src/ui/toolbar/CMakeLists.txt @@ -2,7 +2,6 @@ add_custom_target(UiToolbarQml SOURCES ArmedIndicator.qml BatteryIndicator.qml - FlightModeMenuIndicator.qml GPSIndicator.qml GPSRTKIndicator.qml JoystickIndicator.qml diff --git a/src/ui/toolbar/FlightModeMenuIndicator.qml b/src/ui/toolbar/FlightModeMenuIndicator.qml deleted file mode 100644 index 5ac65c8..0000000 --- a/src/ui/toolbar/FlightModeMenuIndicator.qml +++ /dev/null @@ -1,102 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2022 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -import QtQuick 2.11 -import QtQuick.Layouts 1.11 - -import QGroundControl 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.MultiVehicleManager 1.0 -import QGroundControl.ScreenTools 1.0 -import QGroundControl.Palette 1.0 - -Item { - id: _root - Layout.preferredWidth: rowLayout.width - - property real fontPointSize: ScreenTools.largeFontPointSize - property var activeVehicle: QGroundControl.multiVehicleManager.activeVehicle - - Component { - id: flightModeMenu - - Rectangle { - width: flickable.width + (ScreenTools.defaultFontPixelWidth * 2) - height: flickable.height + (ScreenTools.defaultFontPixelWidth * 2) - radius: ScreenTools.defaultFontPixelHeight * 0.5 - color: qgcPal.window - border.color: qgcPal.text - - QGCFlickable { - id: flickable - anchors.margins: ScreenTools.defaultFontPixelWidth - anchors.top: parent.top - anchors.left: parent.left - width: mainLayout.width - height: _fullWindowHeight <= mainLayout.height ? _fullWindowHeight : mainLayout.height - flickableDirection: Flickable.VerticalFlick - contentHeight: mainLayout.height - contentWidth: mainLayout.width - - property real _fullWindowHeight: mainWindow.contentItem.height - (indicatorPopup.padding * 2) - (ScreenTools.defaultFontPixelWidth * 2) - - ColumnLayout { - id: mainLayout - spacing: ScreenTools.defaultFontPixelWidth / 2 - - Repeater { - model: activeVehicle ? activeVehicle.flightModes : [] - - QGCButton { - text: modelData - Layout.fillWidth: true - onClicked: { - activeVehicle.flightMode = text - mainWindow.hideIndicatorPopup() - } - } - } - } - } - } - } - - RowLayout { - id: rowLayout - spacing: 0 - height: parent.height - - QGCColoredImage { - id: flightModeIcon - width: ScreenTools.defaultFontPixelWidth * 2 - height: ScreenTools.defaultFontPixelHeight * 0.75 - fillMode: Image.PreserveAspectFit - mipmap: true - color: qgcPal.text - source: "/qmlimages/FlightModesComponentIcon.png" - Layout.alignment: Qt.AlignVCenter - } - - Item { - Layout.preferredWidth: ScreenTools.defaultFontPixelWidth / 2 - height: 1 - } - - QGCLabel { - text: activeVehicle ? activeVehicle.flightMode : qsTr("N/A", "No data to display") - font.pointSize: fontPointSize - Layout.alignment: Qt.AlignVCenter - } - } - - QGCMouseArea { - anchors.fill: parent - onClicked: mainWindow.showIndicatorPopup(_root, flightModeMenu) - } -} diff --git a/src/ui/toolbar/GPSRTKIndicator.qml b/src/ui/toolbar/GPSRTKIndicator.qml index 5af5598..4ff4f74 100644 --- a/src/ui/toolbar/GPSRTKIndicator.qml +++ b/src/ui/toolbar/GPSRTKIndicator.qml @@ -23,7 +23,7 @@ Item { anchors.top: parent.top anchors.bottom: parent.bottom - property bool showIndicator: QGroundControl.gpsRtk ? QGroundControl.gpsRtk.connected.value : false + property bool showIndicator: QGroundControl.gpsRtk.connected.value Component { id: gpsInfo diff --git a/src/ui/toolbar/Images/RidEmergencyBackground.svg b/src/ui/toolbar/Images/RidEmergencyBackground.svg deleted file mode 100644 index b1fa258..0000000 --- a/src/ui/toolbar/Images/RidEmergencyBackground.svg +++ /dev/null @@ -1 +0,0 @@ -RID_EMERGENCY_BACKGROUND_SVG \ No newline at end of file diff --git a/src/ui/toolbar/Images/RidEmergencyBackgroundHighlight.svg b/src/ui/toolbar/Images/RidEmergencyBackgroundHighlight.svg deleted file mode 100644 index 634a7aa..0000000 --- a/src/ui/toolbar/Images/RidEmergencyBackgroundHighlight.svg +++ /dev/null @@ -1 +0,0 @@ -RID_EMERGENCY_BACKGROUND_HIGHLIGHT_SVG \ No newline at end of file diff --git a/src/ui/toolbar/Images/RidFlagBackgroundGreen.svg b/src/ui/toolbar/Images/RidFlagBackgroundGreen.svg deleted file mode 100644 index b0a11b2..0000000 --- a/src/ui/toolbar/Images/RidFlagBackgroundGreen.svg +++ /dev/null @@ -1 +0,0 @@ -RID_FLAG_BACKGROUND_GREEN_SVG \ No newline at end of file diff --git a/src/ui/toolbar/Images/RidFlagBackgroundRed.svg b/src/ui/toolbar/Images/RidFlagBackgroundRed.svg deleted file mode 100644 index b8e72be..0000000 --- a/src/ui/toolbar/Images/RidFlagBackgroundRed.svg +++ /dev/null @@ -1 +0,0 @@ -RID_FLAG_BACKGROUND_RED_SVG \ No newline at end of file diff --git a/src/ui/toolbar/Images/RidIconGreen.svg b/src/ui/toolbar/Images/RidIconGreen.svg deleted file mode 100644 index 741e0f7..0000000 --- a/src/ui/toolbar/Images/RidIconGreen.svg +++ /dev/null @@ -1 +0,0 @@ -RID_ICON_GREEN_SVG \ No newline at end of file diff --git a/src/ui/toolbar/Images/RidIconGrey.svg b/src/ui/toolbar/Images/RidIconGrey.svg deleted file mode 100644 index f0fe62e..0000000 --- a/src/ui/toolbar/Images/RidIconGrey.svg +++ /dev/null @@ -1 +0,0 @@ -RID_ICON_GREY_SVG \ No newline at end of file diff --git a/src/ui/toolbar/Images/RidIconRed.svg b/src/ui/toolbar/Images/RidIconRed.svg deleted file mode 100644 index 4c8b717..0000000 --- a/src/ui/toolbar/Images/RidIconRed.svg +++ /dev/null @@ -1 +0,0 @@ -REID_ICON_RED_SVG \ No newline at end of file diff --git a/src/ui/toolbar/Images/RidIconYellow.svg b/src/ui/toolbar/Images/RidIconYellow.svg deleted file mode 100644 index fcc5f35..0000000 --- a/src/ui/toolbar/Images/RidIconYellow.svg +++ /dev/null @@ -1 +0,0 @@ -RID_ICON_YELLOW_SVG \ No newline at end of file diff --git a/src/ui/toolbar/MainStatusIndicator.qml b/src/ui/toolbar/MainStatusIndicator.qml index 1e2ff5f..67fbd81 100644 --- a/src/ui/toolbar/MainStatusIndicator.qml +++ b/src/ui/toolbar/MainStatusIndicator.qml @@ -15,7 +15,6 @@ import QGroundControl.Controls 1.0 import QGroundControl.MultiVehicleManager 1.0 import QGroundControl.ScreenTools 1.0 import QGroundControl.Palette 1.0 -import QGroundControl.FactSystem 1.0 RowLayout { id: _root @@ -27,7 +26,6 @@ RowLayout { property bool _armed: _activeVehicle ? _activeVehicle.armed : false property real _margins: ScreenTools.defaultFontPixelWidth property real _spacing: ScreenTools.defaultFontPixelWidth / 2 - property bool _healthAndArmingChecksSupported: _activeVehicle ? _activeVehicle.healthAndArmingCheckReport.supported : false QGCLabel { id: mainStatusLabel @@ -51,17 +49,6 @@ RowLayout { } if (_activeVehicle.armed) { _mainStatusBGColor = "green" - - if (_healthAndArmingChecksSupported) { - if (_activeVehicle.healthAndArmingCheckReport.canArm) { - if (_activeVehicle.healthAndArmingCheckReport.hasWarningsOrErrors) { - _mainStatusBGColor = "yellow" - } - } else { - _mainStatusBGColor = "red" - } - } - if (_activeVehicle.flying) { return mainStatusLabel._flyingText } else if (_activeVehicle.landing) { @@ -70,19 +57,7 @@ RowLayout { return mainStatusLabel._armedText } } else { - if (_healthAndArmingChecksSupported) { - if (_activeVehicle.healthAndArmingCheckReport.canArm) { - if (_activeVehicle.healthAndArmingCheckReport.hasWarningsOrErrors) { - _mainStatusBGColor = "yellow" - } else { - _mainStatusBGColor = "green" - } - return mainStatusLabel._readyToFlyText - } else { - _mainStatusBGColor = "red" - return mainStatusLabel._notReadyToFlyText - } - } else if (_activeVehicle.readyToFlyAvailable) { + if (_activeVehicle.readyToFlyAvailable) { if (_activeVehicle.readyToFly) { _mainStatusBGColor = "green" return mainStatusLabel._readyToFlyText @@ -107,7 +82,7 @@ RowLayout { } } - QGCMouseArea { + MouseArea { anchors.left: parent.left anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter @@ -122,10 +97,29 @@ RowLayout { height: 1 } - FlightModeMenuIndicator { + QGCColoredImage { + id: flightModeIcon + width: ScreenTools.defaultFontPixelWidth * 2 + height: ScreenTools.defaultFontPixelHeight * 0.75 + fillMode: Image.PreserveAspectFit + mipmap: true + color: qgcPal.text + source: "/qmlimages/FlightModesComponentIcon.png" + visible: flightModeMenu.visible + } + + Item { + Layout.preferredWidth: ScreenTools.defaultFontPixelWidth / 2 + height: 1 + visible: flightModeMenu.visible + } + + FlightModeMenu { id: flightModeMenu Layout.preferredHeight: _root.height - fontPointSize: _vehicleInAir ? ScreenTools.largeFontPointSize : ScreenTools.defaultFontPointSize + verticalAlignment: Text.AlignVCenter + font.pointSize: _vehicleInAir ? ScreenTools.largeFontPointSize : ScreenTools.defaultFontPointSize + mouseAreaLeftMargin: -(flightModeMenu.x - flightModeIcon.x) visible: _activeVehicle } @@ -175,10 +169,7 @@ RowLayout { spacing: _spacing QGCButton { - Layout.leftMargin: _healthAndArmingChecksSupported ? width / 2 : 0 - Layout.alignment: _healthAndArmingChecksSupported ? Qt.AlignLeft : Qt.AlignHCenter - // FIXME: forceArm is not possible anymore if _healthAndArmingChecksSupported == true - enabled: _armed || !_healthAndArmingChecksSupported || _activeVehicle.healthAndArmingCheckReport.canArm + Layout.alignment: Qt.AlignHCenter text: _armed ? qsTr("Disarm") : (forceArm ? qsTr("Force Arm") : qsTr("Arm")) property bool forceArm: false @@ -203,7 +194,6 @@ RowLayout { QGCLabel { Layout.alignment: Qt.AlignHCenter text: qsTr("Sensor Status") - visible: !_healthAndArmingChecksSupported } GridLayout { @@ -211,7 +201,6 @@ RowLayout { columnSpacing: _spacing rows: _activeVehicle.sysStatusSensorInfo.sensorNames.length flow: GridLayout.TopToBottom - visible: !_healthAndArmingChecksSupported Repeater { model: _activeVehicle.sysStatusSensorInfo.sensorNames @@ -229,126 +218,6 @@ RowLayout { } } } - - - QGCLabel { - text: qsTr("Arming Check Report:") - visible: _healthAndArmingChecksSupported && _activeVehicle.healthAndArmingCheckReport.problemsForCurrentMode.count > 0 - } - // List health and arming checks - QGCListView { - visible: _healthAndArmingChecksSupported - anchors.margins: ScreenTools.defaultFontPixelHeight - spacing: ScreenTools.defaultFontPixelWidth - width: mainWindow.width * 0.66666 - height: contentHeight - model: _activeVehicle ? _activeVehicle.healthAndArmingCheckReport.problemsForCurrentMode : null - delegate: listdelegate - } - - FactPanelController { - id: controller - } - - Component { - id: listdelegate - - Column { - width: parent ? parent.width : 0 - Row { - width: parent.width - QGCLabel { - id: message - text: object.message - wrapMode: Text.WordWrap - textFormat: TextEdit.RichText - width: parent.width - arrowDownIndicator.width - color: object.severity == 'error' ? qgcPal.colorRed : object.severity == 'warning' ? qgcPal.colorOrange : qgcPal.text - MouseArea { - anchors.fill: parent - onClicked: { - if (object.description != "") - object.expanded = !object.expanded - } - } - } - - QGCColoredImage { - id: arrowDownIndicator - height: 1.5 * ScreenTools.defaultFontPixelWidth - width: height - source: "/qmlimages/arrow-down.png" - color: qgcPal.text - visible: object.description != "" - MouseArea { - anchors.fill: parent - onClicked: object.expanded = !object.expanded - } - } - } - Rectangle { - property var margin: ScreenTools.defaultFontPixelWidth - id: descriptionRect - width: parent.width - height: description.height + margin - color: qgcPal.windowShade - visible: false - Connections { - target: object - function onExpandedChanged() { - if (object.expanded) { - description.height = description.preferredHeight - } else { - description.height = 0 - } - } - } - - Behavior on height { - NumberAnimation { - id: animation - duration: 150 - onRunningChanged: { - descriptionRect.visible = animation.running || object.expanded - } - } - } - QGCLabel { - id: description - anchors.centerIn: parent - width: parent.width - parent.margin * 2 - height: 0 - text: object.description - textFormat: TextEdit.RichText - wrapMode: Text.WordWrap - clip: true - property var fact: null - onLinkActivated: { - if (link.startsWith('param://')) { - var paramName = link.substr(8); - fact = controller.getParameterFact(-1, paramName, true) - if (fact != null) { - paramEditorDialogComponent.createObject(mainWindow).open() - } - } else { - Qt.openUrlExternally(link); - } - } - } - - Component { - id: paramEditorDialogComponent - - ParameterEditorDialog { - title: qsTr("Edit Parameter") - fact: description.fact - destroyOnClose: true - } - } - } - } - } - } } } diff --git a/src/ui/toolbar/MainToolBar.qml b/src/ui/toolbar/MainToolBar.qml index 9a183ff..d1069c2 100644 --- a/src/ui/toolbar/MainToolBar.qml +++ b/src/ui/toolbar/MainToolBar.qml @@ -33,12 +33,6 @@ Rectangle { property bool _communicationLost: _activeVehicle ? _activeVehicle.vehicleLinkManager.communicationLost : false property color _mainStatusBGColor: qgcPal.brandingPurple - function dropMessageIndicatorTool() { - if (currentToolbar === flyViewToolbar) { - indicatorLoader.item.dropMessageIndicatorTool(); - } - } - QGCPalette { id: qgcPal } /// Bottom single pixel divider diff --git a/src/ui/toolbar/MainToolBarIndicators.qml b/src/ui/toolbar/MainToolBarIndicators.qml index 7a384a4..1434244 100644 --- a/src/ui/toolbar/MainToolBarIndicators.qml +++ b/src/ui/toolbar/MainToolBarIndicators.qml @@ -24,10 +24,6 @@ Row { property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle property real _toolIndicatorMargins: ScreenTools.defaultFontPixelHeight * 0.66 - function dropMessageIndicatorTool() { - toolIndicatorsRepeater.dropMessageIndicatorTool(); - } - Repeater { id: appRepeater model: QGroundControl.corePlugin.toolBarIndicators @@ -40,18 +36,7 @@ Row { } Repeater { - id: toolIndicatorsRepeater - model: _activeVehicle ? _activeVehicle.toolIndicators : [] - - function dropMessageIndicatorTool() { - for (var i=0; i 0 && _activeVehicle.rcRSSI <= 100 : false diff --git a/src/ui/toolbar/RemoteIDIndicator.qml b/src/ui/toolbar/RemoteIDIndicator.qml deleted file mode 100644 index 26e29f6..0000000 --- a/src/ui/toolbar/RemoteIDIndicator.qml +++ /dev/null @@ -1,358 +0,0 @@ -/**************************************************************************** - * - * (c) 2009-2022 QGROUNDCONTROL PROJECT - * - * QGroundControl is licensed according to the terms in the file - * COPYING.md in the root of the source code directory. - * - ****************************************************************************/ - -import QtQuick 2.11 -import QtQuick.Layouts 1.11 - -import QGroundControl 1.0 -import QGroundControl.Controls 1.0 -import QGroundControl.MultiVehicleManager 1.0 -import QGroundControl.ScreenTools 1.0 -import QGroundControl.Palette 1.0 - -//------------------------------------------------------------------------- -//-- Remote ID Indicator -Item { - id: _root - width: remoteIDIcon.width * 1.1 - anchors.top: parent.top - anchors.bottom: parent.bottom - - property bool showIndicator: QGroundControl.settingsManager.remoteIDSettings.enable.value - - property var _activeVehicle: QGroundControl.multiVehicleManager.activeVehicle - property int remoteIDState: getRemoteIDState() - - property bool gpsFlag: _activeVehicle && _activeVehicle.remoteIDManager ? _activeVehicle.remoteIDManager.gcsGPSGood : false - property bool basicIDFlag: _activeVehicle && _activeVehicle.remoteIDManager ? _activeVehicle.remoteIDManager.basicIDGood : false - property bool armFlag: _activeVehicle && _activeVehicle.remoteIDManager ? _activeVehicle.remoteIDManager.armStatusGood : false - property bool commsFlag: _activeVehicle && _activeVehicle.remoteIDManager ? _activeVehicle.remoteIDManager.commsGood : false - property bool emergencyDeclared: _activeVehicle && _activeVehicle.remoteIDManager ? _activeVehicle.remoteIDManager.emergencyDeclared : false - property bool operatorIDFlag: _activeVehicle && _activeVehicle.remoteIDManager ? _activeVehicle.remoteIDManager.operatorIDGood : false - - property int _regionOperation: QGroundControl.settingsManager.remoteIDSettings.region.value - - // Flags visual properties - property real flagsWidth: ScreenTools.defaultFontPixelWidth * 10 - property real flagsHeight: ScreenTools.defaultFontPixelWidth * 5 - property int radiusFlags: 5 - - // Visual properties - property real _margins: ScreenTools.defaultFontPixelWidth - - enum RIDState { - HEALTHY, - WARNING, - ERROR, - UNAVAILABLE - } - - enum RegionOperation { - FAA, - EU - } - - function getRIDIcon() { - switch (remoteIDState) { - case RemoteIDIndicator.RIDState.HEALTHY: - return "/qmlimages/RidIconGreen.svg" - break - case RemoteIDIndicator.RIDState.WARNING: - return "/qmlimages/RidIconYellow.svg" - break - case RemoteIDIndicator.RIDState.ERROR: - return "/qmlimages/RidIconRed.svg" - break - case RemoteIDIndicator.RIDState.UNAVAILABLE: - return "/qmlimages/RidIconGrey.svg" - break - default: - return "/qmlimages/RidIconGrey.svg" - } - } - - function getRemoteIDState() { - if (!_activeVehicle) { - return RemoteIDIndicator.RIDState.UNAVAILABLE - } - // We need to have comms and arm healthy to even be in any other state other than ERROR - if (!commsFlag || !armFlag || emergencyDeclared) { - return RemoteIDIndicator.RIDState.ERROR - } - if (!gpsFlag || !basicIDFlag) { - return RemoteIDIndicator.RIDState.WARNING - } - if (_regionOperation == RemoteIDIndicator.RegionOperation.EU || QGroundControl.settingsManager.remoteIDSettings.sendOperatorID.value) { - if (!operatorIDFlag) { - return RemoteIDIndicator.RIDState.WARNING - } - } - return RemoteIDIndicator.RIDState.HEALTHY - } - - function goToSettings() { - if (!mainWindow.preventViewSwitch()) { - globals.commingFromRIDIndicator = true - mainWindow.showSettingsTool() - } - } - - Component { - id: remoteIDInfo - - Rectangle { - width: remoteIDCol.width + ScreenTools.defaultFontPixelWidth * 3 - height: remoteIDCol.height + ScreenTools.defaultFontPixelHeight * 2 + (emergencyButtonItem.visible ? emergencyButtonItem.height : 0) - radius: ScreenTools.defaultFontPixelHeight * 0.5 - color: qgcPal.window - border.color: qgcPal.text - - Column { - id: remoteIDCol - spacing: ScreenTools.defaultFontPixelHeight * 0.5 - width: Math.max(remoteIDGrid.width, remoteIDLabel.width) - anchors.margins: ScreenTools.defaultFontPixelHeight - anchors.top: parent.top - anchors.horizontalCenter: parent.horizontalCenter - - QGCLabel { - id: remoteIDLabel - text: qsTr("RemoteID Status") - font.family: ScreenTools.demiboldFontFamily - anchors.horizontalCenter: parent.horizontalCenter - } - - GridLayout { - id: remoteIDGrid - anchors.margins: ScreenTools.defaultFontPixelHeight - columnSpacing: ScreenTools.defaultFontPixelWidth - anchors.horizontalCenter: parent.horizontalCenter - columns: 2 - - Image { - id: armFlagImage - width: flagsWidth - height: flagsHeight - source: armFlag ? "/qmlimages/RidFlagBackgroundGreen.svg" : "/qmlimages/RidFlagBackgroundRed.svg" - fillMode: Image.PreserveAspectFit - sourceSize.height: height - visible: commsFlag - - QGCLabel { - anchors.fill: parent - text: qsTr("ARM STATUS") - wrapMode: Text.WordWrap - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - font.bold: true - font.pointSize: ScreenTools.smallFontPointSize - } - - QGCMouseArea { - anchors.fill: parent - onClicked: goToSettings() - } - } - - Image { - id: commsFlagImage - width: flagsWidth - height: flagsHeight - source: commsFlag ? "/qmlimages/RidFlagBackgroundGreen.svg" : "/qmlimages/RidFlagBackgroundRed.svg" - fillMode: Image.PreserveAspectFit - sourceSize.height: height - - QGCLabel { - anchors.fill: parent - text: commsFlag ? qsTr("RID COMMS") : qsTr("NOT CONNECTED") - wrapMode: Text.WordWrap - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - font.bold: true - font.pointSize: ScreenTools.smallFontPointSize - } - - QGCMouseArea { - anchors.fill: parent - onClicked: goToSettings() - } - } - - Image { - id: gpsFlagImage - width: flagsWidth - height: flagsHeight - source: gpsFlag ? "/qmlimages/RidFlagBackgroundGreen.svg" : "/qmlimages/RidFlagBackgroundRed.svg" - fillMode: Image.PreserveAspectFit - sourceSize.height: height - visible: commsFlag - - QGCLabel { - anchors.fill: parent - text: qsTr("GCS GPS") - wrapMode: Text.WordWrap - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - font.bold: true - font.pointSize: ScreenTools.smallFontPointSize - } - - QGCMouseArea { - anchors.fill: parent - onClicked: goToSettings() - } - } - - Image { - id: basicIDFlagIge - width: flagsWidth - height: flagsHeight - source: basicIDFlag ? "/qmlimages/RidFlagBackgroundGreen.svg" : "/qmlimages/RidFlagBackgroundRed.svg" - fillMode: Image.PreserveAspectFit - sourceSize.height: height - visible: commsFlag - - QGCLabel { - anchors.fill: parent - text: qsTr("BASIC ID") - wrapMode: Text.WordWrap - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - font.bold: true - font.pointSize: ScreenTools.smallFontPointSize - } - - QGCMouseArea { - anchors.fill: parent - onClicked: goToSettings() - } - } - - Image { - id: operatorIDFlagImage - width: flagsWidth - height: flagsHeight - source: operatorIDFlag ? "/qmlimages/RidFlagBackgroundGreen.svg" : "/qmlimages/RidFlagBackgroundRed.svg" - fillMode: Image.PreserveAspectFit - sourceSize.height: height - visible: commsFlag && _activeVehicle ? (QGroundControl.settingsManager.remoteIDSettings.sendOperatorID.value || _regionOperation == RemoteIDIndicator.RegionOperation.EU) : false - - QGCLabel { - anchors.fill: parent - text: qsTr("OPERATOR ID") - wrapMode: Text.WordWrap - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - font.bold: true - font.pointSize: ScreenTools.smallFontPointSize - } - - QGCMouseArea { - anchors.fill: parent - onClicked: goToSettings() - } - } - } - } - - Item { - id: emergencyButtonItem - anchors.top: remoteIDCol.bottom - anchors.left: parent.left - anchors.right: parent.right - height: emergencyDeclareLabel.height + emergencyButton.height + (_margins * 4) - visible: commsFlag - - QGCLabel { - id: emergencyDeclareLabel - text: emergencyDeclared ? qsTr("EMERGENCY HAS BEEN DECLARED, Press and Hold for 3 seconds to cancel") : qsTr("Press and Hold below button to declare emergency") - font.family: ScreenTools.demiboldFontFamily - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right - anchors.margins: _margins - anchors.topMargin: _margins * 3 - wrapMode: Text.WordWrap - horizontalAlignment: Text.AlignHCenter - visible: true - } - - Image { - id: emergencyButton - width: flagsWidth * 2 - height: flagsHeight * 1.5 - source: "/qmlimages/RidEmergencyBackground.svg" - sourceSize.height: height - anchors.horizontalCenter: parent.horizontalCenter - anchors.top: emergencyDeclareLabel.bottom - anchors.margins: _margins - visible: true - - QGCLabel { - anchors.fill: parent - text: emergencyDeclared ? qsTr("Clear Emergency") : qsTr("EMERGENCY") - wrapMode: Text.WordWrap - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - font.bold: true - font.pointSize: ScreenTools.largeFontPointSize - } - - Timer { - id: emergencyButtonTimer - interval: 350 - onTriggered: { - if (emergencyButton.source == "/qmlimages/RidEmergencyBackgroundHighlight.svg" ) { - emergencyButton.source = "/qmlimages/RidEmergencyBackground.svg" - } else { - emergencyButton.source = "/qmlimages/RidEmergencyBackgroundHighlight.svg" - } - } - } - - MouseArea { - anchors.fill: parent - hoverEnabled: true - onEntered: emergencyButton.source = "/qmlimages/RidEmergencyBackgroundHighlight.svg" - onExited: emergencyButton.source = "/qmlimages/RidEmergencyBackground.svg" - pressAndHoldInterval: emergencyDeclared ? 3000 : 800 - onPressAndHold: { - if (emergencyButton.source == "/qmlimages/RidEmergencyBackgroundHighlight.svg" ) { - emergencyButton.source = "/qmlimages/RidEmergencyBackground.svg" - } else { - emergencyButton.source = "/qmlimages/RidEmergencyBackgroundHighlight.svg" - } - emergencyButtonTimer.restart() - if (_activeVehicle) { - _activeVehicle.remoteIDManager.setEmergency(!emergencyDeclared) - } - } - } - } - } - } - } - - Image { - id: remoteIDIcon - width: height - anchors.top: parent.top - anchors.bottom: parent.bottom - source: getRIDIcon() - fillMode: Image.PreserveAspectFit - sourceSize.height: height - } - - MouseArea { - anchors.fill: parent - onClicked: { - mainWindow.showIndicatorPopup(_root, remoteIDInfo) - } - } -} diff --git a/translations/qgc_json_zh_CN.ts b/translations/qgc_json_zh_CN.ts index fae275b..26ae498 100644 --- a/translations/qgc_json_zh_CN.ts +++ b/translations/qgc_json_zh_CN.ts @@ -595,7 +595,7 @@ .mavCmdInfo[MAV_CMD_NAV_PATHPLANNING].param2.label, Full planning - 全面规划 + 本地规划 .mavCmdInfo[MAV_CMD_NAV_PATHPLANNING].param2.enumStrings, @@ -625,7 +625,7 @@ .mavCmdInfo[MAV_CMD_NAV_ALTITUDE_WAIT].friendlyName, Altitude wait - 高度等待 + 高度差 .mavCmdInfo[MAV_CMD_NAV_VTOL_TAKEOFF].friendlyName, @@ -1435,7 +1435,7 @@ .mavCmdInfo[MAV_CMD_DO_GRIPPER].param1.label, Gripper id - 夹持器 id + 夹持器 .mavCmdInfo[MAV_CMD_DO_GRIPPER].param2.label, diff --git a/translations/qgc_source_tr_TR.ts b/translations/qgc_source_tr_TR.ts index 00b2006..4c33eaa 100644 --- a/translations/qgc_source_tr_TR.ts +++ b/translations/qgc_source_tr_TR.ts @@ -510,85 +510,85 @@ Flight mode channel: - Uçuş modu kanalı: + Flight mode channel: Not assigned - Atanmamış + Not assigned Channel 1 - Kanal 1 + Channel 1 Channel 2 - Kanal 2 + Channel 2 Channel 3 - Kanal 3 + Channel 3 Channel 4 - Kanal 4 + Channel 4 Channel 5 - Kanal 5 + Channel 5 Channel 6 - Kanal 6 + Channel 6 Channel 7 - Kanal 7 + Channel 7 Channel 8 - Kanal 8 + Channel 8 Flight Mode - Uçuş Modu + Flight Mode Simple - Basit + Simple Super-Simple - Ultra Basit (Super-Simple) + Super-Simple Simple Mode - Basit Mod + Simple Mode @@ -600,12 +600,12 @@ Channel option %1 : - Kanal seçeneği %1: + Channel option %1 : Flight Modes - Uçuş Modları + Flight Modes @@ -618,7 +618,7 @@ Off - Kapalı + Off @@ -753,19 +753,19 @@ Angle - Açı + Angle Distance - Mesafe + Distance Height - Yükseklik + Height diff --git a/translations/qgc_source_zh_CN.ts b/translations/qgc_source_zh_CN.ts index 33fcfb8..0575d82 100644 --- a/translations/qgc_source_zh_CN.ts +++ b/translations/qgc_source_zh_CN.ts @@ -4851,7 +4851,7 @@ Click Ok to start the auto-tuning process. Yaw - 偏航 + 水平 @@ -8263,7 +8263,7 @@ Click Ok to start the auto-tuning process. Toggle Arm - 切换锁定 + 拨杆解锁 @@ -10559,7 +10559,7 @@ Click Ok to start the auto-tuning process. Connected to Vehicle %1 - 已连接到载具 %1 + 已连接到飞机 %1